w3schools touchend eventos event javascript jquery event-handling slider touch

javascript - touchend - Tocar mover atascarse Ignorado intento de cancelar un touchmove



touchmove javascript (4)

Estoy jugando con eventos táctiles en un control deslizante táctil y sigo recibiendo el siguiente error:

El intento ignorado de cancelar un evento de movimiento táctil con cancelable = falso, por ejemplo, porque el desplazamiento está en curso y no puede ser interrumpido

No estoy seguro de qué está causando este problema, soy nuevo en el trabajo con eventos táctiles y parece que no puedo solucionar este problema.

Aquí está el código que maneja el evento táctil:

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)); }

Puede encontrar el control deslizante real aquí en esta pluma .

Si se desliza lo suficientemente rápido, se lanzará el error y, a veces, se atascará en medio de un golpe. Todavía no puedo entender por qué no está funcionando. Cualquier ayuda / conocimiento sería muy apreciado. No estoy seguro de lo que estoy haciendo mal.


El evento debe ser cancelable . Agregar una sentencia if resuelve este problema.

if (e.cancelable) { e.preventDefault(); }

En tu código deberías ponerlo aquí:

if (this.isSwipe(swipeThreshold) && e.cancelable) { e.preventDefault(); e.stopPropagation(); swiping = true; }


Las llamadas a preventDefault en touchmove mientras se está desplazando activamente no funcionan en Chrome. Para evitar problemas de rendimiento, no puede interrumpir un desplazamiento.

Intente llamar a preventDefault() desde touchstart y todo debería estar bien.


Tuve este problema y todo lo que tenía que hacer es return true desde el touchend y la advertencia desapareció.


e.preventDefault() , porque event.cancelable de touchmove es false . Así que no puedes llamar a este método.