Bonjour,
C'est effectivement un comportement connu et très gênant. Pour expliquer de façon triviale, les évènements tactiles de touchstart et touchend "traversent" les contrôles pour aller agir sur la carte qui se trouve derrière.
Pour éviter ce comportement, il va falloir redéfinir le comportement associé à ces évènements sur chacun des contrôles, de manière à :
- supprimer leur comportement par défaut
- arrêter la propagation de l'élément au travers du contrôle
- et dans le cas du touchstart affecter le comportement attendu en appelant le comportement qui se déclenche par défaut en monde non tactile (à ne pas dupliquer dans le touchend sinon l'action sera lancée deux fois).
En pratique, imaginons que vous ayez créé un bouton permettant de faire un zoom avant sur votre carte, de nom de contrôle "ZoomOn" et géré par un élément HTML de classe "boutonZoomOnItemInactive", la gestion des comportements tactiles se ferait de la façon suivante :
1 2 3 4 5 6 7 8 9 10
|
$('.boutonZoomOnItemInactive').on('touchstart', function(e) {
e.preventDefault(); // Annulation du comportement par défaut
e.stopPropagation(); // Arrêt de la propagation
boutonZoomOn.trigger(); // lancement de l'action souhaitée
});
$('.boutonZoomOnItemInactive').on('touchend', function(e) {
e.preventDefault(); // Annulation du comportement par défaut
e.stopPropagation(); // Arrêt de la propagation
}); |
Ce bout de code en JQuery est à adapter en Javascript pur si on utilise pas JQuery, et à appliquer sur tous les contrôles de la carte, le plus délicat étant de bien redéfinir l'action souhaitée.
Partager