企業微信有自己的jsAPI比如關閉當前網頁窗口
1、關閉當前網頁窗口接口
2、監聽頁面返回事件
3、普通頁面一般使用popupstate實現返回,沒必要使用wx.onHistoryBack,因為這個函數只有企業微信支持,在微信上不支持。
var listenerBackHandler = { param: { isRun: false, returnUrl: "" //防止微信返回立即執行popstate事件 }, //初始化返回事件 initBackDirect: function (p_url) { listenerBackHandler.param.returnUrl = p_url; listenerBackHandler.param.isRun = true; listenerBackHandler.listenerBack(); }, listenerBack: function () { var state = { title: "title", url: "#" }; window.history.pushState(state, "title", "#"); window.addEventListener("popstate", function (e) { if (listenerBackHandler.param.isRun) { if (listenerBackHandler.param.returnUrl != "") { if (listenerBackHandler.param.returnUrl == "exit") { try { wx.closeWindow(); } catch (e) { console.log(e.message); } return false; } window.location.replace(listenerBackHandler.param.returnUrl); return false; } } }, false); }, //初始化返回事件 initBack: function (p_url) { listenerBackHandler.param.returnUrl = p_url; window.addEventListener('pageshow', function () { listenerBackHandler.param.isRun = false; setTimeout(function () { listenerBackHandler.param.isRun = true; }, 1000); //延遲1秒 防止微信返回立即執行popstate事件 listenerBackHandler.listenerBack(); }); } }
4、假如頁面A點回退退出當前頁面,頁面B點回退回到頁面A
5、如果快速點擊A,B頁面的回退,會發現頁面A並不會執行closeWindow,這是因為jsApi需要簽名,簽名需要時間,
$(function () {
history.pushState(null, null, document.URL);
listenerBackHandler.initBack("exit");
});
通過增加
history.pushState(null, null, document.URL);
即可解決來不及執行closeWindow問題。
6、另外一種方法,沒有試驗,直接禁用回退事件
<script language="javascript"> //防止頁面后退 history.pushState(null, null, document.URL); window.addEventListener('popstate', function () { history.pushState(null, null, document.URL); }); </script>
在timeout結束時在重新啟用popstate即可。
7、添加移除事件示例
// 向 <div> 元素添加事件句柄 document.getElementById("myDIV").addEventListener("mousemove", myFunction); // 移除 <div> 元素的事件句柄 document.getElementById("myDIV").removeEventListener("mousemove", myFunction);
上面方法理論上也可以處理進頁面就執行回退問題。
8、連續兩次回退問題
重現方法,在蘋果手機上
頁面A、B使用popstate檢測,頁面C什么代碼也不寫,當從頁面A進入頁面B到C再點物理鍵返回時,就會連續回退兩次到A.,解決辦法同1.