Is there a way to remove the clicking lag on mobile touch devices?

后端 未结 3 832
你的背包
你的背包 2020-12-17 22:12

When viewing a web site on a mobile device (iPad, Galaxy Tab) there\'s always a lag when I click an element (regular link or anything else that is made clickable using javas

相关标签:
3条回答
  • 2020-12-17 22:31

    if you are writing a web page your self you can register a listener for touchstart and touchend and trigger the onclick code directly from on touch end without any delay.

    If you don`t handle the event in touch move the browser will dispatch (with some lag) a click event to the element

    Take a look at this description from google to create "fast buttons": http://code.google.com/intl/de-DE/mobile/articles/fast_buttons.html

    0 讨论(0)
  • 2020-12-17 22:45

    I use detection if the device support touch like modernizer. i fill a var called touchClick with the options 'click' or 'touchend' bases on the outcome if it is a touch device or not. In jquery I simply call:

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

    It has a very small footprint.

    0 讨论(0)
  • 2020-12-17 22:53

    Adapted from Matt's library (https://stackoverflow.com/a/9370637/1491212) itself adapted from google code, I wrote a jQuery plugin.

    Use like this : $('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 讨论(0)
提交回复
热议问题