我使用history.js來處理返回按鈕。在history.js statechange每當我執行pushstate時都會觸發。爲什麼? history.js每當我做推狀態時Statechange都會觸發
這pull request索賠
我使用history.js來處理返回按鈕。在history.js statechange每當我執行pushstate時都會觸發。爲什麼? history.js每當我做推狀態時Statechange都會觸發
這pull request索賠
根據這一discussion on github,它的預期的行爲已經修改history.js更內嵌W3C規範。
想要添加,是的,這是History.js的預期行爲。 同時有more discussions批評這種行爲,因爲它不是W3C標準,並造成一些混淆。
總之,要回答你的問題:在History.js pushState()
函數是在最後調用statechange。
該解決方案的上升是,你可以改變(推)你的新狀態,並讓onstatechange()函數處理過渡。 Downside是你無法處理異常/或不得不將它們寫入onstatechange事件處理程序。
我個人更喜歡W3C處理這種方式,因爲您可以區分後退/前進按鈕和pushState。該History.js維護者是在一個內部標誌的解決方案的工作,使您能夠改變這種行爲:
注意一下上面的電話[pushState的通話]觸發statechange事件,如果由於某種原因 你不想給你的statechange 處理程序中,然後發生,你可以使用以下命令:
if (History.getState().internal) { return; }
*此功能目前正在開發中,只能用History.js的「開發」的版本可以使用!希望這將有助於在未來:)
其他一些人試圖現在做到這一點了一天後,我終於找到了解決辦法在這裏:https://github.com/browserstate/history.js/issues/47#issuecomment-25750285
的代碼非常簡單該死,下面是引自鏈接:
當你把你的狀態
History.pushState({
_index: History.getCurrentIndex(),
someData: ...
}, someTitle, someUrl);
,然後在事件綁定
History.Adapter.bind(window, 'statechange', function() {
var currentIndex = History.getCurrentIndex();
var internal = (History.getState().data._index == (currentIndex - 1));
if (!internal) {
// your action
}
});
萬分感謝。我個人覺得history.js解決方案更好。 – aWebDeveloper 2012-01-06 06:51:41