微信内置浏览器点击“返回”关闭窗口

场景:开发微信内的H5活动,须要进行微信受权,咱们采用的是在一个静态页面(只有js,因此是个空白页面)内进行受权,受权后再跳转到活动主页。前端

客户需求:从活动主页返回时不显示这个受权页面(空白页面),直接退出。浏览器

解决方案:(方案一为踩过的坑;方案二为放在前端处理的方案)微信

方案一:(不可行session

直接监听须要关闭窗口的页面的返回事件来关闭窗口。示例代码:测试

 1 pushHistory();
 2         window.addEventListener("popstate", function (e) {
 3             WeixinJSBridge.call('closeWindow');
 4         }, false);
 5         function pushHistory() {
 6             var state = {
 7                 title: "title",
 8                 url: "#"
 9             };
10             window.history.pushState(state, "title", "#");
11         }

此方案存在的bug:在微信内置浏览器内该事件会继承到子页面(须要关闭窗口的页面为主页面,在主页面跳转到的其余页面称为子页面),在子页面点击返回也会关闭窗口。(暂未找到缘由所在,若有大牛解决,欢迎留言指导~)优化

方案二:(可行url

在方案一的基础上优化,加入session判断当前页面是否为须要关闭窗口的页面。示例代码:spa

 1      sessionStorage.setItem('key', 1);

       pushHistory(); 2 window.addEventListener("popstate", function (e) { 3 if(sessionStorage.getItem('key') != 1) { 4 sessionStorage.setItem('key', 1); 5 } 6 if(sessionStorage.getItem('key') == 1) { 7 document.addEventListener('WeixinJSBridgeReady', function(){ WeixinJSBridge.call('closeWindow'); }, false);  8 WeixinJSBridge.call('closeWindow'); 9 parent.WeixinJSBridge.call('closeWindow');//网上有人认为微信内置浏览器和本地开发测试的环境不同,微信内部是采用iframe方式加载页面的(暂未获得考证),因此我采用了两种方式都写的兼容写法 10 } 11 12 }, false); 13 function pushHistory() { 14 var state = { 15 title: "title", 16 url: "#" 17 }; 18 window.history.pushState(state, "title", "#"); 19 }
思路:将主页面(须要关闭窗口的页面)的key值设为1,子页面(从主页面跳转到的其余页面)的key值设为其余任意值,判断key值是否为1,为1的时候点击返回再关闭窗口。(注意:每次进到主页面的时候都要将key值重置为1。
   由于session的生命周期是当前窗口,从其余页面子页面回到主页面会改变key)
方案三:(替换方案
在受权页面加入活动方的宣传广告,避免空白。
方案四:(最优方案微信受权放在后台进行,这样就不会存在这个受权页面,也就不用去考虑会出现空白的问题了。
相关文章
相关标签/搜索