小程序webview中调用popstate返回
业务让做一个webview嵌入小程序中,操作webview内容跳转页面后,需要点击左上角返回小程序页面。发现webview中的页面如果有跳转,小程序的左上角返回执行的先是浏览器历史记录回退事件,当回退到最初进来的页面后,才会执行退出webview,回退到小程序页面中事件;
于是通过在webview中先清空历史记录再监听popstate方法做到webview无论跳转多少次都能执行小程序的返回事件;
参考代码如下:
window.onload = function(){
//创建script标签引入小程序jssdk
var scriptEl = document.createElement("script");
scriptEl.src = "https://res.wx.qq.com/open/js/jweixin-1.6.0.js";
document.body.appendChild(scriptEl);
if (wx != undefined && wx != null) {
//清空历史记录
history.pushState({ page: 1 }, null, window.location.href);
//监听popstate方法;
window.addEventListener("popstate", (event) => {
wx.miniProgram.navigateBack();
});
}
}
小程序popstate页面不交互回退失效问题
当使用popstate监听返回事件执行小程序的返回事件方法后,发现如果webview跳转后用户未在页面中进行交互,popstate监听不到!于是灵机一动,开始监听webview的window.unload、window.beforeunload、$(window).on('pagehide‘)事件, 如果用户未与webview交互,就执行了以上几个事件,说明用户是通过左上角触发的离开事件,我们再执行小程序的返回方法;
代码如下:
var isTouch = false;
$(function () {
//当页面进行过交互,则不执行小程序的返回事件,只当页面触发popstate方法时执行
document.body.addEventListener("touchstart", function () {
isTouch = true;
});
//监听unload事件,如果未交互则是小程序左上角返回
$(window).on("unload", function (event) {
// 例如保存数据、提示离开确认等
!isTouch && wx.miniProgram.navigateBack();
});
//监听pagehide事件,如果未交互则是小程序左上角返回
$(window).on("pagehide", function (event) {
// 例如保存数据、提示离开确认等
!isTouch && wx.miniProgram.navigateBack();
return true;
});
var scriptEl = document.createElement("script");
scriptEl.src = "https://res.wx.qq.com/open/js/jweixin-1.6.0.js";
document.body.appendChild(scriptEl);
//然后监听popstate事件
if (wx != undefined && wx != null) {
history.pushState({ page: 1 }, null, window.location.href);
window.addEventListener("popstate", (event) => {
wx.miniProgram.navigateBack();
});
}
});