前端开发如今包含了跨浏览器,跨平台(不一样操做系统)和跨设备(不一样尺寸的设备)开发。html
在移动开发的过程当中,到底选取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()来解决。spa
2问题却没法调和。操作系统
其次,click事件存在的问题:scala
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的事件的好处是不该担忧页面点击穿透的问题。