J'ai fait une petite mise à jour du plugin d'Alexandre pour inclure le support Android. Le navigateur d'Android ne supporte pas actuellement la méthode window.Touch pour détecter le support tactile.
J'aime la façon dont le script d'Alexandre attend pour s'assurer qu'il n'y a pas eu de mouvement afin d'éviter de déclencher l'événement lorsque l'utilisateur glisse pour faire défiler l'écran. Cependant, un inconvénient de cette approche est qu'elle provoque son propre retard en attendant que l'utilisateur lève son doigt de l'écran avant de déclencher. J'ai mis à jour son plugin pour inclure une classe "touchactive" qui est appliquée aux éléments que l'utilisateur est en train de toucher. Si vous tirez parti de cette classe, vous pouvez fournir un retour visuel immédiat aux utilisateurs sans déclencher un événement réel jusqu'à ce que la vérification du mouvement soit terminée.
jQuery.event.special.touchclick = {
setup: function (data, namespaces) {
var elem = this, $elem = jQuery(elem);
var ua = navigator.userAgent.toLowerCase();
var isAndroid = ua.indexOf("android") > -1;
if (window.Touch || isAndroid) {
$elem.bind('touchstart', jQuery.event.special.touchclick.onTouchStart);
$elem.bind('touchmove', jQuery.event.special.touchclick.onTouchMove);
$elem.bind('touchend', jQuery.event.special.touchclick.onTouchEnd);
} else {
$elem.bind('click', jQuery.event.special.touchclick.click);
}
},
click: function (event) {
event.type = "touchclick";
jQuery.event.handle.apply(this, arguments);
},
teardown: function (namespaces) {
var elem = this, $elem = jQuery(elem);
if (window.Touch) {
$elem.unbind('touchstart', jQuery.event.special.touchclick.onTouchStart);
$elem.unbind('touchmove', jQuery.event.special.touchclick.onTouchMove);
$elem.unbind('touchend', jQuery.event.special.touchclick.onTouchEnd);
} else {
$elem.unbind('click', jQuery.event.special.touchclick.click);
}
},
onTouchStart: function (e) {
this.moved = false;
$(this).addClass('touchactive');
},
onTouchMove: function (e) {
this.moved = true;
$(this).removeClass('touchactive');
},
onTouchEnd: function (event) {
if (!this.moved) {
event.type = "touchclick";
jQuery.event.handle.apply(this, arguments)
}
$(this).removeClass('touchactive');
}
};
J'ai également publié ce document sur github au cas où d'autres problèmes seraient découverts. https://github.com/tuxracer/jquery-touchclick