$(document).ready(function(){
//global vars
var name = $("#username");
var email = $("#email");
function usernameExists() {
$.get("register.php",{ check: 1, username: name.val(), email: email.val() } ,function(m) {
if(m==1) {
return false;
} else {
return true;
}
});
}
});
Firebug在调用此函数时显示正确的响应,但它不返回任何内容......(此$ .get(...)函数已在函数usernameExists()之外进行了测试,但没有返回,并且它完美地运行)。
问题是什么以及如何解决?
$(document).ready(function(){
//global vars
var form = $("#register");
var name = $("#username");
var email = $("#email");
$.get("register.php",
{ check: 1, username: name.val(), email: email.val() },
// Have this callback take care of the rest of the submit()
function(m) {
if(m==1) {
form.submit(function(){ return false; });
} else {
form.submit(function(){
if(validateName() & validateEmail() & validatePass1() & validatePass2())
return true
else
return false;
});
}
}
);
function validateName(){
// some check here
}
// and other functions
});
答案 0 :(得分:8)
您正在呼叫的功能不会返回任何内容。
即使它确实尝试从$.get()
返回响应,它也不会起作用,因为调用是异步的,所以在收到响应时,无论使用返回值的代码是什么可能已经执行了。
您需要做的是在$.get()
回调中调用您的代码。
function usernameExists() {
$.get("register.php",{ check: 1, username: name.val(), email: email.val() } ,function(m) {
someOtherFunction(m==1);
});
}
function someOtherFunction(parameter) {
// The parameter will be true or false
// depending on the value of m==1
}
根据您的评论更新。
将$.get()
带入submit()
可能更好,但要坚持原来的想法,这就是它的外观。
form.submit(function(){
// After usernameExists() is called, we need to hand off
// the rest of the execution to that function since
// this one will be done executing before the get()
// response is received
usernameExists();
return false;
});
function usernameExists() {
$.get("register.php",
{ check: 1, username: name.val(), email: email.val() },
// Have this callback take care of the rest of the submit()
function(m) {
if(m==1) {
// do something if true
} else {
// do something if false
}
}
);
}
同步与异步javascript的欢乐解释
Javascript代码通常是同步执行的。这只是意味着它一次执行一行,或者一行必须在下一行可以触发之前完成执行。
var greeting = "hi there"; // set the greeting variable
alert( greeting ); // the alert won't fire,
// until the previous line finished successfully
这使事情变得非常好和可预测。但该规则有一些例外。一个值得注意的例外是AJAX调用。
您的$.get()
是AJAX调用的示例。 AJAX中的“A”代表异步,这意味着它不会阻止下一行代码执行。
分支是当你执行$.get()
时需要(例如)1秒才能完成,$.get()
之后的任何代码早在$.get()
完成之后就已经完成了已收到回复。
采用之前的greeting
示例,但这次使用的是AJAX。
var greeting; // will hold the response from our AJAX call
$.get('some/path/to/data.php',
function( m ) {
greeting = m; // populate the greeting variable with the data returned
}
);
alert( greeting ); // Will alert "undefined" instead of the data that was returned
// because the $.get() code above is asynchronous, which allows
// the code below it (the alert in this case) to continue
// executing.
正如您所看到的,alert( greeting )
在收到$.get()
响应之前很久就会执行,因为$.get()
是异步的,并且不会暂停执行链等待它的数据。
要解决此问题,您可以将alert()
放在<{1}}的回调中,以便在收到回复之前它不会运行。
$.get()
结果是,在您的代码中,一旦您致电var greeting; // will hold the response from our AJAX call
$.get('some/path/to/data.php',
function( m ) {
greeting = m; // populate the greeting variable with the data returned
alert( greeting ); // Now the alert will give the expected result
// because it is in the callback.
}
);
,任何依赖于收到的响应的剩余代码都应该在里面回调。
将代码放在外部回调的唯一方法是将它放在自己的函数中,该函数从里面调用回调(就像我原来的那样)回答)。
代码应如何运作的基本布局:
请注意,您不一定需要$.get()
的单独功能。您可以将所有代码放在usernameExists()
submit()