2012-01-01 61 views
2

我有一個表單,當我的用戶點擊「提交」時,我首先要檢查他們選擇的用戶名是否已被使用。我用ajax這個:ajax調用不等待

function submit() { 
    if (userNameTaken()) { 
     alert("Please choose a username that is not already in use."); 
     return false; 
    } 
} 

function userNameTaken() { 
    var taken = false; 
    var username = $("#username").val(); 
    $.get("username_used.cgi", { "username": username }, function(data) { 
     taken = data > 0; 
    }); 
    return taken; 
} 

所以我知道這是採取了用戶名時,該功能userNameTaken()並返回true。

不管怎樣,表單幾乎可以保存,就好像javascript不會暫停並等待這個ajax調用完成,而是繼續繼續並評估。有關如何解決這個問題的任何想法,以便我的表單將等待這個Ajax調用,而不是提交?

回答

-1

因爲Ajax在正常的自頂向下過程中不會執行。提交不會等待Ajax響應。您可以使用normal button而不是submit button,以便您可以手動提交表單。

<form ... > 
// other parts 

<input type="button" value="sumbit" onclick="userNameTaken();"/> 
</form> 

變化的代碼

所以它會檢查Ajax響應比提交表單,如果不採取其他的USENAME示警戒。你可以把一些id到按鈕和窗體來處理它很容易使用jquery ..

+0

如果用戶只是輸入任何輸入字段,表單將很高興地提交繞過驗證。 – 2012-01-01 03:20:54

+0

您應該意識到,除IE以外的任何瀏覽器中,無需提交按鈕即可提交作品。嘗試一下http://jsfiddle.net/liho1eye/cdwqs/。答案是相關的,但嚴重缺陷。永遠不要將提交操作掛在按鈕上。請參閱關於您發佈的鏈接中明顯和危險錯誤答案的部分。 – 2012-01-01 07:37:55

+0

:P謝謝你,但是這個事件可以通過使用keyup和preventDefault輕鬆避免。此外,沒關係,因爲你可以看到答案對OP是正確的和有幫助的。 – 2012-01-01 08:45:26

2

您不能像這樣從Ajax調用中返回數據:Ajax調用在任意未來時間返回,而userNameTaken()的調用在Ajax請求完成之前立即返回(實質上)立即返回。

您可能會使呼叫同步,從而有可能導致瀏覽器UI停滯。國際海事組織這不是首選。

或者,只允許提交該名稱是否未使用:使用回調函數來設置一個「OK」標誌,或啓用提交按鈕,或彈出警報,還是......

FWIW,我查找彈出式快訊提交非常容易破壞性和反向平順的用戶體驗。

1

您需要將Ajax調用的「異步」設置設置爲「false」。這將強制該函數阻塞,直到調用返回。

以下是JQuery文檔的鏈接。檢查「異步」設置: http://api.jquery.com/jQuery.ajax/

+0

@srchulo - 你應該知道,如果你設置'async:false',瀏覽器將凍結的Ajax調用的持續時間,並沒有反應。這不是建議的做法。推薦的做法是更改您的代碼以僅在成功處理程序中處理ajax調用的結果。這需要重新考慮代碼流的工作方式,但如果做得對,則可以提供更好的用戶體驗。 – jfriend00 2012-01-01 03:51:12

+0

我試圖只有這樣的事情..但有人不喜歡和下來投票。我覺得可以這樣做,請看看我的答案並給出你的看法。 – 2012-01-01 04:40:35