popstate事件在webkit中的詭異行為

2021-08-04 20:40:34 字數 1097 閱讀 3468

雖然官方的文件中對popstate的描述也沒有細節上的描述,不過以我的邏輯來判斷,這貨是就webkit的bug。   html5的這一套historyapi和傳統的history不同,或者說這一套historyapi是「session history entries」。雖然官方的文件並沒有強調它與傳統的history不同,但是在使用上就會發現很大差異。

html5中的historyapi是不會使頁面跳轉的,只是操作位址列和相應的state屬性而已,而且它是手動操作的。瀏覽器預設的history還是傳統的那一套,雖然它們在瀏覽器上都使用同乙個「歷史記錄堆疊」。    對這個差異的認知就是webkit中詭異行為的原因。webkit並沒有把html5的history和傳統的區分開,而根據官方文件對popstate的描述,只要訪問歷史記錄就會觸發popstate。而傳統的history中訪問頁面和生產歷史記錄是同時的。

所以在webkit中,無論是重新整理還是訪問乙個新網頁都會觸發popstate。而其它瀏覽器中這個popstate僅作用於html5的history,並不響應傳統的history,更不用說重新整理和訪問新網頁的情況了。

網路上看到的能解決這個問題的貌似也只有乙個對popstate延遲繫結的方法,因為popstate會在頁面載入完成之後不久觸發,所以在 settimeout一段時間後再繫結事件,popstate的第一次就不會輕易被webkit奪走了←_← 。

不過延遲這種東西我一直都覺得不太靠譜,所以還是果斷放棄這種方法了。最後只好使用爛方法,判斷瀏覽器再做調整,直接針對webkit在頁面載入完成後第一次觸發的popstate遮蔽了。不過畢竟是針對瀏覽器的東西,雖然目前是可以使用,但是如果以後webkit修復了這個bug就需要修改**了

//原版本

changehistory: function

() );

if (window.history.state != 'only') }}

//修改後

changehistory: function

() );

}settimeout(historyevent, 2000);

if (window.history.state != 'only')

}},

如何觸發 popstate 事件

vue router 的 history 模式是使用瀏覽器的 history state 來實現的,history state 是通過 history 物件來操作的。popstate事件是通過window.addeventlistener popstate 進行註冊的。但觸發條件需要滿足下面兩點 點...

實現介面事件,在介面中實現事件

可以在介面中宣告事件,然後在類中實現該事件的引用。在為方法訂閱事件時,可以訂閱介面宣告的事件,也可以訂閱類中的事件。class inte ceevent static void handlershapechanged object sender,customeventargs e e.area pu...

在C Builder中定義事件

在c builder中,事件是一種委託模型,它是對訊息的封裝。如果你用過vc,你就知道在vc中並不存在什麼事件,而只有訊息處理函式,而在c builder中則是由事件處理函式來負責響應訊息。同是,事件本身也是一指標,它是乙個閉包,通常在c builder中有兩種事件 通知型別事件 即tnotifye...