2011-09-27 93 views
0
function check_username(){ 
    $.ajax({ 
     type: "POST", 
     dataType: 'json', 
     url: "/ajax/check/username.html", 
     data: "via=ajax&username="+$('input[name=register_username]').val(), 
     success: function(msg){ 
      if(msg.response==false){ 
       register_username.parent().css('background-color','#db2e24'); 
       register_username.parent().parent().find('td:last-child').text(msg.message); 
       register_username.focus(); 
       return false; 
      } else { 
       register_username.parent().css('background-color','#fff'); 
       register_username.parent().parent().find('td:last-child').text(""); 
       return true; 
      } 
     } 
    }); 
} 

如果我的英語不好,我很抱歉 - 英語不是我的母語。 回到主題,爲什麼上面的函數總是返回false? 供參考:JSON是好的爲什麼我的jQuery AJAX函數總是返回false?

+1

,因爲它返回'undefined'(沒有),這是falsey – Linsey

+1

你確定它沒有返回'undefined'? 'check_username()'函數沒有return語句,所以它會返回undefined。您在成功處理函數中的返回語句是_that_函數,而不是'check_username()'。 – nnnnnn

+0

它實際上從Ajax調用返回reponseText,你得到的函數參數是錯誤的。 – b01

回答

4

check_username調用一個ajax函數,它啓動一個網絡操作,然後立即返回。 check_username在ajax調用完成並且成功處理程序被調用之前返回。因此,成功處理程序與check_username返回的值無關。

由於在check_username函數本身沒有返回值(僅在嵌入式成功處理函數),check_username回報undefined這是一個falsey值,因此你認爲它總是返回false。

如果你想用成功處理程序的返回值做一些事情,那麼你必須在成功處理程序本身中操作,或者你必須從成功處理程序中調用另一個函數。這就是異步操作的工作方式。

從成功處理函數返回truefalse什麼都不做。成功處理程序由ajax處理代碼的內部調用,並從成功處理程序返回,然後進入ajax內部的內部。成功處理程序的返回值不會以任何方式使用。

+0

那麼,我如何將成功處理程序的語句傳遞給check_username()? –

+0

你不能。當成功處理程序被調用時,「check_username」已經完成。無論您想要如何處理返回的數據,您都可以在成功處理程序中執行操作,也可以調用其他函數並將其傳遞給ajax數據。 – jfriend00

0

問題是邏輯條件msg.response == false ..這總是計算爲false,響應不是布爾值。您需要檢查響應狀態。

+0

響應是布爾值,我使用json_encode(array(「response」=> true));否則在php –

+1

這是不正確的;該函數將在ajax調用返回之前返回。 –

0

如果我不得不猜測,你發佈,並且返回的響應是一個JSON對象。但它看起來像你只是檢查,看看你是否得到了有效的答覆。爲什麼不試試這樣說:

試試這個:

function check_username() 
     { 
      $.ajax({ 
       type: "POST", 
       dataType: 'json', 
       url: "/ajax/check/username.html", 
       data: "via=ajax&username="+$('input[name=register_username]').val(), 
       success: function(msg, textStatus) 
       { 
        if (textStatus == "success") 
        { 
         register_username.parent().css('background-color','#db2e24'); 
         register_username.parent().parent().find('td:last-child').text(msg.message); 
         register_username.focus(); 
         return false; 
        } else { 
         register_username.parent().css('background-color','#fff'); 
         register_username.parent().parent().find('td:last-child').text(""); 
         return true; 
        } 
       }, 
       error: function(jqXHR, textStatus, errorThrown) 
       { 
        if (textStatus == "parsererror") 
        { 
         alert("There is an error in your JSON object"); 
        } 
       } 
      }); 
     } 

你可以有另外一個問題是,你沒有返回有效的JSON,其中jQuery將檢查。添加錯誤將有助於揭示這是否確實如此。

現場演示http://jsfiddle.net/khalifah/4q3EJ/

+0

200是標題,是不是? –

+2

這個答案是*錯誤*,因爲成功函數是異步調用的。 - 成功函數由Ajax機器調用,它不是包含check_username函數的堆棧/調用線程的一部分。您可以將ajax調用更改爲同步,但這會是一個非常差勁的用戶體驗。 –

+0

什麼也沒有發生T_T –