Speed ​​Fix: Как удалить задержку 300 мс в мобильных приложениях jQuery - программирование

Speed ​​Fix: Как удалить задержку 300 мс в мобильных приложениях jQuery

Как удалить задержку клика/отвода с мобильного Safari на iOS?

Я немного поиграл с прослушивателями событий и использовал кучу разных сценариев (например, Lightning Touch), чтобы не было радости, Есть несколько решений, которые бы сработали, однако эти типы скриптов заставляют вас кодировать целевой элемент для каждой ссылки в DOM. К сожалению, это может привести к быстрым и медленным переходам, которые не будут работать для меня.

4b9b3361

Ответ 1

Наконец-то я нашел ответ на мои скоростные проблемы после неустанного поиска, и он приходит в виде FastClick (этот поток подробно рассказывает, а также некоторые твики в комментариях от других пользователей).

Включите FastClick.js script, добавьте прослушиватель onLoad и оберните содержимое <body> в промежутке, и ваше приложение должно начать чувствовать себя намного более родным.


onLoad Listener: <body onLoad="initFastButtons();">

Обтекание Span:

<body onLoad="initFastButtons();">
    <span id="fastclick">

    [...]

    </span>
</body>

FastClick.js

//======================================================== FASTCLICK
         function FastButton(element, handler) {
            this.element = element;
            this.handler = handler;
            element.addEventListener('touchstart', this, false);
         };
         FastButton.prototype.handleEvent = function(event) {
            switch (event.type) {
               case 'touchstart': this.onTouchStart(event); break;
               case 'touchmove': this.onTouchMove(event); break;
               case 'touchend': this.onClick(event); break;
               case 'click': this.onClick(event); break;
            }
         };
         FastButton.prototype.onTouchStart = function(event) {

event.stopPropagation();
            this.element.addEventListener('touchend', this, false);
            document.body.addEventListener('touchmove', this, false);
            this.startX = event.touches[0].clientX;
            this.startY = event.touches[0].clientY;
 isMoving = false;
         };
         FastButton.prototype.onTouchMove = function(event) {
            if(Math.abs(event.touches[0].clientX - this.startX) > 10 || Math.abs(event.touches[0].clientY - this.startY) > 10) {
               this.reset();
            }
         };
         FastButton.prototype.onClick = function(event) {
            this.reset();
            this.handler(event);
            if(event.type == 'touchend') {
               preventGhostClick(this.startX, this.startY);
            }
         };
         FastButton.prototype.reset = function() {
            this.element.removeEventListener('touchend', this, false);
            document.body.removeEventListener('touchmove', this, false);
         };
         function preventGhostClick(x, y) {
            coordinates.push(x, y);
            window.setTimeout(gpop, 2500);
         };
         function gpop() {
            coordinates.splice(0, 2);
         };
         function gonClick(event) {
            for(var i = 0; i < coordinates.length; i += 2) {
               var x = coordinates[i];
               var y = coordinates[i + 1];
               if(Math.abs(event.clientX - x) < 25 && Math.abs(event.clientY - y) < 25) {
                  event.stopPropagation();
                  event.preventDefault();
               }
            }
         };
         document.addEventListener('click', gonClick, true);
         var coordinates = [];
         function initFastButtons() {
 new FastButton(document.getElementById("fastclick"), goSomewhere);
         };
         function goSomewhere() {
 var theTarget = document.elementFromPoint(this.startX, this.startY);
 if(theTarget.nodeType == 3) theTarget = theTarget.parentNode;

 var theEvent = document.createEvent('MouseEvents');
 theEvent.initEvent('click', true, true);
 theTarget.dispatchEvent(theEvent);
         };
//========================================================

Ответ 2

Это работает для меня. Всякий раз, когда новая страница добавляется в dom, мы можем быстро присоединить все ссылки...

 // when new pages are loaded into the DOM via JQM AJAX Nav, apply ko bindings to that page DOM
$(document).on('pageinit', '.ui-page', function (event, data)
{
    var activePage = $(event.target).get(0);
    FastClick.attach(activePage);
});

Ответ 3

Ben Howdle недавно создал проект с открытым исходным кодом Touche.js, который адресован эта проблема довольно просто и элегантно. Возможно, стоит искать всех, кто ищет решение этой проблемы.

Ответ 4

Я не могу напрямую оставлять комментарии к рекомендациям MikeZ.

Я использовал его успешно, но должен был сделать несколько дополнительных tweek, особенно для устройств Android.

Вместо вызова event.preventDefault(); в gonClick() мне также пришлось вызывать event.stopImmediatePropagation();

В противном случае вы можете столкнуться с особенностями проблемы, когда динамические элементы, такие как панели, открываются поверх элемента, который вы нажали.

Полный метод gonClick(), который будет использоваться с решением MikeZ:

function gonClick(event) {
    for ( var i = 0; i < coordinates.length; i += 2) {
        var x = coordinates[i];
        var y = coordinates[i + 1];
        if (Math.abs(event.clientX - x) < 25 && Math.abs(event.clientY - y) < 25) {
            event.stopPropagation();
            event.preventDefault();
            event.stopImmediatePropagation();
        }
    }
};