popstate事件在低版本webkit中的調用

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);
    })
})  
相關文章
相關標籤/搜索