2014-10-21 14 views
18

jestem aprowizacji ze zdarzeń dotykowych na suwaku dotykowym i wciąż otrzymuję następujący błąd:dotykowy ruch utknięcie Ignorowane próbę anulowania touchmove

Ignored attempt to cancel a touchmove event with cancelable=false, for example because scrolling is in progress and cannot be interrupted.

Nie jestem pewien, co jest przyczyną tego problemu Jestem nowy w pracy z wydarzeniami dotykowymi i nie mogę tego naprawić.

Oto kod obsługi zdarzenia dotykowy:

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

można znaleźć rzeczywiste suwak here at this pen.

Jeśli przesuniesz szybko wystarczająco szybko, spowoduje to błąd i czasami utknie w środku przesunięcia. Nadal nie mogę zawinąć głowy, dlaczego nie działa. Każda pomoc/wgląd byłby bardzo doceniony. Nie jestem pewien, co robię źle.

Odpowiedz

9

Miałem ten problem i wszystko, co musiałem zrobić, to return true od touchenda i ostrzeżenie odeszło.

+7

Nic tu nie zmienia – Eric

+0

A z jakiego powodu to działa? –

+0

Dodałem "e.cancelable" do instrukcji if przed próbą wywołania 'e.preventDefault()' wewnątrz tej instrukcji. – ravo10

3

Dzwonienie pod numer preventDefault pod numerem touchmove podczas aktywnego przewijania nie działa w przeglądarce Chrome. Aby zapobiec problemom z wydajnością, nie można przerwać przewijania.

Spróbuj zadzwonić pod numer preventDefault() z touchstart i wszystko powinno być w porządku.

+1

Po prostu otrzymuję: Zignorowano próbę anulowania zdarzenia touchstart – Curtis