2013-01-04 149 views
3

我在處理另一個問題時發現了這個錯誤。 JavaScript命令列出的順序是比他們執行的Safari中的順序不同:在Safari中沒有執行JavaScript命令

例子:

alert('here'); 
document.write('This is the hidden message.'); 
alert('You should be seeing the hidden message by now.'); 

在我的瀏覽器alertsdocument.write()聲明之前執行。我在兩個不同的Mac OS X上使用Safari 5.17,6.0和6.0.2版本看過這個錯誤,但是我還沒有證實其他人看過這個。

這裏的小提琴:

http://jsfiddle.net/akJD7/

任何人都可以證實,他們看到這一點,如果是的話,告訴我爲什麼發生這種情況?

+1

我的猜測是在document.write返回之後但在文本呈現之前觸發的第二個警報。第二次提醒會凍結瀏覽器執行,因此直到您解除第二次提醒後纔會完成呈現。 – Madbreaks

+0

嘗試用'console.log'替換'document.write',看看你是否看到相同的東西。呃,就是說如果Safari有一個可用的控制檯。 – Madbreaks

+0

我實際上使用document.write來創建一個無jQuery的示例,但也許應用相同的原則。這裏有一個jQuery的例子:http://jsfiddle.net/VqzzU/ –

回答

3

嚴格來說,我認爲這不是一個錯誤。只是它全部是同步的,並且在第二次警報之前沒有重新繪製。重新繪圖通常不會發生在瀏覽器事件循環的同一個「勾號」內(儘管document.write似乎在其他瀏覽器中強制重繪,例如Chrome)。

這(醜陋的)解決方法應該修復它:

alert('here'); 
document.write('This is the hidden message.'); 
setTimeout(function() { 
    alert('You should be seeing the hidden message by now.'); 
}, 0); 

+0

他們都是很好的答案,我只是選擇了這一個,因爲這是我最終的結果。我的實際用例根本沒有任何提醒......它只是一個表單提交處理程序中的$ .show()調用。像冠軍一樣工作。謝謝! –

2

試試這個,如果你有jQuery的:http://jsfiddle.net/2Kcuz/

每我的意見,我的猜測是你添加文本document.write根本還沒有渲染(但它仍然在那裏)。

+0

是的,這就是我想要回答的問題。它在那裏,只是還沒有呈現。 – bfavaretto

+0

@bfvaretto那麼,我的評論擊敗了你的答案,而這又反過來打敗了我的答案。 :)但我認爲我發佈的小提琴有點兒有趣。 – Madbreaks

+0

它是。不要誤會我的意思,我不是在這裏競爭。我其實提高了你的答案! :) – bfavaretto