Подтвердить что ты не робот

Делает ли addEventListener (и removeEventListener) стек?

Учитывая следующее:

object.addEventListen(eventType01,handler01);
object.addEventListen(eventType01,handler01);

object.removeEventListener(eventType01,handler01);

Сколько прослушивателей событий для eventType01 находится на объекте? Один или ноль?

4b9b3361

Ответ 1

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

EDIT: Еще одна вещь, о которой следует помнить, заключается в том, что нет никакого штрафа за вызов нескольких одинаковых функций removeEventListener() на одном и том же объекте, за исключением ненужных служебных накладных расходов. Никакой смертельной ошибки не произойдет, она просто "тихо провалится" почти так же, как и повторные идентичные вызовы addEventListener.

РЕДАКТИРОВАТЬ 2: ответить @ThomasM:: если ваш слушатель дважды срабатывает, то у вас нет точно такого же слушателя. Попробуйте поместить этот быстрый и грязный код в кадр 1 во фле, в котором есть один квадратный мувиклип в качестве ребенка:

import flash.events.*
function foo(e):void{
    trace("hi");
}

this.addEventListener(MouseEvent.CLICK,foo);
this.addEventListener(MouseEvent.CLICK,foo);
this.addEventListener(MouseEvent.CLICK,foo);

Обратите внимание, что ваш результат при щелчке мувиклипа - это точно одно действие трассировки.

Теперь добавьте эту строку в конец кода

this.removeEventListener(MouseEvent.CLICK,foo);

Даже если вы добавили foo в качестве слушателя для нажатия 3 раза, этот вызов полностью уничтожит слушателя.

Итак, если вы столкнулись с проблемой, когда "тот же самый слушатель" срабатывает дважды, то, вероятно, что вы делаете, это примерно так:

this.addEventListener(MouseEvent.CLICK, function(e){
    trace("hi");
});

this.addEventListener(MouseEvent.CLICK, function(e){
    trace("hi");
});

Это будет "дважды срабатывать", потому что функции слушателя НЕ ЯВЛЯЮТСЯ ТОЛЬКО. Они выполняют те же действия, но не ссылаются на одинаковые позиции в памяти. Они не указывают на один и тот же функциональный объект. Кроме того, это очень плохая практика, потому что у вас нет возможности фактически удалить этих слушателей. Как бы вы это сделали? У вас нет ссылок на них.