2017-05-28 78 views
0

我不知道我是否用自己的图块让自己清楚,我认为它很混乱,但让我解释一下。 所以我有一个js代码:使用javascript从主函数内部返回一个子函数的值

function validateUserLogin() { 
    'use strict'; 
    var xmlhttp, url = '../controller.php?action=validatelogin', 
    email = document.getElementById('email').value, 
    password = document.getElementById('password').value; 
    if (window.XMLHttpRequest) { 
     xmlhttp = new XMLHttpRequest(); 
    } else if (window.ActiveXObject) { 
     xmlhttp = new ActiveXObject('Microsoft.XMLHTTP'); 
    } else { 
     alert('Your browser does not support XMLHTTP!'); 
    } 
    xmlhttp.open('POST', url, true); 
    xmlhttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); 
    xmlhttp.send('email=' + email + '&password=' + password); 
    xmlhttp.onreadystatechange = function() { 
     if (xmlhttp.readyState === 4 && xmlhttp.status === 200) { 
      if (xmlhttp.responseText === 'Error1') { 
       $('#email').css('border', '1px solid red'); 
       //A value to return 
      } 
      if (xmlhttp.responseText === 'Error2') { 
       $('#email').css('border', '1px solid green'); 
       $('#password').css('border', '1px solid red'); 
       //A value to return 
      } 
     } 
    }; 
    //I want it here 
} 

在上面的代码我有,当他尝试登录发送Ajax请求验证用户的功能。在服务器端脚本中,当电子邮件或密码不正确时,我会回显一条消息,并将输入的边框颜色更改为绿色或红色。到现在为止还挺好。我想要的只是将2个ifs中的变量从子函数中返回给validateUserLogin,然后向登录表单返回true或false。这甚至有可能吗?

回答

0

只需使用先前声明的var? (stored此处)

您可以使用xmlhttp.open('POST', url, false);作为同步请求发送。

我用一个加载监听器代替了你的.onreadystatechange,为我在这个小提琴上工作:https://jsfiddle.net/1ma3svcd/ 被调用的PHP文件只是返回'Error1'。

var xmlhttp; 

function validateUserLogin() { 
    'use strict'; 
    var stored; 
    var url = 'https://zenoo.fr/testAjax.php', 
    email = '[email protected]', 
    password = 'testMe'; 
    if (window.XMLHttpRequest) { 
     xmlhttp = new XMLHttpRequest(); 
    } else if (window.ActiveXObject) { 
     xmlhttp = new ActiveXObject('Microsoft.XMLHTTP'); 
    } else { 
     alert('Your browser does not support XMLHTTP!'); 
    } 

    xmlhttp.addEventListener("load", transferComplete, false); 
    xmlhttp.open('POST', url, false); 
    xmlhttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); 
    xmlhttp.send('email=' + email + '&password=' + password); 
} 

function transferComplete(){ 
     if (xmlhttp.responseText === 'Error1') { 
     $('#email').css('border', '1px solid red'); 
     stored=true; 
     } 
     if (xmlhttp.responseText === 'Error2') { 
     $('#email').css('border', '1px solid green'); 
     $('#password').css('border', '1px solid red'); 
     stored=false; 
     } 

     console.log(stored); 
} 


validateUserLogin(); 
+0

您可以使用第二个参数的。开以获得同步调用:'XMLHTTP。打开('POST',url,false);' – Zenoo

+0

仍未定义 –

+0

我混淆了.open和.send函数。尝试使用.open()函数设置false。 – Zenoo

-1

@Zenoo回答没有,因为你不能工作:阿贾克斯是异步的,也就是说,当你在最后一行(“//我希望它有”)到达浏览器可能尚未发送Ajax请求。

你可以传递一个回调函数

+0

来吧伙计,你可以让一个AJAX调用同步... – Zenoo

+0

即使你可以,@John是以异步方式实现它 – bennes

+0

是的@John,我的意思是一个回调函数传递给onreadystatechange – bennes

0

这是不可能的,因为HttpRequest的是异步。这意味着你的函数在返回一个值之前不会等待请求完成。

我不知道你想在这里实现什么,但我怀疑在表单的onsubmit处理程序中正在使用方法validateUserLogin()

如果是这样的话,那么我会建议你使用某个事件侦听器,而不是

例如:

var form = document.getElementById('login-form'); 
form.addEventListener('submit', function(e){ 
    // Prevent form from loading the page (submit) 
    e.preventDefault(); 

    // Then call your function here 
    // If user was logged in without errors, 
    // You can use in your function "window.location.href = 'http://mywebapp.dev/dashboard'" 
    validateLogin(); 
}); 
+0

很高兴我可以的帮助。 –

相关问题