標籤:ack 頁面 html listener 函數 http blog div line
history.pushState 和 history.replaceState 可以在不重新整理當前頁面的情況下更改URL,但是這樣就無法擷取通過AJAX得到的新頁面的內容了。
雖然各種HTML5文檔說 window.onpopstate 事件可以攔截 pushState 的訊息,但在實際的測試中, onpopstate 根本沒有任何作用,無法攔截 pushState 的訊息。
經過Google一番,才找到了正確擷取 pushState 事件的代碼
https://stackoverflow.com/a/25673911
// Add this:var _wr = function(type) { var orig = history[type]; return function() { var rv = orig.apply(this, arguments); var e = new Event(type); e.arguments = arguments; window.dispatchEvent(e); return rv; };};history.pushState = _wr(‘pushState‘);history.replaceState = _wr(‘replaceState‘);// Use it like this:window.addEventListener(‘pushState‘, function(e) { console.warn(‘THEY DID IT AGAIN!‘);});window.addEventListener(‘replaceState‘, function(e) { console.warn(‘THEY DID IT AGAIN!‘);});
這段代碼改寫了 history 中原來的函數,然後自己啟用一個事件
這樣就可以解決 pushState 無法啟用事件的問題了
另外記得最好將這段代碼放在文檔載入前執行
通過JS攔截 pushState 和 replaceState 事件