千家信息网

怎么理解Web前端开发中的Touch事件

发表于:2024-11-26 作者:千家信息网编辑
千家信息网最后更新 2024年11月26日,这篇文章主要介绍"怎么理解Web前端开发中的Touch事件",在日常操作中,相信很多人在怎么理解Web前端开发中的Touch事件问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家
千家信息网最后更新 2024年11月26日怎么理解Web前端开发中的Touch事件

这篇文章主要介绍"怎么理解Web前端开发中的Touch事件",在日常操作中,相信很多人在怎么理解Web前端开发中的Touch事件问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"怎么理解Web前端开发中的Touch事件"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

然而,开发支持触摸屏的网页与传统意义上的网页有很大的不同。就拿鼠标hover事件来说,例如页面上有一个表格,当鼠标指向表格的title时你希望在附近的某个地方显示一个浮动的tooltip。当然,你希望这个tooltip能更加引起浏览者的注意,因此你自定义了一个DIV元素并且通过JavaScript让它动态显示或隐藏。这个程序很简单,并且在普通设备的多个不同版本的浏览器上都运行良好。但是如果你在支持触摸屏的设备上浏览网页的时候问题却来了,设备不支持鼠标,因此用户无法用鼠标来hover表格的title元素。用户***能和网页进行交互的设备就是用手指去触摸或滑动屏幕,然而在一个非touch friendly的网页上用手指去触发传统的mouse hover事件会显得非常怪异,你会发现tooltip会在你手指接触到屏幕的一瞬间显示,而后马上会消失。这是因为浏览器默认触发了mouseover和mouseout两个事件,而这两个事件只是在手指接触屏幕这一个操作中完成的,你根本没有办法去控制它。这只是许多不同中的一个小例子,还有很多不一样的地方,如你在传统设备上用鼠标点击一个图片按钮不动用来连续不停地滚动DIV,而在触摸屏上浏览器会默认为你要显示右键菜单而阻止了该事件继续执行。传统设备上通常情况下同一时间里系统只允许一个鼠标接受用户的操作,而触摸屏一般都支持多点触摸甚至支持各种不同的手势,如左右滑动、两只放大缩小和旋转等。

随着HTML5的发展,为了支持对触摸屏的操作,多个浏览器厂商都在自己的浏览器引擎中添加了很多支持touch的事件。但是由于W3C并没有提供一个统一的标准,或者说该标准在不同的浏览器厂商中所遵循的情况也有很大区别,因此我们不得不针对浏览器版本做一些特殊的处理。这到让我想起了IE浏览器在许多方面与其它浏览器的不同,这次也不例外!

这里有一些页面介绍了在不同浏览器中对touch事件的支持,读者可以看一下它们之间到底有哪些不同。

IE浏览器对touch事件的支持:http://blogs.msdn.com/b/ie/archive/2011/09/20/touch-input-for-ie10-and-metro-style-apps.aspx

Firefox浏览器对touch事件的支持:https://developer.mozilla.org/en-US/docs/Web/Guide/Touch_events?redirectlocale=en-US&redirectslug=DOM%2FTouch_events

基本上有两大阵营:IE浏览器和基于Webkit内核的浏览器。

但是IE本身由于各个不同版本之间存在的兼容性问题又有一些区别,常见的如IE7、IE8、IE9和IE10。基于Webkit内核的浏览器如Firefox、Safari、Chrome等都是常用的。这里需要注意的是,Safari提供一个Windows的Desktop版本,这个版本不同于Apple提供给它自己设备上的浏览器版本,所以在开发测试的时候需要区别开来。

那么如何才能开发一个通用的支持touch事件的页面呢?基本上,我们只需要区别IE和Webkit内核的浏览器就行了,剩下的兼容性问题通常都比较好解决。MSDN的这个页面介绍了IE对指针和笔势事件的支持http://msdn.microsoft.com/zh-cn/library/ie/hh773557.aspx其中有讲到如何检测对指针事件的支持,我们可以利用该方法来区别IE和其它浏览器。看下面这个程序片段:

if (window.navigator.msPointerEnabled) {     /*Events for IE only*/   document.getElementById("id0").addEventListener("MSPointerOver", function (e) {         /*Add mouse over event for touch*/         if (e.pointerType == e.MSPOINTER_TYPE_MOUSE) {             methods.onMouseOver(this, e);         }     });    document.getElementById("id0").addEventListener("MSPointerOut", function (e) {         /*Add mouse out event for touch*/         if (e.pointerType == e.MSPOINTER_TYPE_MOUSE) {             methods.onMouseOut(this, e);         }     });   document.getElementById("id0").addEventListener("MSPointerDown", function (e) {         if (e.pointerType == e.MSPOINTER_TYPE_TOUCH) {             /*Do something for touch input only*/             methods.onTouchInput(this[xss_clean]);         }         else {             /*Do something for non-touch input*/             methods.onMouseClick(this[xss_clean]);         }     }); } else {     /*Events for non-IE or IE without msPointerEnabled*/     $(this).bind("touchstart", function (e) {         e.preventDefault();         methods.onMouseClick(this[xss_clean]);         methods.onMouseOver(this, e);     });     /*Common Mouse events: mouseover, mouseout, click*/     $(this).click(function () { methods.onMouseClick(this); });     $(this).hover(             function (e) {                 methods.onMouseOver(this, e);             },             function (e) { methods.onMouseOut(this, e); }); }

代码有两个主要的分支,针对IE和Webkit内核的浏览器。在IE浏览器中,MSPointerDown事件不会自动阻止鼠标事件,因此需要通过event.pointerType来判断指针类型。event.pointerType是一个枚举变量,一共有三个值:

MSPOINTER_TYPE_TOUCH = 2

MSPOINTER_TYPE_PEN = 3

MSPOINTER_TYPE_MOUSE = 4

很奇怪为什么没有值为1的枚举值?可能是用作保留了吧!这也就是说MSPointerDown事件在触发的同时还会触发鼠标相关的事件,事实上鼠标事件是最开始触发的。因此我们需要先判断指针类型,进行不同的处理。为了增加页面的兼容性,让其在支持鼠标操作的设备上也能有更好的体验,代码中特意添加了MSPointerOver和MSPointerOut事件,并且判断当指针类型为MSPOINTER_TYPE_MOUSE时才去执行对应的鼠标事件。

这里有几个兼容性问题需要考虑:

1. Window.navigator.msPointerEnabled语句只会判断浏览器是否支持MSPointer相关的事件,而不会判断用户的设备是否支持触摸操作。目前只有在IE10上该对象不会返回undefined,其它版本的浏览器均视该对象不存在。如果你想判断用户的设备是否支持触摸操作,应该使用Window.navigator.msMaxTouchPoints,如果该对象存在并且返回的结果大于1,则表示设备支持触摸操作并且是支持多点触摸的。

2. 在IE中,MSPointer相关的事件只会在浏览器支持的时候被触发,如果页面元素同时还带有鼠标事件,则鼠标事件也会被同时触发。

3. Webkit内核的浏览器支持touchstart事件,MSPointer相关的事件在这些浏览器上被视为无效。通过e.preventDefault()语句可以阻止鼠标默认行为,从而不让mouse hover事件触发。

所以,上面代码片段同时兼容了

当然,你完全可以将鼠标的Click事件当作touch事件来处理,如果元素上除了Click之外没有任何其它的事件。但是如果元素上还有mouse hover相关的事件,则用户在touch的同时触发mouse hover,在这种情况下你或许可以考虑使用上面的逻辑来处理cross events。

到此,关于"怎么理解Web前端开发中的Touch事件"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

事件 浏览 浏览器 支持 鼠标 设备 不同 开发 版本 内核 用户 页面 元素 同时 情况 指针 网页 触摸屏 问题 前端 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 小学生动画版网络安全图片 友好的数据库管理软件 点击购物车数据库加入数据的代码 无线网络技术导论 试卷 做网络技术开发哪里比较费钱 服务器部署java网站 在vfp中什么是数据库 如何启动许可证管理器服务器 江苏智慧社区软件开发电话 apache服务器只能访问本地 软件开发项目业绩怎么填 计算机网络安全维护的目的 网络技术第一章第四节 徐州第二届网络安全攻防大赛 网络安全钓鱼工具 dos 网络安全检测技术 哈尔滨乐收网络技术有限公司 网络安全技术论文选题目 数据库文件存放位置怎么改 吉林时代网络技术服务代理商 软件开发方案设计评审报告 电竞比赛用什么服务器 中北大学大数据网络安全 广州专业软件开发价格 如何判断一个网站的数据库 多方发力网络安全 数据库和eclipse 电力网络安全事故应急预案 网络安全攻防大赛影子系统 满足客户的郑州直销软件开发
0