2016-04-01 2 views
0

В javascript, если событие инициировано, и соответствующий обратный вызов добавляется в очередь сообщений цикла цикла javascript. Можно ли удалить его из очереди через javascript-код?Удаление сообщений в очереди сообщений javascript в цикле событий

Обратите внимание, что события вызывают на высокой частоте, поэтому их можно добавить в очередь событий до того, как будет выполнен какой-либо код javascript. Я не видел описания, говорящего, что removeEventListener действительно проходит очередь сообщений и удаляет соответствующие события; хотите дважды проверить, действительно ли removeEventListener делает это, и такая функция реализована одинаково во всех javascript-движках.

+0

_Is можно удалить его из очереди? _ Конечно, [removeEventListener] (https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/removeEventListener) – hindmost

+0

Можете ли вы дать пример использования для этого? –

+0

Скажите, что я хочу, чтобы вызов вызывался дважды, я могу добавить флаг в обратном вызове, чтобы проверить, если он уже вызван, но хотите знать, есть ли другие способы сделать это правильно. – Gooly

ответ

0

Стандартный Javascript не предлагает прямого доступа к очереди событий. Вы можете прослушивать события (часто с .addEventListener() или регистрируя обратные вызовы и, когда это будет их очередь, это событие будет срабатывать, и ваш обратный вызов будет вызван. Или некоторые слушатели могут быть удалены с помощью .removeEventListener() или путем отмены определенной операции (например, clearTimeout()), но нет прямого доступа к управлению очередью событий.

Возможно, вам понадобится иметь встроенный код внутри виртуальной машины, чтобы сделать это, и как это сделать, было бы нестандартным и специфичным для в частности, Javascript VM.

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

function callOnce(fn) { 
    var called = false; 
    return function() { 
     if (!called) { 
      called = true; 
      return fn.apply(this, arguments); 
     } 
    } 
} 


// create a callOnce function stub for myFunction 
var cb = callOnce(myFunction); 

obj1.addEventListener("click", cb); 
obj2.addEventListener("click", cb); 
obj3.addEventListener("click", cb); 

myFunction будет вызван только один раз, когда наступит первое событие. После этого он будет заблокирован заглушкой callOnce, которая была создана при определении cb.

+0

Если я удаляюEventListener, удаляются ли соответствующие сообщения, помещенные в очередь? Или это только предотвращает запуск событий в будущем? – Gooly

+0

@ Gooly - Нельзя сказать извне, поскольку это зависит от реализации JVM и, честно говоря, это несущественно, так как это тоже не имеет никакого значения. Если вы сообщите нам, какую проблему вы действительно пытаетесь решить, а не задаете эти теоретические вопросы, мы, вероятно, могли бы помочь лучше. – jfriend00

+0

@Gooly - В другом комментарии где-то еще вы упомянули о предотвращении вызова обратного вызова дважды. Вы можете очень легко создать обратный вызов, который предотвращает вызов вызываемого вызова дважды, а затем всякий раз, когда вы хотите зарегистрировать обратный вызов одного использования, вы просто делаете что-то вроде «obj.addEventListener» («eventname», callOnce (myFunc)) »и Обертка callOnce обрабатывает ее для вас. – jfriend00

0

Да. его можно отвязать событие от объекта.

  • , если вы использовали addEventListener прикрепить событие затем использовать removeEventListener, чтобы удалить его.

  • если вы использовали jQuery .bind(), используйте .unbind(), чтобы удалить его.

  • если вы использовали jQuery .on(), то используйте .off(), чтобы удалить его.

  • если вы используете attachEvent, вы можете использовать detachEvent().

  • Если вы используете onclick или другие подобные функции, вы можете удалить их, просто установив для него значение null.

    ex. obj.onclick = null.

+0

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

+0

Вопрос заключается не в том, как развязать (какое неудачное выражение jQuery дал нам) событие от объекта, но как управлять событиями ** уже запущены ** и ждать исполнения. –