最近一直在忙于一个无线端的项目,由于之前主要工作都是在桌面端,移动端接触的比较少,所以中间遇到了很多的坑,做一个简单的记录。

问题背景

需求中有这样的一个功能,点击取件信息的时候会弹出一个地址列表的浮层,用户选择地址之后会将具体的地址回填到取件信息当中去。按道理讲,这是一个非常简单的功能,可是在开发过程中却遇到了很多非常诡异的事情。

初始的代码是这么写的:

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开发中的点击穿透问题的更多相关文章

  1. Touch事件在移动端web开发中的详解

    一.pc端事件回顾 HTML事件.DOM0事件.DOM2事件 事件对象. 如果上述概念不清楚,请先去了解. 二.移动端事件简介 2.1 pc端事件在移动端的问题 ​ 移动设备主要特点是不配备鼠标,键盘 ...

  2. 移动端web开发中对点透的处理,以及理解fastclick如何做到去除300ms延迟

     一.点透问题以及处理办法 开发中遇到一个问题,就是点击layer弹出框的取消按钮之后,按钮下方的click事件就直接触发了.直接看代码: $('.swiper-slide').on('click', ...

  3. 移动端web开发的一些知识点

    整理一下自己平时移动端web开发中遇到的问题,也参考一下前辈的一些总结 1.最常见的要数1像素边框了 因为Retine屏的分辨率始终是普通屏幕的2倍,1px的边框在dpr=2的retina屏下会显示成 ...

  4. 【初码干货】使用阿里云对Web开发中的资源文件进行CDN加速的深入研究和实践

    提示:阅读本文需提前了解的相关知识 1.阿里云(https://www.aliyun.com) 2.阿里云CDN(https://www.aliyun.com/product/cdn) 3.阿里云OS ...

  5. 移动端 Web 开发前端知识整理

    文章来源: http://www.restran.net/2015/05/14/mobile-web-front-end-collections/ 最近整理的移动端 Web 开发前端知识,不定期更新. ...

  6. 【前端】移动端Web开发学习笔记【1】

    下一篇:移动端Web开发学习笔记[2] Part 1: 两篇重要的博客 有两篇翻译过来的博客值得一看: 两个viewport的故事(第一部分) 两个viewport的故事(第二部分) 这两篇博客探讨了 ...

  7. 移动端web开发基础概念

    最近在了解移动端web开发的相关知识,有些概念总是模糊不清,这次花费了一些时间整体的梳理了一遍. 分辨率 分辨率可以从显示分辨率与图像分辨率两个方向来分类.显示分辨率(屏幕分辨率)是屏幕图像的精密度, ...

  8. Redis在WEB开发中的应用与实践

    Redis在WEB开发中的应用与实践 一.Redis概述: Redis是一个功能强大.性能高效的开源数据结构服务器,Redis最典型的应用是NoSQL.但事实上Redis除了作为NoSQL数据库使用之 ...

  9. Web开发中的主要概念

    一.Web开发中的主要概念1.静态资源:一成不变的.html.js.css2.动态资源:JavaWeb.输出或产生静态资源.(用户用浏览器看到的页面永远都是静态资源) 3.JavaEE:十三种技术的集 ...

随机推荐

  1. WinAPI 字符及字符串函数(10): lstrcpy - 复制字符串

    unit Unit1; interface uses   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, For ...

  2. [LeetCode 题解]: ZigZag Conversion

    前言   [LeetCode 题解]系列传送门:  http://www.cnblogs.com/double-win/category/573499.html   1.题目描述 The string ...

  3. 高德地图之c#后台获取一个或多个起点到单个终点的直线距离

    首先我们需要一个控制台添加一个新Key(可使用服务选择Web服务,测试的时候IP白名单先不填); 直线距离是通过后台get方式请求API服务地址http://restapi.amap.com/v3/d ...

  4. C#中数组作为参数传递的问题

    原则:尽可能控制对数据的修改,如果可以预测某个数据不会或不应该被改变,就要对其控制,而不要期望使用这个数据的调用者不会改变其值. 如果参数在使用过程中被意外修改,将会带来不可预知的结果,而且这种错误很 ...

  5. UML uml基础知识

    uml基础知识 一.了解: uml是Unified Modeling Language的缩写,意思是统一建模语言或标准建模语言. UML规范用来描述建模的概念有,类(对象的).对象.关联.职责.行为. ...

  6. mvn install 报错Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.3.2 错误: 找不到符号

    报错信息 在Eclipse中执行mvn install时,console端显示如下报错信息: [ERROR] Failed to execute goal org.apache.maven.plugi ...

  7. Origin如何使曲面变平滑?

    在“绘图属性” - “绘图细节”窗口中选中 Layer1 下的曲面数据,“Colormap/Contours” 选项下有“Level”标签,选中并设置“Minor Levels”,将其数值调大即可.

  8. drf序列化器serializers.SerializerMethodField()的用法

    问题描述: 为什么DRF中有时候返回的json中图片是带域名的,有时候是不带域名的呢? 解析: 带域名的结果是在view中对模型类序列化的,DRF在序列化图片的时候 会检查上下文有没有request, ...

  9. 求二叉树第K层的节点个数+求二叉树叶子节点的个数

    size_t _FindLeafSize(Node* root)     //求二叉树叶子节点的个数    {        //static size_t count = 0;        if ...

  10. iis7下站点日志默认位置

    在iis6时,通过iis管理器的日志配置可以找到站点日志存储的位置. 但是在iis7下,iis管理器下的日志配置只能找到iis日志配置的主目录,但到底在哪个子目录,则无法直接获知.     后来在主日 ...