web开发touch事件实例详解

本文主要为大家分享一篇移动web开发之touch事件实例详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧,希望能帮助到大家。

前面的话

iOS版Safari为了向开发人员传达一些特殊信息,新增了一些专有事件。因为iOS设备既没有鼠标也没有键盘,所以在为移动Safari开发交互性网页时,常规的鼠标和键盘事件根本不够用。随着Android 中的WebKit的加入,很多这样的专有事件变成了事实标准,导致W3C开始制定Touch Events规范。本文将详细介绍移动端touch事件

概述

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

touchstart:当手指触摸屏幕时触发;即使已经有一个手指放在了屏幕上也会触发touchmove:当手指在屏幕上滑动时连续地触发。在这个事件发生期间,调用preventDefault()可以阻止滚动touchend:当手指从屏幕上移开时触发touchcancel:当系统停止跟踪触摸时触发(不常用)。关于此事件的确切触发时间,文档中没有明确说明

【touchenter 和 touchleave】

触摸事件规范中曾经包含touchenter和touchleave事件,这两个事件在用户手指移入或移出某个元素时触发。但是这两个事件从来没有被实现。微软有这两个事件的替代事件,但是只有IE浏览器支持。某些情况下可以知道用户手指滑入滑出某个元素是素是非常有用的,所以希望这两个事件可以重返规范

在触摸事件中,常用的是touchstart、touchumove和touchend这三个事件,与鼠标事件的对应如下

鼠标   触摸   mousedown touchstart mousemove touchmove mouseup  touchend

[注意]touch事件在chrome模拟器下部分版本使用DOM0级事件处理程序的方式来添加事件无效

    Document  #test{height:200px;width:200px;background:lightblue;} 

(function(){ var stateMap = { touchstart_index : 0, touchmove_index : 0, touchend_index : 0 }, elesMap = { touch_obj: document.getElementById('test') }, showIndex, handleTouch; showIndex = function ( type ) { elesMap.touch_obj.innerHTML = type + ':' + (++stateMap[type + '_index']); }; handleTouch = function ( event ) { showIndex( event.type ); }; elesMap.touch_obj.addEventListener('touchstart', function(event){handleTouch(event);}); elesMap.touch_obj.addEventListener('touchmove', function(event){handleTouch(event);}); elesMap.touch_obj.addEventListener('touchend', function(event){handleTouch(event);}); })();

300ms

300ms问题是指在某个元素执行它的功能和执行touch事件之间有一个300毫秒的间隔。鼠标事件、焦点事件、浏览器默认行为等相较于touch事件,都存在着300ms的延迟

【点透】

因为300ms的存在,会造成常见的点透问题。先来看例子

    Document   #test {position: absolute;top: 0;left: 0;opacity: 0.5;height: 200px;width: 200px;background: lightblue;}  百度 

(function () { var elesMap = { touchObj: document.getElementById('test') }, fnHide, onTouch; fnHide = function (type) { elesMap.touchObj.style.display = 'none'; }; onTouch = function (event) { fnHide(); }; elesMap.touchObj.addEventListener('touchstart', function(event){onTouch(event);}); })();

浅蓝色的半透明p被点击(触发touch事件)后,如果点击位置正好位于链接的上方,则会触发链接跳转的默认行为。详细解释是,点击页面后,浏览器会记录所点击的页面坐标,300ms后,在该坐标找到元素。在该元素上触发点击行为。因此,如果300ms内同一页面坐标的上层元素消失后,300ms后在下层元素上触发点击行为。这就造成了点透问题

造成这个问题,是因为触摸屏幕的行为被重载(overload)了。在手指触摸屏幕的瞬间,浏览器无法预知用户是在轻触(Tap)、双触(Double-Tap)、滑动(Swipe)、按住不放(Hold)还是其他什么操作。唯一保险的做法就是等上一会儿看接下来会发生什么

问题是在于双触(Double-Tap)。即便是浏览器检测出手指离开了屏幕,它仍然无法判断接下来做什么。因为浏览器无法知道手指是会再次回到屏幕,还是就此结束触发轻触事件以及事件级联。为了确定这一点,浏览器不得不等待一小段时间。浏览器开发者找到一个最佳时间间隔,就是300毫秒

【解决办法】

1、在touch事件的事件处理程序中增加300ms的延迟

(function () {   var    elesMap = {     touchObj: document.getElementById('test')    },    fnHide, onTouch;   fnHide = function (type) {    elesMap.touchObj.style.display = 'none';   };   onTouch = function (event) {    setTimeout(function(){     fnHide();    },300);   };   elesMap.touchObj.addEventListener('touchstart', function (event) { onTouch(event); });  })();

2、使用缓动动画,增加300ms的过渡效果,注意display属性无法使用transition

3、加入中间层的dom元素,让中间层接受这个穿透事件,稍后隐藏

4、上下两级都使用tap事件,但默认行为不可避免

5、在document上的touchstart事件,阻止默认行为。

document.addEventListener('touchstart',function(e){  e.preventDefault();})

接着,添加a标签的跳转行为

a.addEventListener('touchstart',function(){ window.location.href = 'https://cnblogs.com'; })

但是,这种方法有副作用,会造成页面无法滚动、文本无法选中等。如果在某个元素上,需要恢复文本选中的行为,则可以使用阻止冒泡来恢复

el.addEventListener('touchstart',function(e){  e.stopPropagation();})

事件对象

【基础信息】

每个触摸事件的event对象都提供了在鼠标事件中常见的属性,包括事件类型、事件目标对象、事件冒泡、事件流、默认行为等

以touchstart为例,示例代码如下

  (function () {   var    elesMap = {     touchObj: document.getElementById('test')    },    onTouch;   onTouch = function (e) {     console.log(e)  };   elesMap.touchObj.addEventListener('touchstart', function (event) { onTouch(event); });  })();  

1、currentTarget属性返回事件正在执行的监听函数所绑定的节点

2、target属性返回事件的实际目标节点

3、srcElement属性与target属性功能一致

//当前目标currentTarget:[object HTMLpElement]//实际目标target:[object HTMLpElement]//实际目标srcElement:[object HTMLpElement]

4、eventPhase属性返回一个整数值,表示事件目前所处的事件流阶段。0表示事件没有发生,1表示捕获阶段,2表示目标阶段,3表示冒泡阶段

5、bubbles属性返回一个布尔值,表示当前事件是否会冒泡。该属性为只读属性

6、cancelable属性返回一个布尔值,表示事件是否可以取消。该属性为只读属性

//事件流eventPhase: 2//可冒泡bubbles: true//默认事件可取消cancelable: true

【touchList】

除了常见的DOM属性外,触摸事件对象有一个touchList数组属性,其中包含了每个触摸点的信息。如果用户使用四个手指触摸屏幕,这个数组就会有四个元素。一共有三个这样的数组

1、touches:当前触摸屏幕的触摸点数组(至少有一个触摸在事件目标元素上)

2、changedTouches :导致触摸事件被触发的触摸点数组

3、targetTouches:事件目标元素上的触摸点数组

如果用户最后一个手指离开屏幕触发touchend事件,这最后一个触摸点信息不会出现在targetTouches和touches数组中,但是会出现在changedTouched数组中。因为是它的离开触发了touchend事件,所以changedTouches数组中仍然包含它。上面三个数组中,最常用的是changedTouches数组

(function () {   var    elesMap = {     touchObj: document.getElementById('test')    },    onTouch;   onTouch = function (e) {     elesMap.touchObj.innerHTML = 'touches:' + e.touches.length                  + '
changedTouches:' + e.changedTouches.length + '
targetTouches:' + e.targetTouches.length; }; elesMap.touchObj.addEventListener('touchstart', function (event) { onTouch(event); }); })();

【事件坐标】

上面这些触摸点数组中的元素可以像普通数组那样用数字索引。数组中的元素包含了触摸点的有用信息,尤其是坐标信息。每个Touch对象包含下列属性

clientx:触摸目标在视口中的x坐标clientY:触摸目标在视口中的y坐标identifier:标识触摸的唯一IDpageX:触摸目标在页面中的x坐标(包含滚动)pageY:触摸目标在页面中的y坐标(包含滚动)screenX:触摸目标在屏幕中的x坐标screenY:触摸目标在屏幕中的y坐标target:触摸的DOM节点目标

changedTouches数组中的第一个元素就是导致事件触发的那个触摸点对象(通常这个触摸点数组不包含其他对象)。这个触摸点对象含有clientX/Y和pageX/Y坐标信息。除此之外还有screenX/Y和x/y,这些坐标在浏览器间不太一致,不建议使用

clientX/Y和pageX/Y的区别在于前者相对于视觉视口的左上角,后者相对于布局视口的左上角。布局视口是可以滚动的

(function () {   var    elesMap = {     touchObj: document.getElementById('test')    },    onTouch;   onTouch = function (e) {    var touch = e.changedTouches[0];    elesMap.touchObj.innerHTML = 'clientX:' + touch.clientX + '
clientY:' + touch.clientY + '
pageX:' + touch.pageX + '
pageY:' + touch.pageY + '
screenX:' + touch.screenX + '
screenY:' + touch.screenY }; elesMap.touchObj.addEventListener('touchstart', function (event) { onTouch(event); }); })();

相关推荐:

JS手机端touch事件计算滑动距离的方法

有关touch事件解析和封装的知识

javascript移动设备Web开发中对touch事件的封装实例_javascript技巧

以上就是web开发touch事件实例详解的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1545540.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月21日 17:02:54
HTML图片的img标签怎样使用
下一篇 2025年12月21日 17:03:04

相关推荐

  • 最新的Linux命令大全

    自助命令:ls –help   man ls  info ls 文件属性:ls -al  显示当前目录下文件/目录拥有者,所属组,其他人的写读执行权限  文件或目录下属文件数 拥有者 群组 内容大小(byte) 最后修改日期 文件/目录名  注意:对于目录,如何没有x权限,则进不去目录 …

    用户投稿 2026年9月5日
    300
  • Linux系统网卡设图文详解

    这篇文章主要介绍了linux系统网卡的设置教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 由于做了虚拟机的克隆,发现克隆机和被克隆机的MAC地址相同了,下面我将要介绍一下linux中网卡的配置步骤,我使用的linux是CentOS release 6.9 (Final) 1、root用户编辑…

    2026年9月4日
    000
  • 细说nginx的内置变量

    nginx的配置文件中可以使用的内置变量以美元符$开始,也有人叫全局变量。其中,部分预定义的变量的值是可以改变的。 $arg_PARAMETER 这个变量值为:GET请求中变量名PARAMETER参数的值。 $args 这个变量等于GET请求中的参数。例如,foo=123&bar=blahb…

    用户投稿 2026年9月4日
    000
  • Linux ls命令详解

    linux 列出文件夹中所有文件和子目录的方法是用: ls 命令。 ls命令格式: ls [选项] [目录名] ls命令用法举例: 例一:列出/home文件夹下的所有文件和目录的详细资料: ls -l -R /home 命令参数之前要有一短横线“-”, 上面的命令也可以这样写: ls -lR /ho…

    用户投稿 2026年9月4日
    000
  • 比较讲解HTTP中499状态码和nginx下499错误

        日志记录中http状态码出现499错误有多种情况,我遇到的一种情况是nginx反代到一个永远打不开的后端,就这样了,日志状态记录是499、发送字节数是0。     老是有用户反映网站系统时好时坏,因为线上的产品很长时间没有修改,所以前端程序的问题基本上可以排除,于是就想着是Get方式调用的接…

    用户投稿 2026年9月4日
    500
  • linux中关于ls命令的实例详解

    ls命令是linux下最常用的命令。ls命令就是list的缩写。下面通过本文给大家分享linux 中ls命令详解,感兴趣的朋友一起看看吧 ls命令用来显示目标列表,在Linux中是使用率较高的命令。ls命令的输出信息可以进行彩色加亮显示,以分区不同类型的文件。 语法 ls(选项)(参数) 选项 -a…

    用户投稿 2026年9月4日
    100
  • linux中关于mkdir命令的详解

    mkdir 是一个用来在 linux 系统下创建目录的命令。此命令属于内建命令。接下来通过本文给大家分享linux mkdir命令详解,感兴趣的朋友一起看看吧 mkdir命令用来创建目录。该命令创建由dirname命名的目录。如果在目录名的前面没有加任何路径名,则在当前目录下创建由dirname指定…

    用户投稿 2026年9月4日
    200
  • linux下swap分区作用详解

    本文主要介绍了详细解读linux下swap分区的作用,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下,希望能帮助到大家。 本文研究的主要是linux下swap分区的相关内容,具体介绍如下。 swap分区介绍 嵌入式Linux中文站消息,Linux系统的Swap分区,即交换区,Swap空…

    用户投稿 2026年9月3日
    200
  • Linux之定时任务crontab详解

    Linux之定时任务crontab详解Linux之定时任务crontab详解Linux之定时任务crontab详解Linux之定时任务crontab详解

    crontab命令常见于unix和类unix的操作系统之中,用于设置周期性被执行的指令。存放于“crontab”文件中,以供之后读取和执行。该词来源于希腊语 chronos(χρνο),原意是时间。通常,crontab储存的指令被守护进程激活, crond常常在后台运行,每一分钟检查是否有预定的作业…

    2026年9月3日 用户投稿
    000
  • Linux中自动生成数据详解

    本文主要和大家分享linux中自动生成数据详解,主要以代码的方法和大家分享,希望能帮助到大家。 /* * 自动任务跑数据 * 订单组日工作量报表数据写入 * * $start_date 0000-00-00 00:00:00 开始时间 * $email_start_date 0000-00-00 0…

    用户投稿 2026年9月3日
    400
  • Linux数组和关联数组详解

    数组是shell脚本非常重要的组成部分,它借助索引将多个独立的数据存储为一个集合。普通数组只能使用整数作为数组索引。Bash也支持关联数组,它可以使用字符串作为数组索引。在很多情况下,采用字符串式索引更容易理解,这时候关联数组就派上用场了。在这里,我们会看到普通数组和关联数组的用法。 (1) 定义数…

    2026年9月3日
    200
  • linux vi命令详解

    linux vi命令详解 推荐:【Linux视频教程】 vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里介绍一下它的用法和一部分指令。 由于 对Unix及Linux系统的任何版本,vi编辑器是完全相同的,因此您可以在其他任何介绍vi的地方进一步了解它…

    2026年8月28日
    000
  • linux下Vps自动备份web和mysql数据库的脚本怎么写

    一、备份web文件夹1、备份/home/users/public_html目录2、修改crontab为每周第一天3:22时运行 复制代码 代码如下: 22 3 * * 0 root run-parts /etc/cron.weekly 3、复制脚本到/etc/cron.weekly目录4、修改权限 …

    用户投稿 2026年8月26日
    100
  • 深入理解CSS属性选择器并举例说明

    CSS属性选择器详解及应用示例 在CSS中,我们经常需要通过选择器来选取并修改特定的元素样式。除了常见的标签选择器(如div、p等),CSS还提供了属性选择器,可以根据元素的属性值来选择并修改样式。 本文将详细介绍CSS的属性选择器,并给出一些实际应用的示例。 一、属性选择器类型 立即学习“前端免费…

    2025年12月24日
    000
  • 纯css实现加号一个的效果(代码示例)

    纯css实现加号一个的效果(代码示例)纯css实现加号一个的效果(代码示例)纯css实现加号一个的效果(代码示例)纯css实现加号一个的效果(代码示例)

    本篇文章给大家带来的内容是关于纯css实现加号一个的效果(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 实现下图的加号效果: 若想实现这个效果, 只需一个p元素即可搞定。 需要用到css的为了before和after, 以及border特性。 先设置一个div便签 立即…

    2025年12月24日 用户投稿
    100
  • 动态加载css详解

    这次给大家带来动态加载css详解,动态加载css的注意事项有哪些,下面就是实战案例,一起来看一下。 一、方法引用来源和应用 此动态加载css方法 loadCss,剥离自Sea.js,并做了进一步的优化(优化代码后续会进行分析)。 因为公司项目需要用到懒加载来提高网站加载速度,所以将非首屏渲染必需的c…

    用户投稿 2025年12月24日
    000
  • css中px、em和rem使用详解

    相信每位前端工程师们都有这么一个体会,国内的设计师大都喜欢用px,而国外的网站大都喜欢用em和rem,那么三者有什么区别,又各自有什么优劣呢?下面这篇文章小编就来给大家详细介绍关于css中px、em和rem的区别,需要的朋友可以参考借鉴,下面来一起看看吧。 前言 em 和 rem 都是灵活可扩展的单…

    用户投稿 2025年12月24日
    000
  • CSS双飞翼布局的详解

    这次给大家带来CSS双飞翼布局的详解,实现CSS双飞翼布局的注意事项有哪些,下面就是实战案例,一起来看一下。 双飞翼布局,就是两端固定宽高,中间自适应的三栏布局 先来张图,左边和右边的灰色块是固定宽高的,中间绿色的区域是宽高自适应 方式一:通过flex弹性布局来实现 看代码 //HTML结构,p2是…

    2025年12月24日
    100
  • CSS的三栏布局详解

    CSS的三栏布局详解CSS的三栏布局详解CSS的三栏布局详解CSS的三栏布局详解

    这次给大家带来CSS的三栏布局详解,CSS的三栏布局的注意事项有哪些,下面就是实战案例,一起来看一下。 本文介绍了CSS经典三栏布局方案,分享给大家,也给自己做个笔记,具体如下: 三栏布局,顾名思义就是两边固定,中间自适应。三栏布局在开发十分常见 1. float布局 最简单的三栏布局就是利用flo…

    2025年12月24日 用户投稿
    100
  • CSS的定位属性详解

    CSS的定位属性详解CSS的定位属性详解CSS的定位属性详解CSS的定位属性详解

    这次给大家带来CSS的定位属性详解,使用CSS定位属性的注意事项有哪些,下面就是实战案例,一起来看一下。 CSS的定位属性有三种,分别是绝对定位、相对定位、固定定位。 position: absolute; position: relative; position: fixed; 下面逐一介绍。 相…

    2025年12月24日 用户投稿
    100

发表回复

登录后才能评论
关注微信