Как я могу предотвратить то, что событие touchend «запомнилось» браузером и впоследствии запускается в неподходящее время? - PullRequest
1 голос
/ 18 сентября 2011

РЕДАКТИРОВАТЬ

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

Я расширил прототип HTMLElement с помощью нового tap метода, например, так:

HTMLElement.prototype.tap = function (func) {
    this.addEventListener("touchend", func, false);
};

Я также создал пользовательский tap событие в jQuery:

$(document).delegate("*", "touchend", function (e) {
    $(this).trigger("tap");
});

Я также создал плагин jQuery под названием tap :

$.fn.tap = function (func) {
    this.bind("tap", func);
};

Если я попытаюсь использовать любойиз них с функцией обратного вызова, которая включает в себя оператор оповещения, обратный вызов выполняется дважды.Я нажимаю на элемент, чтобы открыть предупреждение.Я нажимаю кнопку «ОК» в оповещении, чтобы закрыть его.В следующий раз, когда я коснусь экрана, независимо от того, как долго я буду ждать, снова появится предупреждение.На этот раз нажатие кнопки «ОК», по-видимому, не вызывает другого повтора.

Однако, если функция обратного вызова не включает оператор оповещения (например, вместо этого я использую оператор console.log), только обратный вызоввыполняется один раз.

Кто-нибудь знает способ справиться с этим?Я собираюсь попробовать отцепить обработчик событий изнутри себя, а затем снова связать его, но это не более чем взлом, если он даже удастся.

Я бы предпочел сделать "1028 *" правильно " способ.: -)

ORIGINAL

Я только что закончил писать функцию "tap", которую я могу использовать, расширяя прототипы HTMLElement или Element, а также пользовательский "tap"плагин событий и «тап» как для jQuery.Я думал, что у меня есть это в сумке, пока я не решил использовать простое заявление о предупреждении в качестве тестового кода.

Когда я использую их с каким-либо элементом на моей тестовой странице, они запускаются должным образом, когда я впервые "нажимаю" на элемент, но проблема возникает после того, как я нажимаю кнопку «ОК» оповещения, а затем, через какое-то время, снова нажимаю на экран, после чего обработчик событий запускается второй раз.

Сначала я подумал, что это быломой собственный код, но когда я попробовал его с помощью следующего очень простого JavaScript, я смог воспроизвести точно такую ​​же проблему.

document.getElementById("some-element").ontouchend = function (e) {
    alert("Howdy doody!");
};

Я думаю, что это как-то связано с тем, что я должен коснутьсяснова на экране, чтобы выполнить «ОК» для оповещения, в то же время технически «внутри» обработчика событий (поскольку оповещение фактически «блокирует» завершение функции обработчика).

Тот факт, что поведениене реплицируется со следующим немного другим кодом, кажется, поддерживает мое воображение.: -)

document.getElementById("some-element").ontouchend = function (e) {
    console.log("Howdy doody!");
};

Если я включу приведенный выше код на страницу и коснусь этого элемента после срабатывания обратного вызова, я не получу повторного запуска этой функции обратного вызова в отличие от предыдущего блока кода, гдеЯ увижу всплывающее предупреждение во второй раз, когда в следующий раз коснусь экрана после нажатия «ОК» , независимо от того, где на странице я нажимаю .

Действительно странная проблема, иЯ не смог найти никакой информации о том, почему это может происходить.У кого-нибудь есть идеи, что происходит?

1 Ответ

3 голосов
/ 20 марта 2012

Я полагаю, что визуальное, полностраничное предупреждение, запускаемое на сенсорном конце, влияет на цикл сенсорных событий. Попробуйте вызвать оповещение после сдачи в DOM. например.

setTimeout(function() {
    alert('btn clicked');
}, 0);
...