触摸与手势事件

由于移动设备既没有鼠标也没有键盘,所以在为移动浏览器开发交互性网页时,常规的鼠标键盘事件根本不够用

所以早期的苹果为Safari 添加了一些与触摸相关的事件

随着后面Android的Webkit的加入,让这些触摸事件成为了许多的事实标准

基于此,W3C开始制定了 Touch Event 规范

所以下面介绍的事件只针对移动设备

触摸事件

触摸事件会在用户手指放在屏幕上面时、在屏幕上滑动、从屏幕上移开时触发

具体来说由以下几个触摸事件:

  • touchstart:当手指触摸屏幕时触发(即使这时已有手指放在屏幕上)
  • touchmove:手指在屏幕上滑动时连续触发
  • touchend:手指从屏幕上移开时触发
  • touchcancel:当系统停止跟踪触摸时触发(关于该事件的准确触发时间,文档中并没有给出明确说明)

以上事件都会冒泡,也都可以取消

虽然这些触摸事件在DOM规范中并没有定义,但是这些事件都是以兼容DOM的方式实现的

因此,这些触摸事件的event对象都提供了在鼠标事件中的常见属性:

  • bubbles
  • cancelable
  • view
  • clientX
  • clientY
  • screenX
  • scrennY
  • detail
  • altKey
  • shiftKey
  • ctrlKey
  • metaKey

除了上方常见的DOM属性之外,触摸事件还包含下列三个用于跟踪触摸的属性:

  1. touches:表示当前跟踪的触摸操作的Touch对象的数组
  2. targetTouches:特定于事件目标的Touch对象数组
  3. changeTouches:表示自上一次触摸以来发生了什么改变的Touch对象的数组

上面提到的Touch对象包含下列属性:

  • clientX:触摸目标在视口中的x坐标
  • clientY:触摸目标在视口中的y坐标
  • identifier:标识触摸的唯一ID
  • pageX:触摸目标在页面中的X坐标
  • pageY:触摸目标在页面中的y坐标
  • screen X:触摸目标在屏幕中的X坐标
  • screenY:触摸目标在屏幕中y坐标
  • target:触摸的DOM节点目标

以下方代码为例:

function handleTouchEvent(event){
if(event.touches.length ===1){//只跟踪一次触摸
var output = document.getElementById("output");
switch(event.type){
case "touchstart":
output.innerHTML = "Touch started ("+ event.touches[0].clientX +","+event.touches[0].clientY +")";
break;
case "touchend":
output.innerHTML = "<br>Touch ended ("+ event.touches[0].clientX +","+event.touches[0].clientY +")";
break;
case "touchmove":
event.preventDefault();//touchmove 的默认行为是滚动屏幕所以需要阻止该事件的默认行为
output.innerHTML = "<br>Touch moved ("+ event.touches[0].clientX +","+event.touches[0].clientY +")";
break;
}
}
}

上方给出了一个用于打印触摸事件信息的事件处理程序

此外,这些事件会在文档的所有元素上触发

在触摸屏上操作元素时,事件的发生顺序如下:

  1. touchstart
  2. mouseover
  3. mousemove(只触发一次)
  4. mousedown
  5. mouseup
  6. click
  7. touched

所以在对移动设备进行交互时,使用触摸事件能带来比鼠标事件更加良好的用户体验

手势事件

IOS2.0中的Safari还引入了一组手势事件

当两个手指触摸屏幕时就会产生手势,手势通常会改变显示项的大小、或者旋转显示项

有如下三个手势事件:

  1. gesturestart:当一个手指放在屏幕上另一个手指又触摸屏幕触发
  2. gesturechange:当触摸屏幕的任何一个手指的位置发生改变时触发
  3. getureend:当任何一个手指从屏幕上移开时触发

只有当两个手指都处于绑定事件处理程序的元素的范围内时才会触发手势事件

由于这些事件都冒泡,所以将事件处理程序放在文档上也可以处理所有的手势事件

除了DOM事件event对象所包含的属性外,手势事件拥有以下额外属性:

  • rotation:表示手指变化引起的旋转角度(负值逆时针旋转,正值顺时针旋转)
  • scale:表示两个手指间距离的变化情况,该值从1开始随距离拉大而增加,距离缩短而减小

需要注意的是,触摸事件也拥有以上两个属性,但是触摸事件的这两个属性只有在两个手指保持接触时才会发生变化

Javascript高级编程学习笔记(69)—— 事件(13)触摸与手势事件的更多相关文章

  1. Javascript高级编程学习笔记(57)—— 事件(1)事件流

    事件 JS与HTML的交互是通过事件实现的 而事件指的就是:文档或浏览器窗口特定的交互瞬间 可以通过侦听器来预定事件,以便在事件发生时执行相应的代码 这种模式也是设计模式中的观察者模式 事件流 有了事 ...

  2. Javascript高级编程学习笔记(64)—— 事件(8)键盘与文本事件

    键盘与文本事件 用户在使用键盘时会触发键盘事件 “DOM2级事件”最初规定了键盘事件,但是最后在定稿时又删除了相应内容 所以键盘事件被放入了DOM3级事件的规范中 总的来说有三个键盘事件: keydo ...

  3. Javascript高级编程学习笔记(72)—— 模拟事件(2)IE事件模拟

    IE中的事件模拟 低版本的IE浏览器作为前端开发的一股清流,想避过都不行 虽然低版本IE正在逐步被市场淘汰,不得不承认IE8以下的浏览器依然占了不小的份额 所以这里大概介绍IE8以下的低版本IE中的事 ...

  4. Javascript高级编程学习笔记(71)—— 模拟事件(1)DOM事件模拟

    事件,指的是网页中某个特定的交互时刻 一般来说事件由浏览器厂商负责提供,一般由用户操作或者其它浏览器功能来触发 但是有一类特殊的事件,那就是由我们开发人员通过JS触发的事件 这些事件和浏览器创建的事件 ...

  5. Javascript高级编程学习笔记(70)—— 事件(14)内存和性能

    由于事件处理程序是现代的web程序交互能力的提供者 所以在日常实践中,我们免不了要向页面中添加大量的事件处理程序(不管是用于用户交互还是用于统计用户数据) 在创建GUI(图形用户界面)的语言(如C#) ...

  6. Javascript高级编程学习笔记(67)—— 事件(11)HTML5事件

    DOM规范没有涵盖所有浏览器支持的所有事件 而许多浏览器出于满足用户需求,或解决特殊问题的目的,实现了一些自定义事件 HTML5列出了浏览器应该支持的所有事件,这里只讨论得到浏览器完善支持的事件(并非 ...

  7. Javascript高级编程学习笔记(66)—— 事件(10)变动事件

    变动事件 DOM2级的变动事件,能在DOM中的一部分发生变化时给出提示 变动事件是为XML或HTML DOM 设计的,并不特定于某种语言 DOM2级定义了如下变动事件: DOMSubtreeModif ...

  8. Javascript高级编程学习笔记(63)—— 事件(7)鼠标及滚轮事件

    鼠标与滚轮事件 鼠标事件是web开发中最常用的一类事件,毕竟鼠标是最主要的定位设备 DOM3级事件中定义了9个鼠标事件: click:在用户单击主鼠标按钮(一般为鼠标左键)或者按下回车时触发,这一点对 ...

  9. Javascript高级编程学习笔记(61)—— 事件(5)UI事件

    UI事件 UI事件是指那些不一定与用户操作有关的事件 这些事件在DOM规范出现之前,都是以各种不同的形式存在于不同的浏览器 而在DOM事件中为了保证向后兼容,现有的UI事件如下: DOMActivat ...

随机推荐

  1. MVC Razor视图下ViewData传递html内容被转义

    页面输出: html源码: <div style="width: 90%; height: auto;"> <p>付凯航 阿豆 ADOU</p> ...

  2. ASCII, Unicode, UTF-8, 8进制, 16进制等各种编码学习理解笔记

    字符编码的发展历史 Unicode和UTF-8有何区别? 在这个问题下的于洋的最高票回答中,比较完整地介绍了字符编码的发展历史,为了便于记忆,再次简要概括一番. 一个字节:最初一个字节的标准是混乱的, ...

  3. jquery基础知识随笔

    <html> <head> <script type="text/javascript" src="/jquery/jquery.js&qu ...

  4. PNP的学习-EPNP

    EPNP主要是利用已知的3d点,通过PCA选择4个控制点,建立新的局部坐标系,从而将3d坐标用新的控制点表示出来. 然后,利用相机投影模型和2d点,转换到相机坐标系中,再在相机坐标系中建立和世界坐标系 ...

  5. 《Miracle-House团队》项目需求分析改进

    (一)团队项目需求分析改进 一.<西小餐项目需求规格说明书>的不足 通过老师和其他同学的指正和建议,我们发现上次的需求规格说明书存在以下不足: 1.需求规格文档不够完整和规范: 2.系统设 ...

  6. 检索html页自生成&nasp;标签,并替换为空(即去掉空格)

    在开发过程中,遇到这样的一种情况,就是页面有时候不知道什么原因会自动生成一些元素,从而打乱自己原有的一些布局. 原html页源代码: 生成后的html源代码: 可以明显看出自动生成了很多   元素,现 ...

  7. C++标准库之右值引用相关:引用折叠

    引用折叠 引用折叠出现的情况在于范型编程时. void f(T&& param); f(10); int x = 10; f(x); 这两者都可运行成功. 由于存在T&& ...

  8. js unicode转中文 &#26041;&#26696;&#27010;&#36848;&#32852;&#32593;LED&#29031;&#26126;&#26041;&#26696;&#21487;&#25191;&#34892;&#20840;&#37096;&#30340;DALI &#21644;

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

  9. ORM创建多表以及多表的增删改查

    一. 多表的创建 1. 一对一 在哪个表中设置都行,但是添加数据的时候需要现在没有外键的表中添加数据 models.OneToOneField(to="表名",to_field=& ...

  10. HDU 5355 Cake (构造 + 暴力)

    题意:给定 n,m,让你把 1 ~ n 分成 m 部分,而且每部分和是一样大的. 析:首先先判断不能分成的,第一种是 sum (1 ~ n 的和)不能被 m 整除,或者 sum / m < n, ...