前端开发现在包含了跨浏览器,跨平台(不同操作系统)和跨设备(不同尺寸的设备)开发。

在移动开发的过程中,到底选取touch事件还是click事件?对了,请不要鄙视click,click在移动端开发用着也是不错的。

首先,我先说一下touch事件在开发中存在的两个问题:

1.touch事件在某些场景下存在点击穿透的问题。

2.touchstart事件时触摸屏幕就会触发,touchend事件是手指离开屏幕就会触发,而有时候,我们仅仅是只想滑动屏幕,却会触发这两个事件。

1问题的原因:移动端事件触发的事件顺序为touchstart-->touchend-->click。加入有两个元素A和B,B在A之上,当我们用touch事件中的回调函数让B元素隐藏,随后A元素触发了click事件。这是因为click事件有300ms的延迟,300ms之后,B元素隐藏了,浏览器触发了click事件,B元素隐藏了,该事件被派发到A 元素之上。

点击穿透的这个问题可以在touch事件中取消默认事件,e.preventDefault()来解决。

2问题却无法调和。

其次,click事件存在的问题:

1.click事件存在的问题,就是300ms的延迟问题。

很多开发者认为,在移动端开发崛起初期,用click事件是可以的,因为当时设备的反应却是仅就这300ms来说,是不易察觉的。但是,随着用户交互体验的要求越来越高,这300ms就变得无法忍受。

移动端300ms延迟的由来?

这要追溯至 2007 年初。苹果公司在发布首款 iPhone 前夕,遇到一个问题:当时的网站都是为大屏幕设备所设计的。于是苹果的工程师们做了一些约定,应对 iPhone 这种小屏幕浏览桌面端站点的问题。

这当中最出名的,当属双击缩放(double tap to zoom),这也是会有上述 300 毫秒延迟的主要原因。

双击缩放,顾名思义,即用手指在屏幕上快速点击两次,iOS 自带的 Safari 浏览器会将网页缩放至原始比例。 那么这和 300 毫秒延迟有什么联系呢? 假定这么一个场景。用户在 iOS Safari 里边点击了一个链接。由于用户可以进行双击缩放或者双击滚动的操作,当用户一次点击屏幕之后,浏览器并不能立刻判断用户是确实要打开这个链接,还是想要进行双击操作。因此,iOS Safari 就等待 300 毫秒,以判断用户是否再次点击了屏幕。 鉴于iPhone的成功,其他移动浏览器都复制了 iPhone Safari 浏览器的多数约定,包括双击缩放,几乎现在所有的移动端浏览器都有这个功能。之前人们刚刚接触移动端的页面,在欣喜的时候往往不会care这个300ms的延时问题,可是如今touch端界面如雨后春笋,用户对体验的要求也更高,这300ms带来的卡顿慢慢变得让人难以接受。

也就是说,浏览器会有一些默认的行为,如双击缩放,双击滚动等,这些行为主要是为桌面网站在移动着设备中浏览体验而设计的。而在用户进行操作的时候,移动浏览器会优先判断用户是否触发默认的行为。

浏览器开发商的解决方案:

1.禁用缩放。

当在html文档中包含如下标签:

<meta name="viewport" content="user-scalable=no"/>

<meta name="viewport" content="init-scale=1.0,maximum-scale=1.0" />

表明这个页面是不可以缩放的,那么双击缩放的功能就没有意义了,此时浏览器可以禁用默认的双击缩放行为并且去掉300ms的点击延迟。

这个方法的缺点是我们如果面对桌面应用的小字,放大看就不可能了。

这种方法完全禁用了缩放,而我们仅仅想禁用双击缩放行为。

2.改变默认的视口宽度

<meta name="viewport" content="width=device-width" />

一开始,为了让桌面站点能在移动浏览器正常显示,移动浏览器默认的视口宽度并不等于设备浏览器的视窗宽度,而是比设备视窗浏览器大,大约为980px.

我们通过上述标签设置移动浏览器的宽度等于设备的视窗宽度。随着响应式的普及,很多站点都已经对移动端做过适配了,这时候就不需要双击缩放了。如果能识别出一个网站是响应式网站,那么浏览器就可以认为已经对移动端做了优化和适配,那么久无需双击操作了。

这种方式比方法一的好处在于不用完全禁用缩放,而只是禁用了浏览器的双击缩放行为。

更多解决方案,查看这篇文章:http://www.jianshu.com/p/6e2b68a93c88

总而言之,在移动端开发的时候,如果页面比较简单,可以用touch事件,如果页面比较复杂,直接用click事件,同意用click的事件的好处是不应担心页面点击穿透的问题。

移动端开发用touch事件还是click事件的更多相关文章

  1. 移动端开发touchstart,touchmove,touchend事件详解和项目

    移动端开发touchstart,touchmove,touchend事件详解和项目 最近在做移动端的开发,在一个“服务商管理”页面使用到了触摸事件"touchstart",&quo ...

  2. 如何解决 touchstart 事件与 click 事件的冲突

    一 · 业务场景的描述 在对已完成的PC站点进行移动端适配时,我们想要站点在移动设备上有更快的响应速度,以带给用户更好的体验,此时,我们应该使用移动设备专用的事件系统,例如,使用 touchstart ...

  3. 移动端touch事件影响click事件以及在touchmove添加preventDefault导致页面无法滚动的解决方法

    这两天自己在写一个手机网页,用到了触屏滑动的特效,就是往右滑动的时候左侧隐藏的菜单从左边划出来. 做完之后在手机原生浏览器中运行正常,但在QQ和微信中打开,发现touchmove只会触发一次,而且to ...

  4. 移动端touch拖动事件和click事件冲突问题解决

    通过一个悬浮球交互功能的案例来阐述问题,以及解决办法. 实现效果 类似微信里的悬浮窗效果,苹果手机的悬浮球功能效果 可以点击拖动,然后吸附在窗口边缘 点击悬浮球,可以跳转界面,或者更改悬浮球的形态 准 ...

  5. tap,touch,touchstart,事件与click事件的区别

    根据源码所见, 移动端为了将将单击事件更加灵敏,所以现在的JQM,ST...框架都将JS单击事件封装成tap,或者touch或者touchstart事件, 其实现本质是将click触发多次,以打成移动 ...

  6. onblur事件和click事件冲突

    在js中onblur事件的优先级click事件,所以同一个元素上绑定两个事件的时候,onblur事件会冲掉click事件. 解决方案:将click事件改成mousedown事件

  7. 移动端touch事件影响click事件的相关解决方法

    preventDefault()的方法,阻止事件的默认行为. 在移动端,手指点击一个元素,会经过:touchstart --> touchmove -> touchend -->cl ...

  8. touchstart 事件与 click 事件的冲突

    const clickEvent = (function() {   if ('ontouchstart' in document.documentElement === true)     retu ...

  9. 移动端的touch click事件的理解+点透

    移动端在touch上一共有4个事件 touchstart touchmove touchend touchcancel, touchcancel, 一般来说,它们执行的顺序为 touchstart - ...

随机推荐

  1. 高性能高并发网站架构,教你搭建Redis5缓存集群

    一.Redis集群介绍 Redis真的是一个优秀的技术,它是一种key-value形式的NoSQL内存数据库,由ANSI C编写,遵守BSD协议.支持网络.可基于内存亦可持久化的日志型.Key-Val ...

  2. sqlserver 表值函数与标量值函数

    除了在我们常用的程序开发中要用到函数外,在sql语句中也常用到函数,不论哪种,思想都没有变,都是为了封装,可复用. 创建的方法和整体结构都大体相同,都少不了函数名,函数的形参,返回值等这些. 一.表值 ...

  3. Swift的访问控制讲解

    Swift中访问修饰符总共有5种,分别为fileprivate,private,internal,public和open,其中,fileprivate以及open是Swift 3新添加的.因为过去的S ...

  4. ZooKeeper —— 单机环境和集群环境搭建

    一.单机环境搭建 1.1 下载 下载对应版本Zookeeper,这里我下载的版本3.4.14.官方下载地址:https://archive.apache.org/dist/zookeeper/ # w ...

  5. Spark学习之路(十)—— Spark SQL 外部数据源

    一.简介 1.1 多数据源支持 Spark支持以下六个核心数据源,同时Spark社区还提供了多达上百种数据源的读取方式,能够满足绝大部分使用场景. CSV JSON Parquet ORC JDBC/ ...

  6. 不懂数据库索引的底层原理?那是因为你心里没点b树

    本文在个人技术博客不同步发布,详情可用力戳 亦可扫描屏幕右侧二维码关注个人公众号,公众号内有个人联系方式,等你来撩...   前几天下班回到家后正在处理一个白天没解决的bug,厕所突然传来对象的声音: ...

  7. leadcode的Hot100系列--104. 二叉树的最大深度

    依然使用递归思想. 思路: 1.树的深度 = max (左子树深度,右子树深度)+ 1 . ------> 这里的加1是表示自己节点深度为1. 2.如果当前节点为null,则说明它的左右子树深度 ...

  8. ZOJ 3962:Seven Segment Display(思维)

    https://vjudge.net/problem/ZOJ-3962 题意:有16种灯,每种灯的花费是灯管数目,代表0~F(十六进制),现在从x开始跳n-1秒,每一秒需要的花费是表示当前的数的花费之 ...

  9. scrapy基础知识之将item写入JSON文件:

    pipelines.py import json class xxPipeline(object):     def __init__(self):         self.filename=ope ...

  10. 数据结构与算法分析(C++)读书笔记

    第一章 综述 数学知识复习: 指数.对数.级数.模运算.证明方法(证明数据结构分析几轮最常用方法:归纳法.反证法) 递归简论 C++知识:类.细节.模板.矩阵.