2013-01-01 54 views
8
我有一個如「popstate」事件處理的一個問題

,這是我的代碼:popstate事件處理似乎不起作用

window.addEventListener("popstate", function (event){ 
    if (event.state) { 
     alert('abc') 
    } 
}); 

// The data object is arbitrary and is passed with the popstate event. 
var dataObject = { 
    createdAt: '2011-10-10', 
    author: 'donnamoss' 
}; 

var url = '/posts/new-url'; 
history.pushState(dataObject, document.title, url); 

我希望當它執行該代碼會彈出一個警告框,但, 什麼都沒發生。

這裏有什麼不對嗎?

謝謝。

+0

測試[jsFiddle](http://jsfiddle.net/DJDavid98/Lrf62/)中的代碼,'.pushState()'事件似乎失敗。用字符串替換變量允許我觸發事件。 – SeinopSys

+0

@ DJDavid98 - 這隻意味着'pushState'返回'false'或'undefined'。 –

回答

14

pushState不觸發popstate事件,只有單擊後退/前進按鈕(或使用退格鍵)或調用history.back()/history.go(n)會觸發該事件。

另外,在webkit瀏覽器中,頁面的onload事件會觸發popstate事件,但Firefox和IE不具有此行爲。

+1

在加載頁面或調用history.pushState()時觸發之前提到的popstate事件。在後者的情況下,事件對象將包含一個 狀態屬性,該屬性包含給予history.pushState()的數據對象。你可以檢查這個,PLZ,我引用Javascript Web應用程序? – petwho

+1

我閱讀[HTML標準](http://www.whatwg.org/specs/web-apps/current-work/multipage/history.html#dom-history-pushstate)並沒有發現觸發「popstate」的任何步驟事件。我正在做一個歷史api相關主題yestertoday,我確定'pushState'不會觸發任何'popstate'事件。如果一個** push **動作觸發一個** pop **事件,這不奇怪嗎?如果** push **觸發** pop **,那麼比歷史堆棧中剩下的東西還要多?沒有? – otakustay

+1

現在我從我的朋友借了一本Javascript Web應用書,是的,它說'pushState()'會觸發'popstate'事件,但我認爲這是本書的錯誤,網上沒有其他資源證實了這種行爲。 – otakustay

4

沒有也不會,

MDN documentation

注意,只調用history.pushState()或history.replaceState()不會引發popstate事件。 popstate事件只能通過瀏覽器操作觸發,例如點擊後退按鈕(或在JavaScript中調用history.back())。

再次按this questionpopstate事件不會在Chrome當你調用pushState()觸發。

0

history.pushState()根據定義不會觸發popstate事件。

當瀏覽會話歷史記錄條目時,在某些情況下會觸發popstate事件。

此事件僅在導航到歷史記錄條目時觸發,可以通過按後退/前進按鈕或history.go/back來觸發。

-1

您CAL還連接您的popstate回調處理程序是這樣的:

window.onpopstate = someCallback; 

檢查的詳細信息,這onpopstate WindowEventHandler here