popstate是H5的history系列中的事件,可是在低版本的webkit中會自動觸發。H5中的history api是不會使頁面發生跳轉的,只是操做地址欄和響應的state屬性而已,並且是手動操做的。瀏覽器默認的history仍是傳統的那一套,雖然他們在瀏覽器上都是使用同一個「歷史記錄堆棧」,對這個差別的認知就是形成低版本webkit首次加載觸發的緣由。webkit並無把H5的history和傳統區分開,而根據官方文檔對popstate的描述,只要訪問歷史記錄就會觸發popstate。而傳統的history中訪問頁面和生產歷史記錄是同時的,因此在webkit中不管是刷新仍是訪問一個新頁面都會觸發popstate,而其餘瀏覽器中這個popstate僅做用於H5的history,並不影響傳統的history。javascript
解決方案:java
一、對popstate進行延遲綁定,由於popstate會在頁面加載完成以後不久觸發,因此在setTimeout一段時間以後再綁定事件。web
二、判斷瀏覽器再作調整,直接針對webkit在頁面加載完成後第一次觸發的popstate裏屏蔽了。api
例如: 瀏覽器
修改前:blog
window.addEventListener('popstate', function() { // todo },false);
修改後:事件
window.addEventListener('load', function(){ setTimeout(function(){ window.addEventListener('popstate', function() { // todo },false); }) })