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

问题背景

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

初始的代码是这么写的:

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. Linux 下几个重要目录解释

    linux下把所有的东西都当作文件的,,一个分区想要使用就需要挂载到一个文件夹上,那这个文件夹就叫挂载点,像常用的把 设备/dev/cdrom挂载到/mnt,,,你想问的应该是linux的各目录的解释 ...

  2. scalaWindows和Linux搭建

    Windows搭建 https://www.cnblogs.com/freeweb/p/5623372.html Linux搭建 https://www.cnblogs.com/freeweb/p/5 ...

  3. FileInputStream和FileOutStream的使用——文件字节输入/输出流

    最近又退回到java EE的学习,这篇博客就来讲解一下字节流中最重要的两个类FileInputStream和FileOutputStream的用法: FileInputStream:全称是文件字节输入 ...

  4. VC++中GDI和GDI+ 的坐标系统介绍

    在Windows应用程序中,只要进行绘图,就要使用GDI坐标系统.Windows提供了几种映射方式,每一种映射都对应着一种坐标系.例如,绘制图形时,必须给出图形各个点在客户区的位置,其位置用x 和y两 ...

  5. javascript 获取iframe里页面中元素值的方法 关于contentWindow和contentDocumen

    javascript 获取iframe里页面中元素值的方法 IE方法:document.frames['myFrame'].document.getElementById('test').value; ...

  6. 「ONTAK2010」 Peaks加强版

    题目链接 戳我 \(Solution\) 首先来介绍一下kruskal重构树:详见 知道kruskal重构树后这一道题就可以几乎没了. 利用kruskal重构树的性质,一个节点的左右儿子都比他小(其实 ...

  7. 记一次 Confluence 被攻击事件

    故事开始 4 月 14 日,星期天,天气不好,呆在家玩 LOL,正 Happy 的时候同事打电话给我,说 Confluence 看文档的时候挂了,报错:502. 一寻思,不就挂了吗,小意思,重启呗,于 ...

  8. Django-05模型层之多表操作2

    7.3 多表操作 一.创建模型 实例:我们来假定下面这些概念,字段和关系作者模型:一个作者有姓名和年龄.作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息.作者详情模型和作者模型之 ...

  9. 30.Rotate Image(矩阵旋转)

    Level:   Medium 题目描述: You are given an n x n 2D matrix representing an image. Rotate the image by 90 ...

  10. 实用的bash别名和函数

    本文来自于:程序师 作为一个命令行探索者,你或许发现你自己一遍又一遍重复同样的命令.如果你总是用ssh进入到同一台电脑,如果你总是将一连串命令连接起来,如果你总是用同样的参数运行一个程序,你也许希望在 ...