Есть ли способ убрать задержку нажатия на мобильных сенсорных устройствах? - PullRequest
9 голосов
/ 31 января 2012

При просмотре веб-сайта на мобильном устройстве (iPad, Galaxy Tab) всегда возникает задержка, когда я щелкаю элемент (обычная ссылка или что-либо еще, что делается кликабельным с помощью javascript / jquery).

Читая в Интернете, я обнаружил, что в браузере используется сенсорный запуск, за которым следуют события касания, а затем он запускает обычное событие нажатия. Есть ли способ сделать более отзывчивым касание и удалить событие клика, которое задерживается? Может быть, с помощью JavaScript или что-то еще?

Ответы [ 3 ]

5 голосов
/ 19 октября 2012

Адаптировано из библиотеки Мэтта (https://stackoverflow.com/a/9370637/1491212) само адаптировано из кода Google, я написал плагин jQuery.

Используйте вот так: $('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);
2 голосов
/ 31 января 2012

если вы пишете веб-страницу самостоятельно, вы можете зарегистрировать прослушиватель для сенсорного запуска и касания и без промедления запускать код onclick непосредственно с сенсорного конца.

Если вы не обработали событие вtouch move браузер отправит (с некоторой задержкой) событие щелчка элементу

Взгляните на это описание в Google, чтобы создать «быстрые кнопки»: http://code.google.com/intl/de-DE/mobile/articles/fast_buttons.html

0 голосов
/ 12 ноября 2012

Я использую обнаружение, если устройство поддерживает сенсорный модернизатор.я заполняю переменную под названием touchClick параметрами 'click' или 'touchend', основанными на результате, если это сенсорное устройство или нет.В jquery я просто называю:

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

У него очень маленький след.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...