JS触摸与手势事件详解


Posted in Javascript onMay 09, 2017

本文为大家分享了JS触摸与手势事件,供大家参考,具体内容如下

1.触摸事件

包含 iOS 2.0 软件的 iPhone 3G 发布时,也包含了一个新版本的 Safari 浏览器。这款新的移动 Safari提供了一些与触摸(touch)操作相关的新事件。后来,Android 上的浏览器也实现了相同的事件。触摸事件会在用户手指放在屏幕上面时、在屏幕上滑动时或从屏幕上移开时触发。具体来说,有以下几个触摸事件。

touchstart :当手指触摸屏幕时触发;即使已经有一个手指放在了屏幕上也会触发。
touchmove :当手指在屏幕上滑动时连续地触发。在这个事件发生期间,调用 preventDefault()可以阻止滚动。
touchend :当手指从屏幕上移开时触发。
touchcancel :当系统停止跟踪触摸时触发。关于此事件的确切触发时间,文档中没有明确说明。
以上的几个事件都是会冒泡的,也都可以取消。虽然这些触摸事件没有在DOM中定义,但让他们却是以兼容DOM的方式实现的。因此,每个触摸事件的event对象都提供了在鼠标事件中常见的属性:bubbles、cancelable、view、clientX、clientY、screenX、screenY、detail、altKey、shiftKey、ctrlKey、metaKey。
除了常见的DOM属性,触摸事件还包含下列三个用于跟踪触摸的属性。
touches :表示当前跟踪的触摸操作的 Touch 对象的数组。
targetTouchs :特定于事件目标的 Touch 对象的数组。
changeTouches :表示自上次触摸以来发生了什么改变的 Touch 对象的数组。

每个Touch 对象包含下列属性

clientX :触摸目标在视口中的 x 坐标。
clientY :触摸目标在视口中的 y 坐标。
identifier :标识触摸的唯一 ID。
pageX :触摸目标在页面中的 x 坐标。
pageY :触摸目标在页面中的 y 坐标。
screenX :触摸目标在屏幕中的 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.changedTouches[0].clientX + "," +
event.changedTouches[0].clientY + ")";
break;
case "touchmove":
event.preventDefault(); //阻止滚动
output.innerHTML += "<br>Touch moved (" +
event.changedTouches[0].clientX + "," +
event.changedTouches[0].clientY + ")";
break;
}
}
}
EventUtil.addHandler(document, "touchstart", handleTouchEvent);
EventUtil.addHandler(document, "touchend", handleTouchEvent);
EventUtil.addHandler(document, "touchmove", handleTouchEvent);

以上代码会跟踪屏幕上发生的一次触摸操作。为简单起见,只会在有一次活动触摸操作的情况下输出信息。当 touchstart 事件发生时,会将触摸的位置信息输出到 <div> 元素中。当 touchmove 事件发生时,会取消其默认行为,阻止滚动(触摸移动的默认行为是滚动页面),然后输出触摸操作的变化信息。而 touchend 事件则会输出有关触摸操作的最终信息。注意,在 touchend 事件发生时, touches集合中就没有任何 Touch 对象了,因为不存在活动的触摸操作;此时,就必须转而使用 changeTouchs集合。

这些事件会在文档的所有元素上面触发,因而可以分别操作页面的不同部分。在触摸屏幕上的元素时,这些事件(包括鼠标事件)发生的顺序如下:
(1) touchstart
(2) mouseover
(3) mousemove (一次)
(4) mousedown
(5) mouseup
(6) click
(7) touchend
支持触摸事件的浏览器包括 iOS 版 Safari、Android 版 WebKit、bada 版 Dolfin、OS6+中的 BlackBerryWebKit、Opera Mobile 10.1+和 LG 专有 OS 中的 Phantom浏览器。

2. 手势事件

iOS 2.0 中的 Safari 还引入了一组手势事件。当两个手指触摸屏幕时就会产生手势,手势通常会改变显示项的大小,或者旋转显示项。有三个手势事件,分别介绍如下。

gesturestart :当一个手指已经按在屏幕上而另一个手指又触摸屏幕时触发。
gesturechange :当触摸屏幕的任何一个手指的位置发生变化时触发。
gestureend :当任何一个手指从屏幕上面移开时触发。

只有两个手指都触摸到事件的接收容器时才会触发这些事件。在一个元素上设置事件处理程序,意味着两个手指必须同时位于该元素的范围之内,才能触发手势事件(这个元素就是目标)。由于这些事件冒泡,所以将事件处理程序放在文档上也可以处理所有手势事件。此时,事件的目标就是两个手指都位于其范围内的那个元素。

触摸事件和手势事件之间存在某种关系。当一个手指放在屏幕上时,会触发 touchstart 事件。如果另一个手指又放在了屏幕上,则会先触发 gesturestart 事件,随后触发基于该手指的 touchstart事件。如果一个或两个手指在屏幕上滑动,将会触发 gesturechange 事件。但只要有一个手指移开,就会触发 gestureend 事件,紧接着又会触发基于该手指的 touchend 事件。
与触摸事件一样,每个手势事件的 event 对象都包含着标准的鼠标事件属性: bubbles 、cancelable 、 view 、 clientX 、 clientY 、 screenX 、 screenY 、 detail 、 altKey 、 shiftKey 、ctrlKey 和 metaKey 。此外,还包含两个额外的属性: rotation 和 scale 。其中, rotation 属性表示手指变化引起的旋转角度,负值表示逆时针旋转,正值表示顺时针旋转(该值从 0 开始)。而 scale属性表示两个手指间距离的变化情况(例如向内收缩会缩短距离);这个值从 1 开始,并随距离拉大而增长,随距离缩短而减小。

下面是使用手势事件的一个示例。

function handleGestureEvent(event){
var output = document.getElementById("output");
switch(event.type){
case "gesturestart":
output.innerHTML = "Gesture started (rotation=" + event.rotation +
",scale=" + event.scale + ")";
break;
case "gestureend":
output.innerHTML += "<br>Gesture ended (rotation=" + event.rotation +
",scale=" + event.scale + ")";
break;
case "gesturechange":
output.innerHTML += "<br>Gesture changed (rotation=" + event.rotation +
",scale=" + event.scale + ")";
break;
}
}
document.addEventListener("gesturestart", handleGestureEvent, false);
document.addEventListener("gestureend", handleGestureEvent, false);
document.addEventListener("gesturechange", handleGestureEvent, false);

与前面演示触摸事件的例子一样,这里的代码只是将每个事件都关联到同一个函数中,然后通过该函数输出每个事件的相关信息。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
关于__defineGetter__ 和__defineSetter__的说明
May 12 Javascript
jquery动画4.升级版遮罩效果的图片走廊--带自动运行效果
Aug 24 Javascript
jquery1.9 下检测浏览器类型和版本的方法
Dec 26 Javascript
Vue.2.0.5过渡效果使用技巧
Mar 16 Javascript
Node 自动化部署的方法
Oct 17 Javascript
vue select组件的使用与禁用实现代码
Apr 10 Javascript
vue.js前后端数据交互之提交数据操作详解
Apr 24 Javascript
vue2.0+ 从插件开发到npm发布的示例代码
Apr 28 Javascript
vue 实现数字滚动增加效果的实例代码
Jul 06 Javascript
JavaScript ES6箭头函数使用指南
Dec 30 Javascript
Javascript数组及类数组相关原理详解
Oct 29 Javascript
vue 中使用print.js导出pdf操作
Nov 13 Javascript
Angualrjs 表单验证的两种方式(失去焦点验证和点击提交验证)
May 09 #Javascript
微信小程序之获取当前位置经纬度以及地图显示详解
May 09 #Javascript
JS中的数组转变成JSON格式字符串的方法
May 09 #Javascript
jQuery插件开发发送短信倒计时功能代码
May 09 #jQuery
JavaScrpt的面向对象全面解析
May 09 #Javascript
ES6正则表达式的一些新功能总结
May 09 #Javascript
Vuex和前端缓存的整合策略详解
May 09 #Javascript
You might like
php中函数的形参与实参的问题说明
2010/09/01 PHP
用PHP读取和编写XML DOM的实现代码
2011/02/03 PHP
关于使用key/value数据库redis和TTSERVER的心得体会
2013/06/28 PHP
PHP写的简单数字验证码实例
2017/05/23 PHP
TP5框架实现自定义分页样式的方法示例
2020/04/05 PHP
通过实例解析PHP数据类型转换方法
2020/07/11 PHP
javascript 从if else 到 switch case 再到抽象
2010/07/17 Javascript
jquery取子节点及当前节点属性值的方法
2014/09/09 Javascript
JavaScript获取表格(table)当前行的值、删除行、增加行
2015/07/03 Javascript
使用ES6语法重构React代码详解
2017/05/09 Javascript
浅谈Angular HttpClient简单入门
2018/05/04 Javascript
Vue实现按钮旋转和移动位置的实例代码
2018/08/09 Javascript
浅析Vue实例以及生命周期
2018/08/14 Javascript
vue2.0 element-ui中el-select选择器无法显示选中的内容(解决方法)
2018/08/24 Javascript
详解ES6系列之私有变量的实现
2018/11/21 Javascript
JS使用Prim算法和Kruskal算法实现最小生成树
2019/01/17 Javascript
Vue.js实现大屏数字滚动翻转效果
2019/11/29 Javascript
使用vue实现通过变量动态拼接url
2020/07/22 Javascript
[01:36]极致酷炫!TI9典藏宝瓶+撼地者至宝展示
2019/06/11 DOTA
Python黑帽编程 3.4 跨越VLAN详解
2016/09/28 Python
python模拟登录并且保持cookie的方法详解
2017/04/04 Python
Python实现的FTP通信客户端与服务器端功能示例
2018/03/28 Python
python2与python3共存问题的解决方法
2018/09/18 Python
Python 仅获取响应头, 不获取实体的实例
2019/08/21 Python
Pytorch使用MNIST数据集实现基础GAN和DCGAN详解
2020/01/10 Python
python shell命令行中import多层目录下的模块操作
2020/03/09 Python
PyCharm 在Windows的有用快捷键详解
2020/04/07 Python
详解如何在PyCharm控制台中输出彩色文字和背景
2020/08/17 Python
利用python绘制正态分布曲线
2021/01/04 Python
美国紧身牛仔裤品牌:NYDJ
2017/05/24 全球购物
菲律宾票务网站:StubHub菲律宾
2018/04/21 全球购物
《小鹰学飞》教学反思
2014/04/23 职场文书
户外活动总结范文
2014/04/30 职场文书
副乡长民主生活会个人对照检查材料思想汇报
2014/10/01 职场文书
党员自我剖析材料范文
2014/10/06 职场文书
分析Java中Map的遍历性能问题
2021/06/26 Java/Android