jQuery get函数返回true / false

时间:2010-06-23 20:47:36

标签: jquery

$(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

});

1 个答案:

答案 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()

http://api.jquery.com/jquery.post/