JavaScript禁止鼠標右鍵點擊的瀏覽器後退事件(兼容IE9及以上)

提到禁止瀏覽器的後退行爲,就不得不提到history這個api.而HTML5中中新引入的pushState()和 replaceState()方法。
現在你打開百度,搜索“js實現禁止瀏覽器後退功能”,你會看到一大片解決方案,當然也有所謂的“終極方案”,類似下面這種:

//防止頁面後退
history.pushState(null, null, document.URL);
window.addEventListener('popstate', function () {
     history.pushState(null, null, document.URL);
 });                                      

經測試,這個方法在ie10以上確實完美的解決的禁止瀏覽器後退這一需求。但是如果我們想在ie9下也實現此需求那該如何做呢?要知道ie9是不支持pushState()這個函數的。此需求暫且不談,咱們可以先談談上面這段代碼是是怎麼實現功能的。

history.pushState(stateObject,title,URL) 

上面這句代碼的作用很簡單,就是通過pushState()這個函數來操控瀏覽器歷史。它有三個參數,分別是stateObject,title,URL。其中stateObject是一個對象,用來記錄或存儲和這條歷史相關的狀態信息。需要注意的是firefox瀏覽器對此對象的大小有限制,最多不能超過640kb,否則則會拋出異常。title一般寫作null就好,因爲firefox默認忽略此參數。url則是與當前url同源的地址,如果不指定,則默認爲當前頁面url,此方法並不會是頁面跳轉到指定的url中。。
這麼看來上面的那段代碼的作用就很清晰了。第1句在當此頁面被加載時就給頁面添加了一條歷史記錄,歷史記錄的url即是本頁面的url。
然後第2句在通過popstate這個方法來監控瀏覽器的後退和前進行爲,並在被觸發時再次調用一次第一次的那句代碼。這樣就做到了當用戶在不停的點擊後退時,一直後退的其實是我們添加進去的歷史記錄,而且並不會改變你對當前頁面的操作。
接下來我們談談如何在ie9下也實現此功能。在低版本的ie時代,在history這個API未增加新特性前,一般情況我們想要操控瀏覽器的歷史是通過window.location.hash來完成的。

window.location.href = '/go/ahead'; //執行此代碼時頁面會跳轉
window.location.hash = 'advance'; //執行此代碼會給頁面的url加上一條歷史記錄,歷史記錄的url爲URL+'advance';

也就是說通過location.hash這個方法我們可以做到給頁面插入歷史記錄而布使頁面發生跳轉。剩下的就是如何監控頁面的後退事件了。
在低版本的ie下,想要監控瀏覽器的後退或前進行爲是很困難的,你想直接去監聽幾乎沒有原生的方法能做到。所以我們可以轉換思路,利用hash來判斷。

var hash_current = "ForbidBack";
var hash_last = "AgainForbidBack";
window.location.hash = hash_current;
window.location.hash = hash_last;
    

window.onhashchange = function () {
     window.location.hash = hash_current;
 };

此處的關鍵就是在開始就插入了一條hash,在瀏覽器的後退或前進時會觸發url發生改變,所以可以通過window.onhashchange來監聽。
如果你是一個帶登陸的鎖定頁面,光是如上代碼肯定不能滿足你的需求,因爲你還需要登陸,但是此時登陸產生的跳轉事件也被禁止了,所以我們可以通過調用ajax來返回登陸成功後html,這樣就避開了禁止行爲。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章