Avec la popularité des smartphones et des tablettes, de plus en plus de personnes utilisent des appareils mobiles pour naviguer sur le Web. Nous utilisons généralement des événements de souris sur les navigateurs PC, tels que : clic, survol de la souris, etc. , ne peut plus répondre aux caractéristiques de l'écran tactile des appareils mobiles. L'arrivée de l'ère tactile ne peut être séparée de ces événements tactiles.
L'événement tactile contient 4 interfaces.
TouchEvent
représente un événement qui se produit lorsque le comportement tactile change sur la surface
Touch
représente un contact entre le doigt de l'utilisateur et le toucher. surface Point.
TouchList
représente une série de touches ; cette interface est généralement utilisée lorsque l'utilisateur a plusieurs doigts touchant la surface tactile en même temps.
DocumentTouch
Contient des méthodes pratiques pour créer des objets Touch et des objets TouchList
(référencés dans https://developer.mozilla.org/zh-CN/docs/Web/. API/Touch_events )
L'interface TouchEvent peut répondre à des événements tactiles de base (tels qu'un clic d'un seul doigt), elle contient des événements spécifiques,
Type d'événement :
touchstart : Touch start (doigt posé sur l'écran tactile)
touchmove : Drag (doigt déplacé sur l'écran tactile)
touchend : Touch end (doigt retiré de l'écran tactile)
Touchenter : Déplacez le doigt dans un élément DOM.
touchleave : Le doigt en mouvement quitte un élément DOM.
Il existe également touchcancel, qui se déclenche lorsque le glisser est interrompu.
Attributs d'événement :
altKey : Cet attribut renvoie une valeur booléenne indiquant si la touche Alt est enfoncée lorsque l'événement spécifié se produit, event.altKey=true|false|1|0
type : le type d'événement déclenché lors du toucher, tel que touchstart
Chaque événement tactile comprend trois listes d'attributs tactiles :
1. touches : actuellement sur l'écran Une liste de tous les doigts. points de contact sur le .
2. targetTouches : une liste de tous les points de contact sur l'objet élément actuel.
3. changesTouches : une liste de points de contact impliqués dans l'événement en cours.
Ils sont tous les deux un tableau, chaque élément représente un point de contact.
Le Touch correspondant à chaque point de contact possède trois paires d'attributs importants, clientX/clientY, pageX/pageY, screenX/screenY.
où screenX/screenY représente le décalage de l'emplacement où l'événement se produit par rapport à l'écran, clientX/clienYt et pageX/pageY représentent tous deux le décalage de l'objet correspondant à l'emplacement où l'événement se produit, mais la différence est que clientX/clientY n'inclut pas l'objet. Le décalage est masqué lors du défilement, et pageX/pageY inclut le décalage lorsque l'objet défile et est masqué. Le point tactile qui déplace l'écran ne sera inclus que dans la liste des touches modifiées, pas dans les listes de touches et de cibles, donc les touches modifiées seront plus couramment utilisées dans les projets.
Exemple :
<body onload="start();"> <style type="text/css"> #dom { width:500px; height:500px; background:black; } </style> <div id="dom"></div> <script type="text/javascript"> function onTouchStart(e){ console.log(e); } function start(){ var dom = document.getElementById('dom'); dom.addEventListener('touchstart', onTouchStart, false); } </script> </body>
La sortie de la console est la suivante :
L'ordre dans lequel les événements tactiles et les événements de souris sont déclenchés :
Touchstart > toucheend > mousemove > mouseup > click Le code fonctionnera toujours correctement sur les appareils tactiles), si des événements tactiles sont utilisés, vous pouvez appeler event.preventDefault () pour empêcher le déclenchement d’événements de souris. Lorsque le doigt déplace touchmove sur l'écran, l'événement souris et l'événement click ne seront pas déclenchés. L'ajout de PreventDefault à l'événement touchmove peut interdire au navigateur de faire défiler l'écran et n'affectera pas le déclenchement de l'événement click.
Les événements ci-dessus sont tous intégrés au système et peuvent être utilisés directement grâce à ces événements intégrés, de nombreux gestes multi-touch non natifs peuvent être combinés. .
Hammer.js est une bibliothèque JavaScript légère qui permet à votre site Web d'implémenter facilement des événements tactiles. Elle s'appuie sur jQuery et est utilisée pour contrôler les caractéristiques de contrôle multi-touch sur les appareils tactiles.
Site officiel :
http://hammerjs.github.io/ Implémentation du multi-touch. vous pouvez vous référer à :
http://www.cnblogs.com/iamlilinfeng/p/4239957.htm
zepto est léger. Une bibliothèque compatible avec juqery et adaptée au développement mobile. Pour les méthodes d'utilisation spécifiques, veuillez vous référer au site officiel,
http://zeptojs.com/<🎜. >zepto touch est utilisé. Un module d'événement tactile déclenché par un geste en un seul point.
Adresse de téléchargement Touch.js : https://github.com/madrobby/zepto/blob/master/src/touch.jsRegardons d'abord l'implémentation du module tactile de zepto :
$(document) .on('touchstart ...',function(e){ ... ... now = Date.now() delta = now - (touch.last || now) if (delta > 0 && delta <= 250) touch.isDoubleTap = true touch.last = now }) .on('touchmove ...', function(e){ }) .on('touchend ...', function(e){ ... if (deltaX < 30 && deltaY < 30) { var event = $.Event('tap') touch.el.trigger(event) } })
手机上也有click事件,从触摸到响应click事件,有会300的毫秒的延迟,原因在于:
"Apple 准备发布iphone的时候,为了解决手机上web页面太小的问题,增加了双击屏幕放大的功能,(double tap to zoom ),当用户触摸屏幕的时候,浏览器不知道用户是要double tap还是要click,所以浏览器在第一次tap事件后会等300ms来判断到底是double tap还是click ,如果在300ms以内点击的话,会以为是double tap,反之是click。"
去掉click事件 300ms 的方法:
(1) 在meta里,加 user-scalable=no 可以阻止双击放大,(缺点: 部分浏览器支持)
(2) 使用fastclick.js 它利用多touchstart touchmove 等原生事件的封装,来实现手机上的各种手势,比如tap, swipe 等,
下载地址 https://github.com/ftlabs/fastclick
调用很简单:
$(function() { FastClick.attach(document.body); });
缺点: 文件量有点大,为了解决一小延迟的问题,有点得不偿失。
自定义事件
// 创建事件对象 var obj = new Event('sina'); var elem = document.getElementById('dom'); //监听sina事件 elem.addEventListener('sina', function(e){ console.log(e); },false); //分发sina事件 elem.dispatchEvent(obj);
另外一个创建事件对象的方法是通过CustomEvent,相比于Event的好处是,它可以给处理事件的函数,自定义detail值,这在实际开发中,可能会经常用到。
// 创建事件对象 var obj = new window.CustomEvent('sina', { detail: {'name': 'lily'} }); var elem = document.getElementById('dom'); //监听sina事件 elem.addEventListener('sina', function(e){ // 可以接收到创建事件时,传入的detail值。 console.log(e. detail); // {'name': 'lily'} },false); //分发sina事件 elem.dispatchEvent(obj);
创建自定义事件,一个兼容性较好的函数:
zepto tap “点透”问题
Zepto 的tap事件是通过document绑定了touchstart和touchend事件实现,如果绑定tap方法的dom元素在tap方法触发后会隐藏、而“隐藏后,它底下同一位置正好有一个dom元素绑定了click的事件, 而clic事件有300ms延迟,触发click事件。则会出现“点透”现象。
解决方案:
1 fastclick.js
它的实际原理是在目标元素上绑定touchstart ,touchend事件,然后在touchend这个库直接在touchend的时候就触发了dom上的click事件而替换了本来的触发时间,touch事件是绑定到了具体dom而不是document上,所以e.preventDefault是有效的,可以阻止冒泡,也可以阻止浏览器默认事件。
http://www.cnblogs.com/yexiaochai/p/3442220.html
2、利用fastclick的事件原理, 直接写一段, 采用 e.preventDefault(); 阻止“默认行为”,将事件绑定到dom元素上,缺点在于不能使用事件代理。
elem.addEventListener(touchend, function(e){ e.preventDefault() },false);
3. 在事件捕获阶段,如果时间差,位置差,均小于指定的值,就阻止冒泡和默认click事件的触发。
4. 用户点击的时候“弹出”一个顶层DIV,屏蔽掉所有事件传递,然后定时自动隐藏, 这个方法比较巧妙。
推荐教程:《PHP教程》
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!