場景描述:
a頁打開b頁,b頁執行history.go(-1)意圖關閉當前頁的同時刷新a頁。但在微信客戶端或者部分android手機無效果。
供參考的處理方式:
1、在js中寫上location.href = document.referrer;就可以實現跳轉到上一個頁面了,讓用戶覺得體驗很好
但是在IE中referrer就沒那么盡人意了啊,IE會清空referrer
眾所周知,我們web開發人員痛恨IE瀏覽器,因為IE不支持標准,標准外的默認行為又和其他瀏覽器經常不一致:
在IE中用javascript做跳轉,比如用window.location.href = “http://www.google.com”; google無法取到瀏覽器請求的HTTP referrer,因為IE清空了document.referrer
而其他主流瀏覽器Firefox和Chrome都會保留referrer,這意味着IE又要享受“部長級”特殊待遇了:
var referLink = document.createElement('a');
referLink.href = url;
document.body.appendChild(referLink);
referLink.click();
}else {
location.href = url;
}
這樣的原理就是給IE瀏覽器的頁面偷偷加了個鏈接,然后自動點這個鏈接,於是referrer就能保留了。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2、window.onpageshow事件
window.onpageshow = function(event){
if (event.persisted) {
//todo something or like window.location.reload();
}
};
前述:
Firefox和Opera有一個新特性,名叫“往返緩存”(back-forward cache,或bfcache),可以在用戶使用瀏覽器的“后退”和“前進”按鈕時加快頁面的轉換速度。
這個緩存中不僅保存着頁面數據,還保存了DOM和JavaScript的狀態;實際上是將整個頁面都保存在了內存里。
如果頁面位於bfcache中,那么再次打開該頁面就不會觸發load事件。
盡管由於內存中保存了整個頁面的狀態,不觸發load事件也不應該會導致什么問題,但為了更形象地說明bfcache的行為,Firefox還是提供了一些新事件。
第一個事件就是pageshow,這個事件在頁面顯示時觸發,無論頁面是否來自bfcache。在重新加載頁面中,pageshow會在load事件觸發后觸發;
而對於bfcache中的頁面,pageshow會在頁面狀態完全恢復的那一刻觸發。另外要注意的是,雖然這個事件的目標是document,但必須將其事件處理程序添加到window。
有時可能需要在pagehide事件觸發時根據persisted的值采取不同的操作。
對於pageshow事件,如果頁面是從bfcache中加載的,那么persisted的值就是true;
對於pagehide事件,如果頁面在加載之后會保存在bfcache中,那么persisted的值也會被設置為ture。
因此,當第一次觸發pageshow時,persisted的值一定是false,而在第一次觸發pagehide時,persisted就會變成true(除非頁面不會保存在bfcache中)。
指定了onunload事件處理程序的頁面會被自動排除在bfcache之外,即使事件處理程序是空的。
具體原因:
onunload最常用於撤銷在onload中所執行的操作,而跳過onload后再次顯示頁面很可能會導致頁面不正常。