Je déconne avec les événements tactiles sur un curseur tactile et je reçois toujours l'erreur suivante:
Tentative ignorée d’annuler un événement touchmove avec cancelable = false, par exemple parce que le défilement est en cours et ne peut pas être interrompu.
Je ne suis pas sûr de la cause de ce problème, je suis novice dans le traitement des événements tactiles et n'arrive pas à résoudre ce problème.
Voici le code qui gère l'événement tactile:
Slider.prototype.isSwipe = function(threshold) {
return Math.abs(deltaX) > Math.max(threshold, Math.abs(deltaY));
}
Slider.prototype.touchStart = function(e) {
if (this._isSliding) return false;
touchMoving = true;
deltaX = deltaY = 0;
if (e.originalEvent.touches.length === 1) {
startX = e.originalEvent.touches[0].pageX;
startY = e.originalEvent.touches[0].pageY;
this._$slider.on('touchmove touchcancel', this.touchMove.bind(this)).one('touchend', this.touchEnd.bind(this));
isFlick = true;
window.setTimeout(function() {
isFlick = false;
}, flickTimeout);
}
}
Slider.prototype.touchMove = function(e) {
deltaX = startX - e.originalEvent.touches[0].pageX;
deltaY = startY - e.originalEvent.touches[0].pageY;
if(this.isSwipe(swipeThreshold)) {
e.preventDefault();
e.stopPropagation();
swiping = true;
}
if(swiping) {
this.slide(deltaX / this._sliderWidth, true)
}
}
Slider.prototype.touchEnd = function(e) {
var threshold = isFlick ? swipeThreshold : this._sliderWidth / 2;
if (this.isSwipe(threshold)) {
deltaX < 0 ? this.prev() : this.next();
}
else {
this.slide(0, !deltaX);
}
swiping = false;
this._$slider.off('touchmove', this.touchMove).one(transitionend, $.proxy(function() {
this.slide(0, true);
touchMoving = false;
}, this));
}
Vous pouvez trouver le curseur actuel ici sous cette plume.
Si vous faites glisser votre doigt assez rapidement, l'erreur sera renvoyée et restera parfois coincée au milieu d'un balayage. Je n'arrive toujours pas à comprendre pourquoi cela ne fonctionne pas. Toute aide/compréhension serait grandement appréciée. Pas sûr de ce que je fais mal.
L'événement doit être cancelable
. L'ajout d'une instruction if
résout ce problème.
if (e.cancelable) {
e.preventDefault();
}
Dans votre code, vous devriez le mettre ici:
if (this.isSwipe(swipeThreshold) && e.cancelable) {
e.preventDefault();
e.stopPropagation();
swiping = true;
}
J'ai eu ce problème et tout ce que j'avais à faire, c'est return true
de touchend et l'avertissement est parti.
Appeler preventDefault
sur touchmove
pendant que le défilement est actif ne fonctionne pas dans Chrome. Pour éviter les problèmes de performances, vous ne pouvez pas interrompre un défilement.
Essayez d'appeler preventDefault()
à partir de touchstart
et tout devrait bien se passer.
Veuillez supprimer e.preventDefault()
, car event.cancelable
de touchmove est false
. Donc, vous ne pouvez pas appeler cette méthode.