Cet article partage principalement avec vous une explication détaillée des exemples d'événements tactiles dans le développement Web mobile. Il a une bonne valeur de référence et j'espère qu'il sera utile à tout le monde. Suivons l'éditeur pour y jeter un œil, j'espère que cela pourra aider tout le monde.
Mots précédents
Afin de transmettre des informations spéciales aux développeurs, Safari pour iOS a ajouté de nouveaux événements exclusifs. Étant donné que les appareils iOS ne disposent ni de souris ni de clavier, les événements de souris et de clavier classiques ne suffisent tout simplement pas lors du développement de pages Web interactives pour Safari mobile. Avec l'ajout de WebKit dans Android, bon nombre de ces événements propriétaires sont devenus des standards de facto, ce qui a conduit le W3C à commencer à développer la spécification Touch Events. Cet article présentera en détail l'événement tactile mobile
Vue d'ensemble
Lorsque l'iPhone 3G contenant le logiciel iOS 2.0 est sorti, il incluait également une nouvelle version du navigateur Safari. . Ce nouveau Safari mobile propose de nouveaux événements liés aux opérations tactiles. Plus tard, les navigateurs sur Android ont également implémenté le même événement. Les événements tactiles sont déclenchés lorsque l'utilisateur place son doigt sur l'écran, le fait glisser sur l'écran ou l'éloigne de l'écran. Plus précisément, il existe les événements tactiles suivants
touchstart:当手指触摸屏幕时触发;即使已经有一个手指放在了屏幕上也会触发 touchmove:当手指在屏幕上滑动时连续地触发。在这个事件发生期间,调用preventDefault()可以阻止滚动 touchend:当手指从屏幕上移开时触发 touchcancel:当系统停止跟踪触摸时触发(不常用)。关于此事件的确切触发时间,文档中没有明确说明
[touchenter et touchleave]
La spécification des événements tactiles incluait autrefois les événements toucherter et touchleave, ces deux les événements sont déclenchés lorsque l'utilisateur déplace le doigt dans ou hors d'un élément. Mais ces deux événements ne se sont jamais réalisés. Microsoft propose des événements alternatifs pour ces deux événements, mais seul IE les prend en charge. Dans certains cas, il est très utile de savoir si le doigt de l'utilisateur glisse dans et hors d'un élément, j'espère donc que ces deux événements pourront revenir à la norme
Dans les événements tactiles, ceux couramment utilisés sont touchstart, touchumove et Les trois événements de touchend correspondent aux événements de souris comme suit
鼠标 触摸 mousedown touchstart mousemove touchmove mouseup touchend
[Note] Certaines versions d'événements tactiles utilisent des gestionnaires d'événements de niveau DOM0 sous le simulateur Chrome. l'ajout d'événements n'est pas valide
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <style> #test{height:200px;width:200px;background:lightblue;} </style> </head> <body> <p id="test"></p> <script> (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);}); })(); </script> </body> </html>
300ms
300ms Le problème fait référence à l'exécution d'un certain élément Il y a un intervalle de 300 millisecondes entre sa fonction et l'exécution de l'événement tactile. Par rapport aux événements tactiles, les événements de souris, les événements de focus, les comportements par défaut du navigateur, etc. ont tous un délai de 300 ms
【Cliquez via】
En raison de l'existence de 300 ms, cela provoquera des problèmes courants cliquez sur la question. Regardons d'abord l'exemple
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <style> #test {position: absolute;top: 0;left: 0;opacity: 0.5;height: 200px;width: 200px;background: lightblue;} </style> </head> <body> <a href="https://baidu.com">百度</a> <p id="test"></p> <script> (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);}); })(); </script> </body> </html>
Après avoir cliqué sur le p translucide bleu clair (déclenchant l'événement tactile), si la position du clic est juste au-dessus du lien, il sera déclenché. Le comportement par défaut des sauts de lien. L'explication détaillée est qu'après avoir cliqué sur la page, le navigateur enregistrera les coordonnées de la page cliquée, et 300 ms plus tard, l'élément sera retrouvé à ces coordonnées. Déclenchez le comportement du clic sur cet élément. Par conséquent, si l’élément supérieur de la même coordonnée de page disparaît dans les 300 ms, un comportement de clic sera déclenché sur l’élément inférieur 300 ms plus tard. Cela provoque un problème de clic
Ce problème est dû au fait que le comportement de toucher l'écran est surchargé. Au moment où le doigt touche l'écran, le navigateur ne peut pas prédire si l'utilisateur appuie, double-clique, glisse, maintient ou toute autre opération. La seule chose sûre à faire est d'attendre un peu et de voir ce qui se passe ensuite
Le problème est le double-tap. Même si le navigateur détecte que le doigt a quitté l’écran, il n’a toujours aucun moyen de savoir quoi faire ensuite. Parce que le navigateur n'a aucun moyen de savoir si le doigt reviendra à l'écran ou s'il finira par déclencher l'événement Tap et la cascade d'événements. Pour le déterminer, le navigateur doit attendre un court laps de temps. Les développeurs de navigateurs ont trouvé un intervalle de temps optimal, qui est de 300 millisecondes
[Solution]
1 Ajoutez un délai de 300 ms dans le gestionnaire d'événement de l'événement tactile
.
(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. Utilisez l'animation d'assouplissement et ajoutez un effet de transition de 300 ms. Notez que l'attribut d'affichage ne peut pas utiliser la transition
3. Ajoutez l'élément dom du calque intermédiaire et laissez le calque intermédiaire. acceptez-le Cet événement de pénétration sera masqué plus tard
4. L'événement tap est utilisé aux niveaux supérieur et inférieur, mais le comportement par défaut est inévitable
5. L'événement touchstart sur le document empêche le comportement par défaut.
document.addEventListener('touchstart',function(e){ e.preventDefault(); })
Ensuite, ajoutez le comportement de saut de la balise a
a.addEventListener('touchstart',function(){ window.location.href = 'https://cnblogs.com'; })
Cependant, cette méthode Il existe des effets secondaires, tels que la page ne peut pas défiler, le texte ne peut pas être sélectionné, etc. Si vous devez restaurer le comportement de sélection de texte sur un élément, vous pouvez utiliser empêcher le bouillonnement pour restaurer l'objet événement
el.addEventListener('touchstart',function(e){ e.stopPropagation(); })
[Informations de base]
L'objet événement de chaque événement tactile fournit des attributs communs dans les événements de souris, notamment le type d'événement, l'objet cible de l'événement, le bouillonnement d'événement, le flux d'événements, le comportement par défaut, etc.
En prenant touchstart comme exemple, l'exemple de code est le suivant
<script> (function () { var elesMap = { touchObj: document.getElementById('test') }, onTouch; onTouch = function (e) { console.log(e) }; elesMap.touchObj.addEventListener('touchstart', function (event) { onTouch(event); }); })(); </script>
1 L'attribut currentTarget renvoie l'emplacement de la fonction d'écoute. que l'événement est en cours d'exécution. Nœud lié
2. L'attribut cible renvoie le nœud cible réel de l'événement
3. L'attribut srcElement a la même fonction que l'attribut cible
<. 🎜>//当前目标 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 + '<br>changedTouches:' + e.changedTouches.length + '<br>targetTouches:' + e.targetTouches.length; }; elesMap.touchObj.addEventListener('touchstart', function (event) { onTouch(event); }); })();
【事件坐标】
上面这些触摸点数组中的元素可以像普通数组那样用数字索引。数组中的元素包含了触摸点的有用信息,尤其是坐标信息。每个Touch对象包含下列属性
clientx:触摸目标在视口中的x坐标 clientY:触摸目标在视口中的y坐标 identifier:标识触摸的唯一ID pageX:触摸目标在页面中的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 + '<br>clientY:' + touch.clientY + '<br>pageX:' + touch.pageX + '<br>pageY:' + touch.pageY + '<br>screenX:' + touch.screenX + '<br>screenY:' + touch.screenY }; elesMap.touchObj.addEventListener('touchstart', function (event) { onTouch(event); }); })();
相关推荐:
javascript移动设备Web开发中对touch事件的封装实例_javascript技巧
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!