移动端的touch事件

触摸事件的起源

随着智能手机和平板电脑的普及, 越来越多的人用移动设备浏览网页,我们平时在pc浏览器上用的鼠标事件,比如:click, mouseover等, 已经无法满足移动设备触摸屏的特点,触摸时代的到来,离不开那些触摸事件。
触摸事件touchstart、touchmove和touchend的出现是因为iOS版Safari浏览器为了向开发人员传达一些信息而新添加的事件。因为ios设备既没有鼠标也没有键盘,所以在为移动Safari浏览器开发交互性网页的时候,PC端的鼠标和键盘事件是不够用的。
在iPhone 3Gs发布的时候,其自带的移动Safari浏览器就提供了一些与触摸(touch)操作相关的新事件。随后,Android上的浏览器也实现了相同的事件。触摸事件(touch)会在用户手指放在屏幕上面的时候、在屏幕上滑动的时候或者是从屏幕上移开的时候出发。

事件类型

1.touchstart事件(触摸开始事件):当手指触摸屏幕时候触发,即使已经有一个手指放在屏幕上也会触发(触发一次)。
2.touchmove事件(触摸移动事件):当手指在屏幕上滑动的时候连续地触发。在这个事件发生期间,调用preventDefault()事件可以阻止滚动(当手指在屏幕上滑动,就会一直触发)。
3.touchend事件(触摸结束事件):当手指从屏幕上离开的时候触发。(触发一次)
4.touchcancel事件(触摸中断事件):当触摸中断时候触发。

注意:上面的这些事件都会冒泡,也都可以取消。

属性

虽然这些触摸事件没有在DOM规范中定义,但是它们却是以兼容DOM的方式实现的。所以,每个触摸事件的event对象都提供了在鼠标实践中常见的属性:
1.bubbles – 起泡事件的类型
2.cancelable – 是否用 preventDefault() 方法可以取消与事件关联的默认动作
3.clientX – 返回当事件被触发时,鼠标指针的水平坐标
4.clientY – 返回当事件触发时,鼠标指针的垂直坐标
5.screenX – 当某个事件被触发时,鼠标指针的水平坐标
6.screenY – 返回当某个事件被触发时,鼠标指针的垂直坐标
7.altKey – 该属性返回一个布尔值,表示在指定的事件发生时,Alt 键是否处于按下状态, event.altKey=true\false或者1\0
8.type – 触摸时触发的事件类型,比如touchstart

并且每个触摸事件都包括了三个触摸属性列表:
1 .touches:当前位于屏幕上的所有手指触摸点的一个列表
2. targetTouches:当前元素对象上所有触摸点的列表
3. changedTouches:涉及当前事件的触摸点的列表
例:

<body>
<style>
#dom {width:500px;height:500px;background:black;
}
</style>
<div id="dom"></div>
<script>
function onTouchStart(e){console.log(e);
}
function start(){var dom = document.getElementById('dom');dom.addEventListener('touchstart', onTouchStart, false);
}
</script>
</body>

控制台输出如下:

触摸事件跟鼠标事件的触发先后顺序

touchstart > toucheend > mousemove > mousedown > mouseup > click

移动端触屏click点击事件延迟问题的解决方案

click事件在移动端和pc端均可以触发,但是在移动端有延迟现象。
1、背景
由于早期移动设备浏览网页时内容较小,为了增强用户体验,苹果公司专门为移动设备设计了双击放大的功能,以确保用户可以方便地放大网页内容,但是当用户单击按钮的时候,移动设备需要延迟约300ms执行,以判断用户是否是要双击。
2.解决方案
给移动端加视口,禁止缩放(慎用。因为在移动端没有视口的情况下,用户是可以进行缩放的,默认会存在双击放大的功能,禁用后,那么双击放大的功能也就没有了)
例:

<meta name="viewport" content="width=device-width, user-scalable=no">
<!-- 关键词 user-scalable = no -->

使用touch事件模拟一个点击事件

如下使用touchstart和touched封装了一个移动端的tap事件。
例:

var idcast = {//传入dom元素tap:function(dom,callback) {//判断是否传入了dom元素,或者dom元素是否是一个对象if(!dom||typeof dom != "object"){return;}var startX,startY,time,moveX,moveY,distanceX,distanceY;dom.addEventListener("touchstart",function(e) {if(e.targetTouches.length>1) {return;}startX = e.targetTouches[0].clientX;startY = e.targetTouches[0].clientY;time = Date.now();});dom.addEventListener("touchend",function(e) {if(e.changedTouches.length>1) {//说明不止一个手指return;}//判断时间差异if(Date.now()-time>150){//长按操作return;}//获取松开手指的时候的坐标与触摸开始时的坐标差异moveX = e.changedTouches[0].clientX;moveY = e.changedTouches[0].clientY;distanceX = moveX - startX;distanceY = moveY - startY;//判断坐标差异if(Math.abs(distanceX) < 6 && Math.abs(distanceY) <6) {//说明是点击而非滑动//执行tap事件相应之后的处理操作//若函数不为空才调用callback&&callback(e);console.log("移动端点击单击事件--tap事件");}})}}

使用fastclick.js插件
fastclick.js是FT Labs专门为解决移动端浏览器 300 毫秒点击延迟问题所开发的一个轻量级的库。简而言之,FastClick 在检测到 touchend 事件的时候,会通过 DOM 自定义事件立即触发一个模拟 click 事件,并把浏览器在 300 毫秒之后真正触发的click事件阻止掉。 FastClick 的使用方法非常简单,在DOMContentLoaded事件之后,在body上调用FastClick.attach()即可。
例:

 if ('addEventListener' in document) {document.addEventListener('DOMContentLoaded', function() {FastClick.attach(document.body);}, false);}

attach方法虽可在更具体的元素上调用,直接绑定到body上可以确保整个应用都能受益。当 FastClick 检测到当前页面使用meta设置了user-scalable=no或者 touch-action 属性的解决方案时,会静默退出。可以说,这是真正的跨平台方案出来之前一种很好的变通方案。

移动端的touch事件详解相关推荐

  1. html5触屏滑动事件,HTML5的touch事件详解

    原标题:HTML5的touch事件详解 HTML5中新添加了很多事件,比较常看到的是touch事件,下面来详解下html5中的触摸touch事件. touchstart:触摸开始的时候触发touchm ...

  2. 移动端web开发---Touch事件详解

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

  3. JavaScript中 Touch 事件详解

    1. touch 事件简介 touchstart 事件:当手指触摸屏幕时候触发,即使已经有一个手指放在屏幕上也会触发: touchmove 事件:当手指在屏幕上滑动的时候连续地触发.在这个事件发生期间 ...

  4. javaScript -- touch事件详解(touchstart、touchmove和touchend)

    HTML5中新添加了很多事件,但是由于他们的兼容问题不是很理想,应用实战性不是太强,所以在这里基本省略,咱们只分享应用广泛兼容不错的事件,日后随着兼容情况提升以后再陆续添加分享.今天为大家介绍的事件主 ...

  5. touch事件详解(touchstart、touchmove和touchend)

    touchstart事件:当手指触摸屏幕时候触发,即使已经有一个手指放在屏幕上也会触发. touchmove事件:当手指在屏幕上滑动的时候连续地触发.在这个事件发生期间,调用preventDefaul ...

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

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

  7. 关于移动端的touch事件(touchstart, touchmove, touchend,touchcancel)

    移动端的touch事件 四种touch事件 touchstart: //手指放到屏幕上时触发 touchmove: //手指在屏幕上滑动式触发 touchend: //手指离开屏幕时触发 touchc ...

  8. android 拖动 点击事件,Android事件详解——拖放事件DragEvent

    1.Android拖放框架的作用? 利用Android的拖放框架,可以让用户用拖放手势把一个View中的数据移到当前layout内的另一个View中去. 2.拖放框架的内容? 1)拖放事件类 2)拖放 ...

  9. Cesium 事件详解(鼠标事件、相机事件、键盘事件、场景触发事件)

    Cesium 事件详解(鼠标事件.相机事件.键盘事件.场景触发事件) 1 Cesium中的事件 根据使用情况,我把Cesium中的事件大体分为三种,即屏幕空间事件处理程序,屏幕空间相机控制器,场景触发 ...

最新文章

  1. 朴素、Select、Poll和Epoll网络编程模型实现和分析——Poll模型
  2. 洛谷 1658 购物
  3. WebPart的Web部件页部署时发生错误--小窍门
  4. threejs 物体根据相机位置显示_认识Threejs
  5. 剑指offer之数据流中的中位数
  6. JavaScript 操作剪贴板
  7. python basic programs
  8. 循序渐进之Spring AOP(1) - 原理
  9. 五分钟搭建起一个包含CRUD功能的JqGrid表格
  10. 购机测试软件重装上阵
  11. PMP学习笔记 第11章 项目风险管理
  12. 1、4G杂项:Air72XUX平台secure boot使用说明
  13. HTML5期末大作业:海美食网站设计——上海美食(8页) 酒水网页设计作业,甜品美食网页制作作业, 学生零食网页作业
  14. 一个正经的电商运营每天应该看哪些数据?
  15. whether 连词或代词词性都不能作为疑问词
  16. dns遭到劫持什么意思、dns遭到劫持怎么办有什么方法解决
  17. 杭电OJ 1034(C++)
  18. 鹏业软件清单量和定额量一样,水平竖向相差很多的问题
  19. 电销系统不仅外显手机号,还能自选归属地
  20. linux如何卸载金山安全终端,安全客户端

热门文章

  1. python星空画法教程_插画分享|零基础也能画好的星空和夕阳教程继续系列
  2. Lua + Redis 优惠券领券设计
  3. 厉害了我的哥!跑步界新锐:DT Run,Tech Go
  4. Linux服务器添加永久明细路由
  5. 1000题如何高效利用
  6. psql切换schema_psql使用技巧
  7. ADB使用总结(一):模拟用户手势实现自动化测试【单线程版】
  8. git 删除分支文件 删除分支
  9. 这次漂亮!2016斯巴鲁跨界挑战赛大造赛事IP
  10. 扩展推荐:Media Downloader实现音乐在线下载