2015-01-04 4 views
0

Мне было интересно, почему вам не разрешено иметь несколько похожих eventListeners на одном узле? Я представляю случай, когда у меня есть несколько частичных файлов того же типа, которые используют один узел для взаимодействия с eachother через CustomEvents. Но это, похоже, не работает, потому что все они используют один и тот же EventListener, и поэтому только один из них способен слушать и обрабатывать событие.Несколько компонентов, прослушивающих через eventlistener

Почему?

Спасибо!

EDIT: маленький фрагмент кода:

У меня есть

node.addEventListener("customEvent", this.func, false); 

и

node.addEventListener("customEvent", this.func, false); 

в двух разных местах и ​​this.func указывает на ту же функцию, но в разных contextes и будет в конечном счете, вызывают разные вещи. Но второй прослушиватель никогда не вызывается, потому что по какой-то причине это что-то кажется предполагающим, что их одно и то же, вероятно, потому, что подпись похожа или что-то еще.

EDIT2: Я в основном имею в виду это. https://developer.mozilla.org/en-US/docs/Web/API/EventTarget.addEventListener#Multiple_identical_event_listeners

+0

Успокойтесь, добавьте код, который не удался. – sabithpocker

+0

Пожалуйста, добавьте еще, где это происходит. В данный момент это 'window', вы используете это в функции. – Mouser

+0

Что вы подразумеваете под окном? К сожалению, полный фрагмент кода похож на 1000 LOC, что не помогло бы прояснить ситуацию. У меня просто есть node.addEventListener ("customEvent", this.func, false); определяемый в 2 замыканиях. узел указывает на тот же внешний узел для обоих. this.func имеет такое же определение функции в обоих затворах. – AlessandroEmm

ответ

0

Вы можете прикрепить несколько подобных обработчиков событий к узлу с помощью addEventListener.

node.addEventListener("click", function(){alert(1)}, false); 
node.addEventListener("click", function(){alert(2)}, false); 

Необходимо предупредить дважды. При назначении анонимной функции это работает.

Однако вы можете назначить несколько слушателей, ссылающихся на одну и ту же функцию и событие, используя bind.

var a = this.func.bind(); 
document.getElementById("start").addEventListener("click", a, false); 
var b = this.func.bind(); 
document.getElementById("start").addEventListener("click", b, false); 

Это будет предупреждать дважды. Поскольку оболочка функции отличается, она рассматривается как уникальное событие.

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

+0

Да, это работает, потому что функциональный блок отличается. Но добавьте один и тот же eventListener дважды в два места, и последний нужно называть когда-либо. – AlessandroEmm

+0

Вы имеете в виду добавление 'node.addEventListener (" click ", function() {alert (1)}, false)' дважды к узлу? Потому что 'node.addEventListener (« click », function() {alert (1)}, false)' и 'node2.addEventListener (« click », function() {alert (1)}, false)' work. – Mouser

+0

См. Мое редактирование. :-) Или узел2 и узел указывают на один и тот же узел? – AlessandroEmm

0

В Java вы можете добавить несколько слушателей. Но, честно говоря, мне не нравится этот подход. В большинстве случаев вам нужно только вызвать 1 интерфейс/объект (вы добавляете служебные данные, логику для нескольких интерфейсов, где используется только один).

Мне больше нравится Android-подход: setOn .... Событие (похоже, JS именно так) вместо addActionListener (...) Java.

Если вам нужно несколько триггеров, вы можете переопределить как:

obj.setOnEvent(function() { 
    doTheOtherEventTrigger(); 
    doOneMoreEventTrigger(); 
    ... 
} 
+0

Вы знаете, что OP задает вопрос о прослушивателях событий JavaScript на узлах html, а не на Java. – Mouser

+0

Да, вот почему я сказал: «(похоже, JS так)» – user3558040

+0

Но тогда это не полезный ответ. То, что работает в Java, не будет автоматически работать в JS. – Mouser

Смежные вопросы