在你的代碼中看到Sleep()
的調用,以及你對alert()
的評論,我會說你的問題是對Ajax代碼的工作方式缺乏瞭解。
當您創建一個Ajax調用時,它被異步調用。這意味着進行了調用,然後當前函數的其餘部分繼續運行而不停止等待ajax代碼運行。
ajax success
函數將被最終調用,但只有當http請求完成時纔會被調用。 與此同時,您當前的功能將繼續運行。
這裏的要點是,如果您在執行ajax調用後運行的相同函數中具有代碼,則不能依賴於給定的事件序列。
把Sleep()
可能會使它看起來工作,因爲一些瀏覽器可能會看到睡眠時間作爲運行ajax成功函數的機會,所以你的代碼似乎運行在正確的順序。把一個alert()
更有可能使它工作,因爲alert()
通常需要更多的時間才能被清除,所以ajax函數有更多的機會運行。
但是你不應該依靠他們中的任何一個來讓你的執行順序正確。
你應該做的是把你想要運行的代碼放在success
函數中的ajax調用之後。這是確保在ajax調用完成後運行的唯一方法。
希望有所幫助。
[編輯] OP的評論後,進一步澄清:
Spudley,睡眠功能是我自己的功能,以保持瀏覽器被重定向像2秒。函數Sleep(毫秒){var start = new Date()。getTime(); for(var i = 0; i < 1e7; i ++){if((new Date()。getTime() - start)> milliseconds){break; }}}
只是ref,像這樣的睡眠函數在Javascript中是一個非常糟糕的主意。你應該使用setTimeout()來處理那種事情。
但是,重點仍然是相同的 - 你的代碼在$.ajax()
之後運行,它將阻止你的ajax成功函數的執行。如果您之後正在做重定向,那麼成功功能可能永遠不會有機會運行。
的alert()
的確會使其工作,由於success
功能會發現一個插槽中時,警報被清除,Sleep
被調用之前運行,但你不應該依賴於這個。
答案保持不變:您應該在success
函數中放入要在ajax調用之後運行的代碼。
這裏有一個你的代碼所做的更改:
$.ajax({ type: "GET",
url: "../MasterPages/AHMHandler.ashx?T=1",
dataType: "HTML",
success: function (msg) {
document.getElementsByName('cartId')[0].value = msg;
setTimeout(function() { //this instead of your Sleep function
//this is where you need to do your redirect, or whatever else you're doing after the ajax completes.
}, 2000);
}
,
error: function (e) {
return false;
}
});
//don't put **any** code here after the ajax call! put it in the success function.
什麼是錯誤的FF? – Amit
我不明白爲什麼它不應該在FF中工作。請提供更多信息。 –
艾米特,無論在Fiddler或FireBug中看到任何錯誤! 在IE中,它成功調用處理程序,並遍歷所有服務器端代碼並返回。 但是使用FF既不能處理處理程序也不能使用Ajax調用的錯誤函數。 有什麼想法? –