使用javascript从主函数内的子函数返回值
我不知道我是否用那块瓷砖把自己说清楚了,我觉得这很混乱,但让我解释一下。 所以我有js代码:使用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
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();
});