Mobile Safari “touchend” événement ne se déclenche pas lors de la dernière touche est retiré?
Le "geste" je suis en train de capture est un robinet quand, mais uniquement lorsqu'un élément (ou d'autres de même) a déjà un contact sur elle. Donc, touch (1) appuie sur le bouton vers le bas tandis que la touche (2) robinets à certaines options, appuyez sur (1) les rejets et le bouton est enfoncé.
Le problème, je vais avoir, c'est avec le dernier bit. Le "touchend" l'événement n'est pas déclenché lorsque je presse le dernier doigt? Donc je n'ai aucun moyen d'appuyer sur le bouton?
..les "touchend" l'événement a toujours la touche.longueur = 0?
Voici un peu de code de sorte que vous pouvez voir ce que je veux dire. Je pense que cela peut être un bug dans le navigateur safari mobile?
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Multi-touch problem</title>
<style>
#touchpane{
width:900px;
height:500px;
background-color:#333;
}
</style>
</head>
<body>
<div id="touchpane" click="void();"></div>
<script>
var tp = document.getElementById("touchpane");
tp.addEventListener('touchstart', function(e){
e.preventDefault();//to stop copy and paste
console.log("touchstart " + e.touches.length );
}, false)
tp.addEventListener('touchend', function(e){
console.log("touchend " + e.touches.length );
//not called when last finger removed?
}, false)
tp.addEventListener('touchcancel', function(e){
console.log("touchcancel");
}, false)
</script>
</body>
</html>
- Assurez-vous d'inclure votre version de l'OS. Cela fonctionne comme prévu pour moi en 3.1.3 (first-gen iPod touch): "évènements touchstart 1", "évènements touchstart 2", "touchend 1", "touchend 0".
- Bien sûr, désolé. 3.2.1 sur l'iPad. Ce et quelques autres semblent avoir été corrigés dans la version 4.2
Vous devez vous connecter pour publier un commentaire.
Je peux vous aider avec un problème, mais je ne sais pas pourquoi le "touchend" n'est-ce pas de tir lorsque les deux doigts de quitter l'écran, lorsque j'exécute ton code ci-dessus, le "touchend" feux lorsque doigt quitte l'écran (sur un iPhone 4)
1) Alors que le "touchend" événements javascript pour iPhone ne "touche" la propriété, c'est toujours va être vide lors de la dernière doigt quitte l'écran, parce que "touche" pour l'iPhone représente doigts actuellement en touchant l'écran, et "touchend" ne se déclenche après un doigt quitte l'écran. Donc sur "touchend" "e.touche.longueur" sera toujours à 0 lors de la dernière doigt est levé.
2) Vous pouvez accéder à ce qui touche ont changé dans le "touchend" de l'événement à l'aide de la "changedTouches de la propriété". C'est problématique parce que c'est un comportement n'est pas très cohérent.
Si vous touchez l'écran avec un doigt, puis un autre, puis vous retirez le doigt, un certain nombre de choses peuvent se produire.
Si vous lorsque vous avez supprimé le deuxième doigt, rien n'a changé sur le premier doigt, votre événement objet dans le "touchend" aura "des touches.longueur = 1" (le doigt sur l'écran) et "changedTouches.longueur = 1" (le doigt à gauche de l'écran).
Toutefois, si vous déplacez le premier doigt (même un peu) lorsque vous retirez le deuxième doigt, puis sur "touchend" votre objet événement aura "des touches.longueur = 1" (le doigt sur l'écran) et "changedTouches.longueur = 2" (le doigt à gauche de l'écran + le mouvement de la première doigt).
J'ai trouvé cet article très utile:
http://m14i.wordpress.com/2009/10/25/javascript-touch-and-gesture-events-iphone-and-android/
TouchEvent du type touchend ont toujours e.touche.longueur de 0
Le manque de dernière touchend événement pourrait être dépendante sur les objectifs de la touche. Si les deux doigts de l'ascenseur en même temps ET les deux ont la même cible, alors un seul touchend le feu, mais qu'elle touche à l'e.changedTouches objet. Si les objectifs sont différents, alors vous verrez deux touchend des événements, chacune associée à la touche dans le changedTouches objet.
De plus, et le plus déroutant, c'est que lorsque vous soulevez une de deux doigts, vous obtiendrez le même comportement que si vous aviez levé. Ensuite, lorsque le doigt se déplace, cela va déclencher une autre évènements touchstart, avec ce doigt de l'identificateur d'origine de la touche. Le résultat est qu'il n'y a aucun moyen de dire au moment de la touchend qui touche a terminé jusqu'à ce que, après une quantité arbitraire de temps (lorsque le doigt se déplace).
Pour vérifier cela, vous avez besoin de documenter la touchLists dans chaque cas.
La seule solution que j'ai trouvé est un cludge où je cache les évènements touchstart événements, setInterval pour une demi-seconde, alors j'espère que le reste doigt a tiré évènements touchstart je peux utiliser pour concilier l'état. Bon Sang!