1. 穿透问题可这么理解, 共有2种问题:
  问题1: 有A 和 B 两个弹层,B 弹层盖在A 弹层上面,B 弹层绑定 touchend 事件,当用户点击B 的时候 B隐藏,由于touchend 事件触发的太快了,导致用户点击到弹层下面的具有click 属性的元素的东东。(包括 A 标签<a href='#'></a> 或 input 框 或 绑定了 click 事件的元素)

  奇怪的是, 若给链接A 绑定了touchend 并且e.preventDefault() 也是不起作用。请看下面的例子,也就是它根本没有执行 touchend 事件,但是却执行了A 元素的 href 跳转链接。

<a href='https://www.baidu.com/'></a>

<script type='text/javascript'>
// B 是在 a 链接上面的弹层
B.on('touchend', function(){
B.hide();
}); // 大部分浏览器都不会执行 console.log,但是 ios 8.4 safari 不跳转,因为它本来就没有穿透问题。
$('a').on('touchend', function(e){
console.log('touchend');
e.preventDefault();
});
</script>

浏览器表现 :
  ios 8.4 safari 页面不跳转
  ios 8.4 UC 10.6.5.627 跳转
  ios 7.0 safari 跳转
  ios 7.0 UC 10.6.5.627 跳转
  SAMSUNG GT-19308 4.3 UC 10.6.5.627 跳转
  SAMSUNG GT-19308 4.3 跳转。 若直接点击链接 a,竟然会跳转,e.preventDefault() 竟然没作用,只有这个浏览器会。想点击 a 链接不跳转,只能绑定 click 事件并且 e.preventDefault();

  问题2:有A 和 B两个元素,B 元素盖在A 元素上面,B元素默认隐藏。A元素绑定事件让B 元素显示出来,B元素点击自己隐藏。出现的现象是: 点击A元素 B元素显示不出,因为触发了B元素里的代码。

A.on('touchend', function(){
B.show();
}); // 就算B 元素用 touchend 绑定, 有的手机也还是会触发 B.hide();
B.on('click', function(){
B.hide();
});

解决穿透问题1: 

各个浏览器的表现
  iOS 8.4 safari用touchend 关闭 不会穿透下面绑定的 click 事件, 所以什么事都不用做,很完美。
  iOS 8.4 和 iOS 7.0 UC浏览器弹窗关闭用 setTimeout(function(){ 弹层.hide() }, 0); 可以解决弹层穿透。
  另外备注下: UC 浏览器做过优化,下面的代码 click 事件比 touchend的触发的快。

$('.m').on('touchend', function(){
setTimeout(function(){
console.log('touchend');
}, 0);
}); $('.m').click(function(){
console.log('click');
});

iOS 7.0 safari的不行,只能用 e.preventDefault() 解决 或者设置 setTimeout(.. 360),而 e.preventDefault() 也支持 ios8.4 safari和UC版本的。

Android 的手机 4.1.1 JRO03L MIUI-JLB14.0, e.preventDefault();不能解决,但是 setTiemout 只要在 >=300 就可以解决了。

所以最终的解决办法:

  由于 iOS 7.0上 setTimeout 360毫秒 的时间太长了,所以直接给 B弹层绑定 e.preventDefault();

B.on('touchend', function(e){
e.preventDefault();
B.hide();
});

  Android上解决方式通过属性 pointer-events: none; 让整个页面都不能有点击的属性, 301秒以后恢复属性值。

B.on('touchend', function(){
$('html').css({
pointer-events: 'none'
});
setTimeout(function(){
$('html').css({
pointer-events: 'auto'
});
}, 301); B.hide();
});

解决穿透问题2:

  解决方式比较简单, A 里面用 e.preventDefault(), 注意A也不能绑定tap; B 绑定 touchend

A.on('touchend', function(e){
e.preventDefault();
B.show();
}); B.on('touchend', function(){
B.hide();
});

2. 当给一个元素绑定 touchend 事件和click事件, touchend事件让元素关闭,那么都不会触发到 click 事件,浏览器如下。
  SAMSUNG GT-19308 4.3 原生浏览器 和 UC浏览器 10.6.5.627
  IOS7.0 safari 和 UC浏览器 10.6.5.627
  IOS8.4 safari 和 UC浏览器 10.6.5.627

3. fastClick

通过绑定 body touchend,然后通过逻辑找到 e.target 元素,满足条件下执行 e.preventDefault(); 阻止了 click事件,然后让 initMouseEvent 和 dispatchEvent 来触发。

问题1的是否解决 的浏览器兼容如下:

SAMSUNG GT-19308 4.3 和 ios8.4
  原生浏览器和safari 可以
  UC浏览器都 可以

ios7.0 safri 和 UC浏览器 都不可以

4. 注意:若给 html 根元素绑定了
$('html').on('touchend', function(){ e.preventDefault(); })
则页面里所有的元素 click 绑定的事件都触发不了, input 都不能点击输入了。

WAP端 穿透问题和解决方法的更多相关文章

  1. MySQL程序端启动密码错误解决方法

    MySQL程序端启动密码错误解决方法 一般启动MySQL程序端,都是用mysql -uroot -p命令,当然前提是你的环境变量已经配好了. 为了连接服务器,当调用mysql时,通常需要提供一个MyS ...

  2. ajax跨域POST时执行OPTIONS请求服务端返回403forbidden的解决方法

    ajax访问服务端restful api时,由于contentType类型的原因,浏览器会先发送OPTIONS请求. 本人服务端用的是spring mvc框架,web服务器用的是tomcat的,以下给 ...

  3. ajax post 提交数据到服务端时中文乱码解决方法

    get 方式提交数据到服务端不会乱码,但对数据量有限制;post 可以提交大数据量,但中文会发生乱码,解决方法: 在JS上用使用 encodeURIComponent 对字符编码处理: student ...

  4. vue 移动端/PC常见问题及解决方法

    一.判断手机/PC浏览器语言 navigator.language // 返回语言代码 语言代码文档: http://www.lingoes.cn/zh/translator/langcode.htm ...

  5. [JavaEE]Get请求URI中带的中文参数在服务端乱码问题的解决方法

    在Get请求中,如果请求参数中带有中文,如 http://localhost:8080/DinnerParty/shop/search?query=多伦多, 在服务端拿到的是乱码. 这是因为客户端提交 ...

  6. Lodop条形码竖条和值右端不对齐的解决方法

    当Lodop条形码设置的宽度比较短,数值比较多的时候,会出现条码的竖条和右端不对齐.个人测试了一下,发现解决办法有三种:1.增加条形码的宽度.2.隐藏条码本身的值,用text文本代替.3.修改条形码下 ...

  7. Java 前台后台数据传递、中文乱码解决方法

    1.向前台传递数据;2.向后台传递数据;3.ajax post 提交数据到服务端时中文乱码解决方法;4.数组类型参数传递; 1.向前台传递数据:1.1 字符串数据传递:  这种方式只是单一的向前台传递 ...

  8. 移动端bug~~移动端:active伪类无效的解决方法【移动端 :active样式无效】

    移动端:active伪类无效的解决方法[移动端 :active样式无效]2016-09-26  15:46:50 问题: 移动端开发的时候实现按钮的点击样式变化,但是在iphone[safiri Mo ...

  9. 移动端前端笔记 — 遇到的常见JS与CSS问题及解决方法 ( 摘自zdwzdwzdw)

    笔者接触移动前端快一年了,特将平时的一些笔记整理出来,希望能够给需要的人一些小小的帮助.同时也由于笔者的水平有限,虽说都是笔者遇到过使用过的,但文中可能也会出现一些问题或不严谨的地方,望各位指出,不胜 ...

随机推荐

  1. 数据库MySQL基本语法思维导图

  2. SQL Server的高级知识

    DataSet的内容介绍,两种单例模式(并发量的考虑),SQL高级中的case语句.连接操作.子查询.派生表 -------------------------------- 1.Case的用法 使用 ...

  3. 关于import caffe出错的解决

    [http://blog.csdn.net/wuzuyu365/article/details/52431062]关于在caffe下,import caffe报错的解决:conda install p ...

  4. C#功能杂集

    使用unsafe代码 Unsafe, fixed, stackalloc 由于C#可以使用元数据,验证函数签名.对象类型,保证执行过程的安全,如果要使用指针,则不能进行验证,用unsafe表示.uns ...

  5. 安卓 JDK、SDK、ADT 区别

    问题一:android软件开发是用java语法,但是为什么开发环境还需要jdk,有android sdk不就可以了吗? 答: 我知道写字要用笔,但为什么还需要笔芯(墨水),有笔杆不就可以了吗? 问题二 ...

  6. JS获取上个月(转)

    1.yyyy-mm-dd获取上个月 function getUpMonth(t){ var tarr = t.split('-'); var year = tarr[0]; //获取当前日期的年 va ...

  7. [hihoCoder1329] 带Split和Merge的Treap

    题目链接:http://hihocoder.com/problemset/problem/1329 这题本来是学Splay的题,但是我为了练习Treap的Split和Merge操作,就借来用一用. 就 ...

  8. 利用SQL注入漏洞登录后台的实现方法

    利用SQL注入漏洞登录后台的实现方法 作者: 字体:[增加 减小] 类型:转载 时间:2012-01-12我要评论 工作需要,得好好补习下关于WEB安全方面的相关知识,故撰此文,权当总结,别无它意.读 ...

  9. 关于intellij IDEA 上junit的用法

    话说,最近正在看视频学java.里面有个叫做junit的东西很有用.但是实话说我摆弄了半天都没弄明白. 今天呢通过一些资料,终于弄清楚了junit的大致用法,这里写出来,用以分享和备忘. 首先,环境和 ...

  10. 利用MyEclipse自动生成POJO和配置文件

    1.选择MyEclipse菜单的window菜单的Open Perspective,选择MyEclipse Database Explorer,如图所示. 2.在MySql上面点击右键,选择eidt. ...