Распространение событий и множественные обработчики событий - PullRequest
0 голосов
/ 20 июля 2011

Хорошо, я в замешательстве. У меня есть глобальный обработчик событий клика на document. На странице у меня есть несколько ссылок. Каждая ссылка обрабатывается одним и тем же обработчиком события щелчка, который, помимо прочего, предотвращает всплытие события на уровень документа и предотвращает выполнение ссылки. Из этих ссылок одна имеет специальный обработчик кликов, который предполагается , чтобы сделать свое дело, а затем передать событие общему событию щелчка для ссылок. Но это не так.

document.onclick = function()
  {
   document.body.innerHTML += "You clicked me!"; 
};

  document.getElementsByTagName("a")[0].onclick = function(e) {
   this.innerHTML += " Click it!";
    e.stopPropagation();
    //This return false appears only to
    //prevent the link from its default action
  return false; 
  };
document.getElementById("link").onclick = function(e) {
  this.innerHTML += " Go ahead, ";
  //But this return false appears to stop
  //the propagation up to the previous event
  //I would think that removing the link below
  //would cause the event to propagate to the event
  //above which would then stop the propagation and
  //prevent the default, but apparently this is 
  //not the case; removing the line below causes
  //the link to load Google like normal
  return false;
};

Как заставить нижнее событие сработать и перейти к верхнему событию, которое затем отменяет событие?

Посмотрите, что я имею в виду здесь

1 Ответ

1 голос
/ 20 июля 2011

Ха, дух.использование element.on<event> - это просто установка свойства в DOM для элемента, что означает, что каждое событие может иметь только один обработчик.Вместо этого мне нужно использовать addEventListener в сочетании с правильным использованием event.preventDefault() и event.stopPropagation()

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

Мой исправленный код должен быть:

document.onclick = function()
  {
   document.body.innerHTML += "You clicked me!"; 
};
document.getElementById("link").addEventListener("click",function() {
  this.innerHTML += " Go ahead, ";
});
  document.getElementsByTagName("a")[0].addEventListener("click",function(e) {
   this.innerHTML += " Click it!"; 
    e.stopPropagation();
    e.preventDefault();
   });

http://jsbin.com/ecozep/8/edit

...