说说移动端web开发中的点击穿透问题
最近一直在忙于一个无线端的项目,由于之前主要工作都是在桌面端,移动端接触的比较少,所以中间遇到了很多的坑,做一个简单的记录。
问题背景
需求中有这样的一个功能,点击取件信息的时候会弹出一个地址列表的浮层,用户选择地址之后会将具体的地址回填到取件信息当中去。按道理讲,这是一个非常简单的功能,可是在开发过程中却遇到了很多非常诡异的事情。
初始的代码是这么写的:
var pickupInfo = $("#pickupInfo");
pickupInfo.on("tap", function () {
var addressList = $("#addressList");
addressList.show();
});
window.addEventListener("message", function () {
// 回填地址信息
});
// addressList 是一个浮层
$("#addressList li").on("click", function () {
// 此处回填地址到取件信息中去
// 具体方式则是通过iframe的postMessage发送消息,pickupInfo那边接收消息后填充
});
为了更清楚的说明问题,此处删除了很多的业务逻辑。
在测试过程中就发现了一个诡异的问题,在点击pickupInfo的时候,addressList浮层闪了一下就消失了,弹出addressList浮层后立即回填了地址信息。
因为一开始也没有太注意观察,跟代码的过程中发现只要浮层一弹出,pickupInfo那边就立即收到了message事件信息。当时第一反应感觉是地址列表那边出了问题,看了好几遍代码,一直没发现哪里有问题,也跟了几次,每次都是地址列表一弹出就立即触发了click事件。
奇了个怪了!
点击穿透
试着描述了下问题google了一把,可能是描述的不太准确,啥也没搜着。没办法了,瞪大眼睛再操作一遍。这时候奇迹出现了,我发现每次点击pickupInfo,都在选中addressList中相对于屏幕与pickupInfo相同位置的地址。
查看了下事发地点的代码,然后在google中敲下了这几个字“移动端 tap”,一大堆的结果,看了几篇文章,终于找到了问题的答案。
先说说touch事件吧。
我们知道,PC上有鼠标事件,一次点击可以拆分成mousedown > click > mouseup 三步。移动端没有鼠标,但是有类似的触摸事件,用户的一次点击可以分为touchstart > touchmove > touchend。 虽然手机上没有mouse事件,但是手机依然可以响应mouse事件,为什么呢?是通过touch事件来模拟的。有人曾经对比测试过手机上和PC上的mouse事件,发现手机上的mouse要慢一些,大概在300m左右。
再说说tap事件。
在PC端,我们经常使用到click事件,对应到移动端,我们使用tap事件。但原生的touch事件本身是没有tap的,也是通过模拟产生的。在Zepto中,如果在touchend事件响应250ms无操作后,会触发singleTap事件。
// trigger single tap after 250ms of inactivity
else {
touchTimeout = setTimeout(function(){
touchTimeout = null
if (touch.el) touch.el.trigger('singleTap')
touch = {}
}, 250)
}
至此,点击穿透的原因就明了了。
当pickupInfo监听的tap事件得到响应之后,会立即弹出addressList浮层,此时浏览器还会触发click事件,而此时原来的pickupInfo已经完全被addressList遮罩,所以click事件就被触发在了与pickupInfo相同位置的addressList中对应的区域,也就正好响应了addressList中监听的click事件。
世事奈何如此之巧~
解决方案
问题清楚了,修改方法也就明确了,由于项目还在开发中,个人觉得当前的方案还不是特别好,后续优化后再贴出来。这里贴篇文章,也来说说touch事件与点击穿透问题,里面对touch和tap事件做了详细的说明,对点击穿透问题也提到了几个方案,可以参考。
小结
这两天一直在忙于赶开发进度,对于过程中遇到的一些典型的问题做一些记录,算是一种沉淀吧~~
说说移动端web开发中的点击穿透问题的更多相关文章
- Touch事件在移动端web开发中的详解
一.pc端事件回顾 HTML事件.DOM0事件.DOM2事件 事件对象. 如果上述概念不清楚,请先去了解. 二.移动端事件简介 2.1 pc端事件在移动端的问题 移动设备主要特点是不配备鼠标,键盘 ...
- 移动端web开发中对点透的处理,以及理解fastclick如何做到去除300ms延迟
一.点透问题以及处理办法 开发中遇到一个问题,就是点击layer弹出框的取消按钮之后,按钮下方的click事件就直接触发了.直接看代码: $('.swiper-slide').on('click', ...
- 移动端web开发的一些知识点
整理一下自己平时移动端web开发中遇到的问题,也参考一下前辈的一些总结 1.最常见的要数1像素边框了 因为Retine屏的分辨率始终是普通屏幕的2倍,1px的边框在dpr=2的retina屏下会显示成 ...
- 【初码干货】使用阿里云对Web开发中的资源文件进行CDN加速的深入研究和实践
提示:阅读本文需提前了解的相关知识 1.阿里云(https://www.aliyun.com) 2.阿里云CDN(https://www.aliyun.com/product/cdn) 3.阿里云OS ...
- 移动端 Web 开发前端知识整理
文章来源: http://www.restran.net/2015/05/14/mobile-web-front-end-collections/ 最近整理的移动端 Web 开发前端知识,不定期更新. ...
- 【前端】移动端Web开发学习笔记【1】
下一篇:移动端Web开发学习笔记[2] Part 1: 两篇重要的博客 有两篇翻译过来的博客值得一看: 两个viewport的故事(第一部分) 两个viewport的故事(第二部分) 这两篇博客探讨了 ...
- 移动端web开发基础概念
最近在了解移动端web开发的相关知识,有些概念总是模糊不清,这次花费了一些时间整体的梳理了一遍. 分辨率 分辨率可以从显示分辨率与图像分辨率两个方向来分类.显示分辨率(屏幕分辨率)是屏幕图像的精密度, ...
- Redis在WEB开发中的应用与实践
Redis在WEB开发中的应用与实践 一.Redis概述: Redis是一个功能强大.性能高效的开源数据结构服务器,Redis最典型的应用是NoSQL.但事实上Redis除了作为NoSQL数据库使用之 ...
- Web开发中的主要概念
一.Web开发中的主要概念1.静态资源:一成不变的.html.js.css2.动态资源:JavaWeb.输出或产生静态资源.(用户用浏览器看到的页面永远都是静态资源) 3.JavaEE:十三种技术的集 ...
随机推荐
- hibernate通过SQL更新数据
@Resource(name = "hibernateTemplate") public HibernateTemplate hibernateTemplate; /** * @T ...
- Python3 MySQL 数据库连接 -PyMySQL
Python 3 操作mysql http://www.runoob.com/python3/python3-mysql.html Python3 MySQL 数据库连接 本文我们为大家介绍 Pyt ...
- 洛谷P4149 [IOI2011]Race(点分治)
题目描述 给一棵树,每条边有权.求一条简单路径,权值和等于 KK ,且边的数量最小. 输入输出格式 输入格式: 第一行:两个整数 n,kn,k . 第二至 nn 行:每行三个整数,表示一条无向边的 ...
- Java菜鸟之java基础语法,运算符(三)
赋值运算符 (一)JAVA种的赋值运算符 = ,代表代表的等于,一般的形式是 左边变量名称 = 右边的需要赋的指或者表达式,如果左侧的变量类型级别比较高,就把右侧的数据转换成左侧相同的高 ...
- no getter for property named 'power_state
错误信息:nested exception is org.apache.ibatis.reflection.ReflectionException: There is no getter for pr ...
- iTerm2 + Oh My Zsh 打造舒适终端体验
iTerm2 + Oh My Zsh 打造舒适终端体验 写在前面 最终效果图: 因为powerline以及homebrew均需要安装command line tool,网络条件优越的同学在执行本文下面 ...
- dede上传文件乱码问题解决
修改下列两个文件: /include/dialog/select_soft_post.php/include/dialog/select_soft.php 改: select_soft.php文件第1 ...
- Visual Studio Error
Visual Studio Error 注意:文中所有“系统”用词,均指Windows Console操作系统IO Debug Error 错误类型 #0表示调用约定错误 可以考虑在指针前面加上_st ...
- 给刚玩Hadoop的朋友一些建议
随着两会中间央视新闻天天说大数据,很多人纷纷开始关注大数据和Hadoop以及数据挖掘和数据可视化了,我现在创业,遇到很多传统数据行业往Hadoop上面去转型的公司和个人,提了很多问题,大多数问题还都是 ...
- Hbase的安装与测试
实验环境 虚拟机伪分布式 Ubuntu 17.10 JDK 1.8 Hadoop 2.7.6 Hbase 1.3.3 ①安装和配置HBase. 首先从官网http://archive.apache.o ...