2014-03-29 37 views
5

當我跑了以下兩個JavaScript命令......爲什麼alert(「2nd」);`在window.history.back();`之前執行?

> window.history.back(); alert("2nd");

...我期待的窗口去到前一頁,然後顯示警報。會發生什麼是「第二」實際上首先彈出,然後窗口回來。如果我扭轉他們這樣......

> alert("2nd"); window.history.back();

...指令執行仍然以相同的順序。我對JavaScript控制流程有什麼不瞭解?我如何得到window.history.back();先運行?

+3

我相信它的原因在於.back()不是一個阻塞函數,因此代碼在它繼續執行之前一直執行到頁面和JavaScript語句被卸載的位置。 –

回答

4

那麼,這是有道理的,其他頁面加載後不顯示警報。該腳本是加載頁面的一部分,所以如果能夠工作,這意味着您可以在前一頁中注入JavaScript,這當然是不可取的。

所以,在我看來,有3種可能性:

  1. 背面功能是阻止和立即生效,導航到前一頁,並終止正在運行的腳本。這顯然沒有發生,否則你根本沒有得到警報。
  2. back函數立即生效,但腳本只有當瀏覽器有足夠的信息才能開始加載其他文檔時纔會終止。這似乎並非如此。如果是這樣,瀏覽器可能會在警報打開時在後臺加載文檔,但這不會發生。
  3. back函數只是指示瀏覽器返回,並且腳本一直運行,直到它在請求實際滿足之前處於空閒狀態。這似乎是這種情況。導航僅在警報關閉並且腳本結束時開始。 (至少在Chrome中)。

無論如何,如果你想這個工作,你必須從您正在導航的頁面調用alert

0

在實際執行返回之前,必須將控制權返回給瀏覽器。它只是告訴頁面,當你有機會時,回去。

一旦控件返回,調用瀏覽器卸載掛鉤(onbeforeunload,onunload,瀏覽器特定事件)。

相關問題