2013-05-08 115 views
11

我有一個運行各種javascript代碼的頁面,包括調用setTimeout()。如果用戶點擊鏈接導航到另一個頁面,那麼此頁面上的JavaScript停止運行的時間點,因此我的代碼將不再被調用?例如點擊鏈接後,JavaScript何時停止在頁面上運行?

  • 一旦鏈接被點擊(我知道這是錯誤的)
  • 當瀏覽器開始接收新的一頁
  • 一些其他的呢?

這對於不同的主流瀏覽器是不同的嗎?

背景

我想很大程度上是知道這個利息的緣故,而不是解決任何特別的問題。促使我考慮這個問題的原因是我想在用戶點擊頁面上的特定鏈接時執行某些操作。我想執行一個ajax調用並處理結果,但是如果它在頁面卸載之前完成,我並不太在意。所以我會在鏈接點擊時觸發一個setTimeout(),然後如果我很幸運,它會完成,但如果我不是,它不會。我想知道它會在什麼情況下工作。雖然可能有其他解決方案來解決這個問題,但我不想解決問題,我只想知道問題的答案。

+5

大概剛好在[onunload事件](https://developer.mozilla.org/en-US/docs/DOM/window.onunload)之後,但爲什麼這對你很重要? – 2013-05-08 12:48:52

+0

_什麼瀏覽器? – 2013-05-10 08:54:34

+1

在['卸載文檔清理步驟]期間清除*活動定時器*(其中'setTimeout'添加到)](http://www.w3.org/TR/html5/browsers.html#unloading-document-cleanup (從其他文件中)調用['卸載文檔過程]](http://www.w3.org/TR/html5/browsers.html#unload-a-document)。然而,我不確定在[導航過程]期間何時調用這些內容(http://www.w3.org/TR/html5/browsers.html#navigating-across-documents) – Bergi 2013-05-10 14:06:05

回答

0

一種可能的解決方案是停止點擊事件,觸發異步調用並在處理完ajax調用的結果後恢復默認事件。或者,如果可能的話,您可以處理服務器上的處理,在這種情況下,您甚至不需要停止缺省事件 - 只需觸發異步調用即可。

在回答你的問題時,我同意傑克在onunload事件後腳本停止運行。

希望能得到這些結果。

3

下面是發生什麼的順序:

第1步:您點擊一個鏈接。瀏覽器向服務器發送請求並等待響應。當前頁面的文檔對象仍然存在。

第2步:瀏覽器收到響應。當前頁面的文檔對象仍然存在。

步驟3:瀏覽器解析,創建並呈現對新文檔對象的響應。

第3步是噹噹前頁面的JS停止時,除非您有針對性地對iframe做出響應。如果你這樣做,那麼新的文檔對象將在iframe內呈現,並且當前頁面的文檔對象保持不變,並且JS仍然保持功能。

希望能回答你的問題!

+0

謝謝!你有更詳細的描述嗎? – Rory 2013-05-10 11:46:20

+0

我認爲即使在瀏覽器收到響應之前,舊的DOM也會被卸載?是什麼讓你認爲這是序列,你有什麼參考? – Bergi 2013-05-10 14:01:15

+0

有沒有辦法檢測用戶是否在等待鏈接進行響應?例如:「如果用戶不想離開,請做更繁忙的工作。」 – 2013-11-12 19:03:38

相關問題