以前在项目中遇到一个问题,就是在微信网页上面原本是有返回按钮的,可是大多数人都为了方便,会使用安卓手机自带的物理返回键,这个返回键按下后,就会按照你浏览器的栈存储的路径来一层一层返回,就不执行你页面上的那个返回按钮的操做了,可是这个物理返回键的监听好像没有直接的办法进行,因此有人就想到了曲线的办法javascript
原理:html
为了方便调用,有人把这个逻辑稍微封装了下,代码见这里(https://github.com/iazrael/xback)vue
使用方法:java
将此插件引进去后,使用方法:git
XBack.listen(function(){ alert('ah, press press press'); });
具体使用的时候,也有一些问题:github
由于这个是实现利用histroy.pushState写入了一个指定状态STATE,你点击一次后,这个写入的状态就没有了,若是你没有后退页面(还在当前页面),上次那个监听的操做执行完后,你还须要监听这个物理返回键,这时候你就须要再上次那个操做完以后再使用histroy.pushState再写入一次以前写入的那个状态,这样下次会继续监听那个物理返回键,不然下次你再点击那个返回键的话,就会直接返回浏览器的栈的上一级浏览器
举个例子:微信
我在vue的项目中引入xback.jsthis
<remote-script src="/js/xback.js" @load="load_xback"></remote-script>
关于上面在vue中引入外部js,请参考 http://www.cnblogs.com/zhuchenglin/p/7455203.htmlspa
而后在vue中定义一个load_xback 方法
load_xback(){ var self = this XBack.listen(function(){
//这个是vux的确认弹出框 self.$vux.confirm.show({ title:'确认返回吗?', content:'确认后,将返回', onConfirm () { //确认返回操做 }, onCancel(){ history.pushState('x-back', null, location.href); // XBack.record; } }) }); },
xback源码:
;!function(pkg, undefined){ var STATE = 'x-back'; var element; var onPopState = function(event){ event.state === STATE && fire(); } var record = function(state){ history.pushState(state, null, location.href); } var fire = function(){ var event = document.createEvent('Events'); event.initEvent(STATE, false, false); element.dispatchEvent(event); } var listen = function(listener){ element.addEventListener(STATE, listener, false); } ;!function(){ element = document.createElement('span'); window.addEventListener('popstate', onPopState); this.listen = listen; this.record = record(STATE); record(STATE); }.call(window[pkg] = window[pkg] || {}); }('XBack');
这个方法目前只对支持h5浏览器有效
本文参考:http://blog.csdn.net/kongjiea/article/details/22850629
如需转载此文,请在下面注明出处:http://www.cnblogs.com/zhuchenglin/p/7607768.html