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

问题背景

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

初始的代码是这么写的:

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. spark安装配置(scala不是必须的,基于java虚拟机,因此scala可以不配,但是开发需要可以配)

    下载 http://spark.apache.org/downloads.html 下载2.3.1 https://blog.csdn.net/qq_15349687/article/details/ ...

  2. Delphi iOS & macOS App 名称支持国际化多语显示

    作用:在 OSX 图标下方显示 App 中文繁体或简体的名称(系统自动选取) 适用:XE7, XE8 for OSX 操作: 创建一个新工程. 在工程目录下创建二个文件夹(zh_??.lproj)文件 ...

  3. WPF 控件库——仿制Windows10的进度条

    WPF 控件库系列博文地址: WPF 控件库——仿制Chrome的ColorPicker WPF 控件库——仿制Windows10的进度条 WPF 控件库——轮播控件 WPF 控件库——带有惯性的Sc ...

  4. 菜鸟的Xamarin.Forms前行之路——原生Toast的简单实现方法

    项目中信息提示框,貌似只有个DisplayAlert,信息提示太过于单一,且在有些场合Toast更加实用,以下是一个简单的原生Toast的实现方法 项目地址:https://github.com/we ...

  5. 201621123023《Java程序设计》第7周学习总结

    一.本周学习总结 1.1 思维导图:Java图形界面总结 二.书面作业 1. GUI中的事件处理 1.1 写出事件处理模型中最重要的几个关键词. 关键词:事件源.事件监听器.事件处理方法.事件适配器 ...

  6. iOS通过dSYM文件分析crash

    重点是dwarfdump --uuid命令 我们在iOS开发中会碰到的很多crash问题,如果Debug调试模式的话,我们可以往往很容易的根据log的输出定位到导致crash的原因,但对于已经上线的应 ...

  7. javascript显示年月日时间代码显示电脑时间

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. shell+crontab 实时服务进程监控重启

    #!/bin/sh #filename: checkProcess.sh #示例:每分钟检测httpd是否在运行,不在运行则重启 #crontab -e # 加入:*/ * * * * checkPr ...

  9. “全栈2019”Java第二十章:按位与、按位或、异或、反码、位运算

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  10. sublime基本命令和使用

    Ctrl+Shift+p  Package Control Ctrl+D 选词 (反复按快捷键,即可继续向下同时选中下一个相同的文本进行同时编辑)Ctrl+G 跳转到相应的行Ctrl+J 合并行(已选 ...