2010-02-03 39 views
1

我還沒有看到任何提及這是David Flanagan的「JavaScript - 權威指南」一書(我也在O'Reilly Answers上提過這個問題),或者其他任何地方,但是我發現那個窗口.onunload不會被調用,除非文檔完全加載,這很煩人!對於IE8和Chrome 3來說至少是這樣的只有在文檔完全加載時才調用JavaScript onunload?

我有一段Javascript我想添加到網頁的底部。如果用戶在加載頁面(^見下文)之前恰好點擊頁面,並且在我的Javascript有機會運行之前,我希望能夠在onunload中捕獲該頁面。但這是不可能的,因爲onunload事件處理程序僅在文檔完全加載時才被調用。如果我不能使用onunload,還有什麼我可以用來實現相同的?

^「Javascript - 權威指南」建議用戶與頁面的交互不會發生,直到頁面被加載。我相信這是錯誤的。以下是本書的內容:

「Javascript執行模型的另一個灰色區域是事件處理程序是否可以在文檔完全加載之前被調用的問題我們對Javascript執行模型的討論已經得出結論:所有事件處理程序總是在所有腳本執行完畢後觸發,雖然這通常發生,但任何標準都不需要它,如果文檔很長或正在通過慢速網絡連接加載,瀏覽器可能會部分呈現文檔,允許用戶在所有腳本和onload處理程序運行之前開始與之交互(並觸發事件處理程序),如果這樣的事件處理程序調用一個尚未定義的函數,它將失敗(這是定義所有函數的一個原因在文檔中的腳本中)。如果這樣的事件處理程序試圖操縱尚未解析的文檔的一部分,它將失敗。此方案在實踐中是常見的,通常不是值得積極防範它需要額外的編碼工作。」 (第5版,頁256)

我對IE8進行測試,表明它是可能的互動與頁面(並通過一個錨鏈接離開它)在頁面加載任何階段。

感謝您的幫助, 保羅

+0

如果用戶在JavaScript完成初始執行之前有時間點擊,您是否可以減少必須以此方式運行的JavaScript數量?您可以隨時使用eval在稍後插入另一個js文件。 – 2010-02-03 14:28:06

+0

你定義「完全加載」爲「文檔解析」或「'onload'事件已經觸發」? – 2010-02-03 17:06:54

+0

*瀏覽器可能會部分呈現文檔,並允許用戶開始與其交互*讀取該瀏覽器可能允許用戶與部分呈現的頁面進行交互。 – 2010-02-03 17:08:46

回答

0

這是有道理的,我認爲一個onunload事件無法觸發,直到文檔解析和腳本執行通常在同一個線程上運行,並且用戶要離開th e頁面,則在觸發onunload事件後線程將被取消。由於解析是使用線程的用戶從頁面導航離開的時候,瀏覽器將有以下選擇:

  • 完成解析,並觸發卸載事件 - 這將延緩導航到下一個頁面,所以這不是一個可行的選擇。
  • 取消解析並觸發卸載事件 - 這是一個更可行的選項,但您可能會看到一些UA不打擾。
  • 只是停止線程並導航到下一個頁面 - 這似乎是發生了什麼事對你在IE和Chrome

也許你可以看到,如果onbeforeunload事件被觸發?我不認爲這會有所作爲。我認爲最好的做法是查看可以優化頁面加載速度的方法。

相關問題