2012-05-02 33 views
6

我的Google-fu什麼也沒拉。是否有History.pushstate的回調?

當你這樣做:

var stateObj = { state: "some state" }; 
history.pushState(stateObj, "page 2", "other.htm"); 

是否有相關的窗口回調?

我知道,有這樣的:

window.onpopstate = function() { 

} 

偉大的工程聆聽當用戶點擊後退按鈕。但是,我希望隨時都能聽到URL的更改,而且我不知道如何去做。

有沒有一個全球性的回調URL隨時變化?

+0

http://stackoverflow.com/questions/680785/on-window-location-hash-change – Joe

+0

嘗試綁定到一個元素,然後檢查是typeof值(typeof elem.onpopstate),如果它未定義它不受支持,如果這是一個很好的功能。 http://perfectionkills.com/detecting-event-support-without-browser-sniffing/關於如何 – GillesC

+2

[如何通過history.pushState獲取關於歷史變更的通知](http:// stackoverflow。 com/questions/4570093/how-to-get-notifications-about-changes-of-the-history-via-history-pushstate) – thekevinscott

回答

12

不,沒有onpushstate或其他什麼。但是,一個小猴子修補可以修復:

var pushState = history.pushState; 
history.pushState = function() { 
    pushState.apply(history, arguments); 
    fireEvents('pushState', arguments); // Some event-handling function 
}; 

這將只在使用pushState時通知您。你可能想爲replaceState做類似的事情。

如果您需要在網址發生任何變化時收到通知,上述和一個hashchange處理程序的某種組合將使您獲得大部分途徑。

+1

你知道什麼,[this](http://stackoverflow.com/questions/4570093/how-通過歷史推送狀態的問題幾乎完全相同,答案也是如此。 :P –

+0

這會使你陷入困境嗎?例如。在加載腳本的第三方網站上執行此操作。或者這是多半安全的? – Cristian

+0

我發現了一個可能無法工作的例子。例如在Backbone.history中,'history.pushState'引用被複制到'Backbone.history.pushState'。如果我們使用'='賦值替換'window.history.pushState'的引用,那麼您仍然會擁有'Backbone.history.pushState'引用舊的'pushState',因此您的猴子補丁代碼不會被調用。如果只有JS有內置的參考管理:( – Cristian

相關問題