js监听手机端点击物理返回键或js监听pc端点击浏览器返回键
之前在项目中遇到一个问题,就是在微信网页上面本来是有返回按钮的,但是大多数人都为了方便,会使用安卓手机自带的物理返回键,这个返回键按下后,就会按照你浏览器的栈存储的路径来一层一层返回,就不执行你页面上的那个返回按钮的操作了,但是这个物理返回键的监听好像没有直接的办法进行,所以有人就想到了曲线的办法
原理:
- 页面加载完成时,调用history.pushState写入一个指定状态STATE,并监听window.onpopstate;
- 当onpopstate被触发时,检查event.state是否等于STATE,如果相等,表示页面发生了后退(按下返回键或者浏览器的后退按钮),则把这次行为当作是返回键被按下了(把点击浏览器的后退按钮也误算进来了,不过没啥好法子了呀)。
为了方便调用,有人把这个逻辑稍微封装了下,代码见这里(https://github.com/iazrael/xback)
使用方法:
将此插件引进去后,使用方法:
XBack.listen(function(){
    alert('ah, press press press');
});
具体使用的时候,也有一些问题:
因为这个是实现利用histroy.pushState写入了一个指定状态STATE,你点击一次后,这个写入的状态就没有了,如果你没有后退页面(还在当前页面),上次那个监听的操作执行完后,你还需要监听这个物理返回键,这时候你就需要再上次那个操作完之后再使用histroy.pushState再写入一次之前写入的那个状态,这样下次会继续监听那个物理返回键,否则下次你再点击那个返回键的话,就会直接返回浏览器的栈的上一级
- 如果项目本身使用了pushState,则历史记录会有瑕疵(多了一个历史);
- 浏览器的后退按钮点击以及调用history.back()也会被当成按下了返回键。
举个例子:
我在vue的项目中引入xback.js
<remote-script src="/js/xback.js" @load="load_xback"></remote-script>
关于上面在vue中引入外部js,请参考 http://www.cnblogs.com/zhuchenglin/p/7455203.html
然后在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
js监听手机端点击物理返回键或js监听pc端点击浏览器返回键的更多相关文章
- js 时间转成时间戳对比;My97DatePicker日历控件时间格式;Date.parse Firefox火狐浏览器返回Nan的解决办法
		有个情况,我在显示时间的时候是需要显示为 2013年8月15日 14时28分15秒 但是假如我用js去获取到这个时间,并且想进行时间对比的时候,这个时间2013年8月15日 14时28分15秒根本就 ... 
- 用BroadcastReceiver监听手机网络状态变化
		android--解决方案--用BroadcastReceiver监听手机网络状态变化 标签: android网络状态监听方案 2015-01-20 15:23 1294人阅读 评论(3) 收藏 举报 ... 
- Android时时监測手机的旋转角度 依据旋转角度确定在什么角度载入竖屏布局 在什么时候载入横屏布局
		一.场景描写叙述: 最近开发中遇到个问题,就是我们在做横竖屏切换的功能时.横竖屏布局是操作系统去感知的,作为开发员没法确定Activity在什么时候载入横屏布局,在什么时候载入竖屏布局.因此为了找到载 ... 
- 知识点---js监听手机返回键,回到指定界面
		方法一. $(function(){ pushHistory(); window.addEventListener(“popstate”, function(e) { window.location ... 
- 微信浏览器返回刷新,监听微信浏览器返回事件,网页防复制,移动端禁止图片长按和vivo手机点击img标签放大图片
		以下代码都经过iphone7,华为MT7 ,谷歌浏览器,微信开发者工具,PC端微信验证.如有bug,还请在评论区留言. demo链接:https://pan.baidu.com/s/1c35mbjM ... 
- JavaScript监听手机物理返回键的两种解决方法
		JavaScript没有监听物理返回键的API,所以只能使用 popstate 事件监听. 有两个解决办法: 1.返回到指定的页面 pushHistory(); window.addEventList ... 
- VueApp监听手机物理返回键的事件
		代码 第一步创建js文件夹子 在main里面引用 JS文本内容如下 //监听手机物理返回键的事件 document.addEventListener('plusready', function() ... 
- js history对象 手机物理返回键
		有兴趣的可以了解下history对象,不感兴趣也可以直接跳到手机物理返回键监听部分 使用场景: 场景1:项目中一个表单页面,需得填写验证码,填写验证码后提交,由于使用的form直接提交,没有使用AJA ... 
- 使用ionic开发时用遇到监听手机返回按钮的问题~
		当时用的是ionic开发一个app,需求是,当按下手机的返回按钮,在指定的页面双击退出,而在其他页面点击一次返回到上个页面: 其实用ionic自带的服务就可以解决: //双击退出 $ionicP ... 
随机推荐
- Android SDK版本号 与 API Level 对应关系
			转自:https://blog.csdn.net/qiaoquan3/article/details/70185550 Android SDK版本号 与 API Level 对应关系 新接触And ... 
- .Net转Java.02.数据类型
			.NET中常见的数据类型分类分别是值类型和引用类型 值类型包括(基元类型.struct.枚举) 引用类型包括(类.类.数组.接口.指针) Java分为,基本类型和类 C# Java 值类型 ... 
- Android的Databinding-需要使用控件id,listener以及布局有include的场景
			主的布局xml文件: <layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:bin ... 
- C# SemaphoreSlim 实现
			当多个任务或线程并行运行时,难以避免的对某些有限的资源进行并发的访问.可以考虑使用信号量来进行这方面的控制(System.Threading.Semaphore)是表示一个Windows内核的信号量对 ... 
- Mongodb: Sort operation used more than the maximum 33554432 bytes of RAM
			上线许久的产品突然爆出了一个Mongodb 查询的BUG,错误如下: "exception":"org.springframework.data.mongodb.Unca ... 
- Redis接口的调用
			1.hiredis是redis数据库的C接口,目录为/redis-3.2.6/deps/hiredis 2.示例代码如下: #include <stdio.h> #include < ... 
- Windows平台下nginx跨域配置
			1)下载地址: http://nginx.org 2)启动 解压至d:\nginx,运行nginx.exe(即nginx -c conf\nginx.conf),默认使用80端口,日志见文件夹D:\n ... 
- Javascript : require.js 的使用(例子)
			demo 结构: config.js require.config({ baseUrl: 'js/lib', paths: { 'jquery' : 'jquery-1.11.1.min', ... 
- iframe相关小结
			父页面调用子页面方法, 子页面加载父页面传送的数据记录了父子间的调用和数据加载. 以下是另一些关于iframe的小结: 1:document.getElementById("ii" ... 
- 手把手教你用Strace诊断问题[转]
			早些年,如果你知道有个 strace 命令,就很牛了,而现在大家基本都知道 strace 了,如果你遇到性能问题求助别人,十有八九会建议你用 strace 挂上去看看,不过当你挂上去了,看着满屏翻滚的 ... 
