JavaScript: удалить слушателя события из этого слушателя? - PullRequest
6 голосов
/ 08 февраля 2011

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

ОБНОВЛЕНИЕ:

Внутренне я хэш объектови слушатели, поэтому я потенциально могу удалить слушателя событий из любого места.Я просто обеспокоен удалением этого из себя.Будет ли такое действие действительно работать?

ОБНОВЛЕНИЕ

Я спрашиваю о addEventListener, removeEventListener stuff.

Ответы [ 5 ]

10 голосов
/ 26 октября 2012

Я только что видел это, потому что я задавался вопросом точно тот же вопрос!

arguments.callee - твой друг ...

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Functions_and_function_scope/arguments/callee

чтобы у вас было

blah.addEventListener('click',function(e){
    e.source.removeEventListener('click', arguments.callee);
    blee bloo bleep
});

это работает в Titanium Appcelerator, так что должно работать и в javascript (потому что это та же самая вещь)

NB НЕ добавляйте () в конец arguments.callee в этом примере, если вам не нравится видеть ... bah dum tish! .

На самом деле, если вы не хотите использовать arguments.callee, это также может работать (не проверено):

blah.addEventListener('click', anyThingYouWantHere : function(e){
    e.source.removeEventListener('click', anyThingYouWantHere);
    blee bloo bleep
});

Где "anyYouWantHere" - это любое имя переменной, которое вам нужно ~ вы фактически "называете" функцию, когда добавляете ее.

1 голос
/ 08 февраля 2011

Вы можете попробовать что-то вроде этого, в зависимости от того, как это называется:

some_div.onclick = function () {
    ...
    this.onclick = null;
    // or: some_div.onclick = null;
};

Или это событие слушателей вас волнует? Потому что это немного сложнее.

0 голосов
/ 30 января 2019

@ Бхаральский ответ дал мне теперь это решение:

//example
addBlurListener(element, field) {
    const listenToBlur = (e) => {
        e.target.removeEventListener(e.type, listenToBlur);
        //your stuff
    };
    element.addEventListener('blur', listenToBlur);
},
0 голосов
/ 10 сентября 2018

Я только что сделал функцию-обертку, которая генерирует самоуничтожающийся слушатель событий:

let addSelfDestructingEventListener = (element, eventType, callback) => {
    let handler = () => {
        callback();
        element.removeEventListener(eventType, handler);
    };
    element.addEventListener(eventType, handler);
};

Пока все отлично работает:)

0 голосов
/ 08 февраля 2011

Если вы используете jQuery, вам, вероятно, будут предоставлены некоторые удобные методы для взаимодействия с обработчиками событий - см. Bind () / unbind (), делегат () / undelegate (), one () и аналогичные методы .

У меня нет большого опыта работы с другими фреймворками, но я думаю, что они предлагают аналогичную функциональность. Если вы вообще не используете фреймворк, у @sdleihssirhc есть приемлемый ответ.

РЕДАКТИРОВАТЬ: Ах, возможно, вы ищете что-то более похожее на addEventListener () и removeEventListener () . Опять же, фреймворк обеспечит некоторое удобство для ваших взаимодействий и в некоторых случаях избавит вас от необходимости заново изобретать колесо.

...