2016-01-20 25 views
14

Büyük bağlantılara sahip bir sayfada, FastClick kullanıyorum çünkü mobil tarayıcılarda dokunma için 300 ms gecikmesini atlamak istiyorum. Bağlantılarımın ':active durumları için bir "vurgu" stili var ve FastClick sayesinde hızlı bir şekilde düzgün bir şekilde ateş ediyor.Fastclick'in "active" durumunu kaydırmada engellemesinin bir yolu var mı?

Sorunum, - en azından Mobil Safari'de - sayfayı kaydırmak için dokunduğunuzda ve hızlıca kaydırırken de patlar. Bu, bağlantılara dokunmaya çalıştığınızı düşünmeden sayfayı kaydıramazsınız gibi hissetmenizi sağlar.

Birisi kaydırdığında ateşlemenin önlenmesi için bir yol var mı?

cevap

2

Belki de needsclick sınıfını gövdeye ekleyebilirsiniz?

<body class="needsclick"> 

... 

</body> 

Sadece bir fikir :)

+0

Teşekkür yardımcı olur. –

2

Güzel soru! +1

Bu sorunun FastClick ile ilgisi yoktur, ancak FastClick sorununuzu daha karmaşık hale getirmektedir. Bu yüzden saf JavaScript ve ham Dokunma Olaylarına bağlı kalacağım)

Mobil bir dokunmatik cihazda, web görünümünün uygulanması, platformun belirli nedenlerinden dolayı masaüstü web tarayıcısından önemli ölçüde farklıdır. Bu durumda önemli olan bir özellik web görünümünde hız kaydırmadır. Momentum Scrolling, cihazın donanımsal hızlandırılmış bir özelliğidir. Ekrana kaydırılabilir bir alan dokunduğunda, donanım dokunuşu tanımlar ve kaydırılabilir alana 200 milisaniyelik bir geri sayım sayacı ekler; bu da tetiklendiğinde alanı bir donanım hızlandırmalı kaydırma haline getirir. Donanım durumdayken, donanım hızlandırılmış kaydırmaya özel olduklarından dokunma olayları yayınlanmaz. Zamanlayıcı iptal edilebilir ve sağlanan 200 milisaniyede dokunma olayında preventDefault kullanılarak momentum kaydırma engellenir.

Bu soruna şu şekilde yaklaşıyorum. Yerel kaydırma işlevini kullandığınızı varsayalım: overflow:scroll. Yöntem, yapıştırmak istediğiniz öğeye bir touchstart olayı eklemektir. touchstart olayı tetiklendiğinde, olay işleyicisi hedef öğeye touchend, touchmove ve touchcancel olaylarını ekler. 140ms sonra yeni eklenen olayları kaldıran setTimout zamanlayıcı başlatılır. İşte

benim üretim kodu için bazı klipler şunlardır: Ben koleksiyonlardan olayları ekleme ve kaldırma için iki olay yöntemleri var:

:

Sonra
var eventify = (function() { 
    function eventify(type, el, callback, phase) { 
     phase = phase || false; 
     if ((el.constructor.toString().contains('NodeList')) || (el.constructor.toString().contains('HTMLCollection'))) { 
      [].forEach.call(el, function (element) { 
       if (!element.hasEvent(type)) { 
        element.addEvent(type); 
        HTMLElement.prototype.addEventListener.apply(element, [type, callback, phase]); 
       } 
      }); 
     } else { 
      if (!el.hasEvent(type)) { 
       el.addEvent(type); 
       HTMLElement.prototype.addEventListener.apply(el, [type, callback, phase]); 
      } 
     } 
     return callback; 
    } 

    return eventify 
})(); 

var uneventify = (function() { 
    function uneventify(type, el, callback) { 
     if ((el.constructor.toString().contains('NodeList')) || (el.constructor.toString().contains('HTMLCollection'))) { 
      [].forEach.call(el, function (element) { 
       if (element.hasEvent(type)) { 
        element.removeEvent(type); 
        HTMLElement.prototype.removeEventListener.apply(element, [type, callback]); 
       } 
      }); 
     } else { 
      if (el.hasEvent(type)) { 
       el.removeEvent(type); 
       HTMLElement.prototype.removeEventListener.apply(el, [type, callback]); 
      } 
     } 
    } 

    return uneventify 
})(); 

Ben kaydıraç musluk etkinlikleri için tapify yöntemine sahip

var tapify = (function() { 
    function tapify(el, callback) { 
     eventify('touchstart', el, function (e) { 
      var that = this; 
      var start = e.pageY; 
      var target = e.target; 
      function dynamicEvents() { 
       var endfn = eventify('touchend', target, function (evt) { 
        e.preventDefault(); 
        e.stopImmediatePropagation(); 
        evt.preventDefault(); 
        evt.stopImmediatePropagation(); 
        uneventify('touchmove', target, movefn); 
        uneventify('touchend', target, endfn); 
        uneventify('touchcancel', target, cancelfn); 
        callback && callback(target); 
       }); 
       var cancelfn = eventify('touchcancel', target, function (evt) { 
        e.preventDefault(); 
        e.stopImmediatePropagation(); 
        evt.preventDefault(); 
        evt.stopImmediatePropagation(); 
        uneventify('touchmove', target, movefn); 
        uneventify('touchend', target, endfn); 
        uneventify('touchcancel', target, cancelfn); 
        callback && callback(target); 
       }); 
       var movefn = eventify('touchmove', target, function (evt) { 
        var distance = start - evt.pageY; 
        if (distance > 20) { 
         uneventify('touchend', target, endfn); 
         uneventify('touchcancel', target, cancelfn); 
         uneventify('touchmove', el, movefn); 
        } 
       }); 
       setTimeout(function() { 
        uneventify('touchmove', target, movefn); 
        uneventify('touchend', target, endfn); 
        uneventify('touchcancel', target, cancelfn); 
       }, 140); 
      } 
      if (global.isIos) setTimeout(function() { 
       dynamicEvents(); 
      }, 60); 
      else dynamicEvents(); 
     }, false); 
    } 
    return tapify; 
})(); 

Hedef aygıtı tanımlamak için global.isIos kullanıyorum. Android, dokunma olaylarını 200ms'lik web görünümüne göndermeyi durdurdu.

Sonra kullanın eleman veya elemanların bir koleksiyona eklemeyi de:

tapify(document.querySelectorAll('button'), function (e) { 
     //your event handler here!! 
}); 

Umut bu ... aslında hiç denetimler için çalışmaktan FastClick önleyecek

+0

Yerel bir kaydırma yüzeyinde kaydırma ve sürükleme olayları için bu aynı yöntemi kullanmak mümkündür. –

+0

Cevabınız için teşekkürler! Şu anda, FastClick ile uyumlu bir şeyler denemeyi umuyordum ve… bir JS yeni kullanıcısı olarak, aklımda, cevabınızla birlikte aklımdayım ancak FastClick ile nasıl bağlantı kurduğunu görmüyorum. Ancak cesur olursam, kodunuzun bir kısmını projeme eklemeye çalışırım. –

+0

Sadece FastClick'i yalnızca gerekli olan öğelere eklemenizi öneririm. –

İlgili konular