2013-05-28 52 views
0

我用下面的代碼到我的服務器上發送一個動作和參數的腳本延遲:阿賈克斯後通過警報

$(function() { 
    url = "http://...../myscript.php"; 
    $.post(url, { action: 'my action', param: 'my parameter'}, {cache: false}); 
    alert("Hello"); 
}); 

我發現(在Safari 6.0.4 MacOSX上)警告框彈出,只需在之後發送ajax請求,然後單擊「確定」。 (在Chrome上,顯示警報時會發送請求)。

所以代碼以下我的ajax請求實際上延遲了發送的請求。

這是爲什麼?

編輯:

$.post(url, { action: 'system', param: 'volume get 5'}, {cache: false}); 
sum = 0; 
for(i = 0; i < 1000000000; i++) 
    sum++; 
$("title").html(sum); 

使計算完成之後將要發送的請求。

+1

因爲alert()是阻止操作。該帖子被髮送,然後該警報停止瀏覽器處理結果(記住,ajax是異步的),直到您關閉該警報。您不會延遲發送的請求,而是延遲收到的請求。 –

+0

@KevinB澄清一下,你正在延遲執行回調函數,而不是接收到的響應。 –

+0

@KevinB我希望瀏覽器阻止任何回調或類似的,但沒有傳出的請求似乎很奇怪? – Samuel

回答

2

我注意到(在MacOSX上的Safari 6.0.4上)彈出警告框,並且只有在點擊「確定」後纔會發送ajax請求。 (在Chrome上,顯示警報時會發送請求)。

因此,遵循我的ajax請求的代碼實際上延遲了發送的請求。

我覺得很奇怪,但我無法測試它,因爲我沒有Mac OS X中雖然alert塊爲主的JavaScript線程,它不應該阻止發送請求的瀏覽器,因爲瀏覽器是多線程的。但是,我認爲它可以在一些實現中。

請注意,無論如何,alert都會阻止對與請求關聯的任何「成功」或「錯誤」處理程序的調用,這是完全不同的事情。這是因爲除非使用網絡工作者,否則JavaScript在瀏覽器上是單線程的,並且(再次)alert包含一個JavaScript線程。

如果發送真是越來越被alert追究起來,您可以修復與setTimeout

$(function() { 
    url = "http://...../myscript.php"; 
    $.post(url, { action: 'my action', param: 'my parameter'}, {cache: false}); 
    setTimeout(function() { alert("Hello"); }, 0); // Defers it 
}); 

如果它是越來越追究起來,對付那是最好的方式回調做一些比alert更現代的東西,比如一個很好的風格絕對定位div包含消息。如果你希望消息是模態的,你可以自己做,儘管在禁用頁面的其餘部分有一些邊緣條件;但也有大約一百萬個「模態」插件可用於處理這些邊緣條件的jQuery。 (jQuery UI和Bootstrap都提供它們,還有很多其他的。)

+0

我覺得它也非常令人驚訝,它實際上是發送(腳本寫入數據庫,並且在單擊該警報之後進行輸入*)。設置超時實際上解決了這個問題。然而,它提出了這個問題,這個問題是否只發生在警報或緊隨ajax部分的任何代碼之後。這將會令人討厭。 – Samuel

+0

@Samuel:我希望它只是'alert'和'confirm',儘管可能如果你發送了一個* synchronous * ajax調用之後,它可能會阻止它。 (但是最好避免同步ajax調用。)'alert'和'confirm'基本上是阻塞線程的唯一東西。我的意思是,你可能有一個無限循環,但是然後Safari會在某個時候終止劇本...... –

+0

我在這個問題上又增加了一個例子。如預期的那樣(來自意外情況)請求在*總和之後再次被髮送*。因此,雖然請求總是會在某一時刻發送(現在忽略(true)),但時間不確定。 – Samuel