使用javascript从主函数内的子函数返回值

使用javascript从主函数内的子函数返回值,javascript,jquery,Javascript,Jquery,我不知道我是否用那块瓷砖把自己说清楚了,我觉得这很混乱,但让我解释一下。 所以我有js代码: function validateUserLogin() { 'use strict'; var xmlhttp, url = '../controller.php?action=validatelogin', email = document.getElementById('email').value, password = document.getElementById('passw

我不知道我是否用那块瓷砖把自己说清楚了,我觉得这很混乱,但让我解释一下。 所以我有js代码:

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个if中的一个变量返回到validateUserLogin,然后将true或false返回到登录表单。这可能吗?

只需使用先前声明的var?存放在这里

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

我用load listener替换了你的.onreadystatechange,在这个小提琴上对我有用: 名为的PHP文件只返回“Error1”

var xmlhttp;

function validateUserLogin() {
  'use strict';
  var stored;
  var url = 'https://zenoo.fr/testAjax.php',
  email = 'test@test.tes',
  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();

@Zenoo answer不起作用,因为您不能:Ajax是异步的,这意味着当您到达最后一行//我希望它在那里时,浏览器可能还没有发送Ajax请求


您可以传递回调函数,这是不可能的,因为HttpRequest是异步的。这意味着您的函数在返回值之前不会等待请求完成

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

如果是这样,那么我建议您使用事件侦听器

例:


您可以使用.open中的第二个参数来获取同步调用:xmlhttp.open'POST',url,false;仍然未定义.打开和.发送函数。尝试将.open函数设置为false。即使可以,@John正在以异步方式实现它是的@John,我的意思是一个要传递给onreadystatechange的回调函数。很高兴我能提供帮助。
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();
});