有一天,頭兒給我提了這樣一個需求:跨域
不管頁面如何跳轉,在首頁的時候再按返回,直接退出...瀏覽器
關閉網頁好說,因爲咱們的項目是微信公衆號,直接調用微信瀏覽器的內置函數:bash
WeixinJSBridge.call('closeWindow')
複製代碼
可是怎麼監聽到這個返回的事件呢?辦法呢仍是有滴!微信
JavaScript中沒有監聽物理返回鍵的API,因此經過監聽瀏覽器歷史記錄的變化來實現。函數
在HTML5就提供給咱們 popstate 用來監聽歷史記錄點。測試
window.addEventListener("popstate", function(e) {
// 若是監聽到返回,就跳轉到百度首頁
window.location = 'http://www.baidu.com';
}, false);
複製代碼
當咱們完成兩個頁面來測試步驟一中代碼的時候,發現返回的時候根本沒跳轉到百度首頁。 ui
轉念一想不對啊,監聽到popstate事件的一瞬間就返灰到上一頁面了啊。爲啥沒反應,內心有點了逼數了啊!url
不賣關子了,爲了能返回後不回到上一級頁面,可使用 pushState 來向歷史記錄棧中在插入一條新紀錄。spa
注意: 此處爲了返回不跳轉,插入一個錨連接(此處有坑,下文解釋)就行code
/**
* window.history.pushState(state, title, url)
*
* state:與要跳轉到的URL對應的狀態信息。
* title:如今大多數瀏覽器不支持或者忽略這個參數,最好用null代替。
* url:要跳轉到的URL地址,不能跨域。
**/
var state = {
title: "title",
url: "#"
};
window.history.pushState(state, null, "#");
複製代碼
沒意外的話,如今配合步驟一中代碼,是能夠監聽到頁面返回事件,從而跳轉到百度首頁。這也是網上能看到的絕大多數的思路。提醒一下,replaceState 雖然也能夠改變歷史記錄棧,可是爲了避免破壞原有歷史記錄,此處最好使用 pushState。
// 封裝一下push歷史記錄的方法
function pushHistory() {
var state = {
title: "title",
url: "#"
};
window.history.pushState(state, null, "#");
}
// 在須要監聽的頁面執行該方法
pushHistory();
window.addEventListener("popstate", function(e) {
// 若是監聽到返回,就跳轉到百度首頁
window.location = 'http://www.baidu.com';
}, false);
複製代碼
在微信中進入頁面就觸發了popstate事件
解決方法:定義boolean 變量bool=false。在頁面加載後,採用setTimeout方法設置1.5s的超時,在超時執行方法中設置bool=true。
// 封裝一下push歷史記錄的方法
function pushHistory() {
var state = {
title: "title",
url: "#"
};
window.history.pushState(state, null, "#");
}
// 在須要監聽的頁面執行該方法
var bool=false;
setTimeout(function(){
bool=true;
},1500);
pushHistory();
window.addEventListener("popstate", function(e) {
// 若是監聽到返回,就跳轉到百度首頁
if(bool){
window.location = 'http://www.baidu.com';
}
pushHistory();
}, false);
複製代碼
這是網上看到好多人遇到的問題,雖然加了延遲,可是仍然解決不了個人問題,也許是應用場景的不一樣,此處暫時記下,作個參考
在IOS端的微信,若是頁面A->頁面B,若是兩個頁面都設置了返回重定向(也就是以上代碼),按下返回鍵的時候,頁面A的popstate也會自動觸發,管你設置多少延遲也沒用。
當時在網上找了不少方法,都沒解決。
也許是本身手欠的緣故,有一次在毫無思路的狀況下,在錨連接後加了個標識:
// 封裝一下push歷史記錄的方法
function pushHistory() {
var state = {
title: "title",
url: "#forward"
};
window.history.pushState(state, null, "#forward");
}
// 在須要監聽的頁面執行該方法
pushHistory();
window.addEventListener("popstate", function(e) {
// 若是監聽到返回,就跳轉到百度首頁
window.location = 'http://www.baidu.com';
}, false);
複製代碼
你妹的,竟然解決了
固然,此時我原來加的延遲也去掉了,反正對我來講也沒什麼用了!
總結: 在使用以上方式實現返回重定向的時候,切記不要只push進去一個空錨點。但願我此次的經驗能給遇到一樣問題的朋友一些經驗。若是有朋友有更好的解決辦法,也但願能夠分享給我!