2012-01-30 16 views
9

Podczas przeglądania strony internetowej na urządzeniu mobilnym (iPad, karta Galaxy) zawsze występuje opóźnienie po kliknięciu elementu (zwykły link lub cokolwiek innego, co można klikać za pomocą javascript/jquery).Czy istnieje sposób na usunięcie opóźnienia kliknięcia na urządzeniach mobilnych?

Podczas czytania w Internecie dowiedziałem się, że przeglądarka używa touchstartu, po którym następują zdarzenia touchend, a następnie uruchamia zwykłe kliknięcie. Czy istnieje sposób na bardziej elastyczne kliknięcie i usunięcie opóźnionego zdarzenia kliknięcia? Może używając javascript lub czegoś innego?

Odpowiedz

2

Jeśli sam piszesz stronę internetową, możesz zarejestrować słuchacza na touchstart i touchend i wywołać kod onclick bezpośrednio z ekranu dotykowego bez żadnych opóźnień.

Jeśli don`t obsłużyć zdarzenia w kontakcie przesunąć przeglądarka wyśle ​​(z pewnym opóźnieniem) zdarzenie click do elementu

Spójrz na tego opisu z Google do tworzenia przycisków „fast”: http://code.google.com/intl/de-DE/mobile/articles/fast_buttons.html

+0

Byłoby dobrze, gdybyś mógł opublikować kod, w jaki sposób to zrobiłbyś. Zwykle używam jQuery podczas budowania stron internetowych i wiem, że mogę użyć .trigger(), aby wywołać zdarzenie click. Ale nie mam pojęcia, w jaki sposób mogę automatycznie wywoływać "kliknięcie" na każdym "dotknięciu" bez ręcznego dodawania za każdym razem kiedy go potrzebuję ... – Gabriel

+1

zaktualizowałem odpowiedź za pomocą odpowiedniego linku –

5

Dostosowany z biblioteki Matta (https://stackoverflow.com/a/9370637/1491212) sam zaadaptowany z kodu google, napisałem wtyczkę jQuery.

Zastosowanie tak: $('mySelector').fastClick(handler);

(function($){ 
    var clickbuster = { 
     preventGhostClick: function(x, y) { 
      clickbuster.coordinates.push(x, y); 
      window.setTimeout(clickbuster.pop, 2500); 
     }, 
     pop: function() { 
      clickbuster.coordinates.splice(0, 2); 
     }, 
     onClick: function(event) { 
      for (var i = 0; i < clickbuster.coordinates.length; i += 2) { 
      var x = clickbuster.coordinates[i]; 
      var y = clickbuster.coordinates[i + 1]; 
      if (Math.abs(event.clientX - x) < 25 && Math.abs(event.clientY - y) < 25) { 
       event.stopPropagation(); 
       event.preventDefault(); 
      } 
      } 
     } 
    }; 


    var methods = { 
     init: function(handler){ 
      return this.each(function() { 
       var $this = $(this), 
        data = $this.data('fastClick'); 
       if(!data){ 
        this.addEventListener('touchstart', methods.handleEvent, false); 
        this.addEventListener('click', methods.handleEvent, false); 
        $this.data('fastClick', { 
         target: $this, 
         handler: handler 
        }); 
       } 
      }); 
     }, 
     handleEvent:function(event) { 
      switch (event.type) { 
      case 'touchstart': $(this).fastClick('onTouchStart',event); break; 
      case 'touchmove': $(this).fastClick('onTouchMove',event); break; 
      case 'touchend': $(this).fastClick('onClick',event); break; 
      case 'click': $(this).fastClick('onClick',event); break; 
      } 
     }, 
     onTouchStart: function(event) { 
      event.stopPropagation(); 
      this[0].addEventListener('touchend', methods.handleEvent, false); 
      var _this = this; 
      document.body.addEventListener('touchmove', function(event){ 
      methods.handleEvent.apply(_this,[event]); 
      }, false); 

      $(this).data('fastClick').startX = event.touches[0].clientX; 
      $(this).data('fastClick').startY = event.touches[0].clientY; 
     }, 
     onTouchMove: function(event) { 
      if (Math.abs(event.touches[0].clientX - this.data('fastClick').startX) > 10 || 
       Math.abs(event.touches[0].clientY - this.data('fastClick').startY) > 10) { 
       this.fastClick('reset'); 
      } 
     }, 
     onClick: function(event) { 
      event.stopPropagation(); 
      $(this).fastClick('reset'); 
      $(this).data('fastClick').handler.call(this,event); 

      if (event.type == 'touchend') { 
      clickbuster.preventGhostClick($(this).data('fastClick').startX, $(this).data('fastClick').startY); 
      } 
     }, 
     reset: function() { 
      this[0].removeEventListener('touchend', methods.handleEvent, false); 
      document.body.removeEventListener('touchmove', methods.handleEvent, false); 
     } 
    } 
    $.fn.fastClick = function(method) { 
     if (methods[method]) { 
      return methods[method].apply(this, Array.prototype.slice.call(arguments, 1)); 
     } else if (typeof method === 'object' || typeof method === 'function' || !method) { 
      return methods.init.apply(this, arguments); 
     } else { 
      $.error('Method ' + method + ' does not exist on jQuery.hScroll'); 
     } 

    } 

    clickbuster.coordinates = []; 
    document.addEventListener('click', clickbuster.onClick, true); 

})(jQuery); 
+0

To wydaje się fajne, ale mogę ". t jak się dowiedzieć, co kliknąłem - $ (this) nie zwraca rzeczy, którą klikasz, w przeciwieństwie do normalnego wiązania zdarzenia. '$ ('a'). fastClick (function() {alert ($ (this) .attr ('href'))});' Na przykład - jak mogę to uruchomić? –

+0

Wpadłem też na ten problem. Właśnie zredagowałem moją odpowiedź. Procedura obsługi onClick musi być wywołana w odpowiednim zakresie: handler.call (this, event); Zobacz edytuj –

+1

Czy jest to już wymagane? Widziałem kilka artykułów sugerujących, że od Gingerbread dalej, jeśli wyłączyłeś powiększanie metatagu widoku, dotknięcia nie miały opóźnienia ... Wiesz coś o tym? –

0

używam wykrywanie jeśli dotykowy Obsługa urządzeń jak modernizatora. Wypełnij var o nazwie touchClick z opcjami 'click' lub 'touchend' w oparciu o wynik, jeśli jest to urządzenie dotykowe, czy nie. W jquery po prostu zadzwonię:

$('element').on(touchClick, function(e){ //do something }); 

Ma bardzo mały ślad.

+0

Takie podejście jest niebezpieczne, jeśli przeglądarka jest używana z laptopa z ekranem dotykowym. Kliknięcia myszy nie działałyby ... – franzlorenzon

Powiązane problemy