Как предотвратить регистрацию нескольких повторяющихся событий?

У меня есть ситуация, когда библиотека.js регистрирует событие mouseup для элемента DOM. Элемент DOM удаляется и заменяется, а событие перерегистрируется. Это приводит к регистрации двух повторяющихся событий. Вот репродукция для примера:

Обратите внимание: это использует JQuery версии 1.4.4

<div id="top">
 <div id="nested">
  <div id="stranded">
   Alien Code
  </div>
 </div>
</div>​

<script type="text/javascript">
 function addLive(){
  $("#stranded").live("mouseup",
   function (e) {
    var node = document.getElementById("stranded");
    var nodeCopy = $(node).clone(true)[0];
    var tar  = document.getElementById("nested");
    tar.appendChild(nodeCopy);
   }
  );
 }
 addLive();
 addLive();
</script>

Кроме того, вот jsFiddle: http://jsfiddle.net/3zbtK/

Как я могу предотвратить второй звонок addLive от регистрации события мыши, если оно уже существует?

4 ответа

Решение
function addLive(){
 $("#stranded").die("mouseup");
 $("#stranded").live("mouseup",
  function () {
   var node = document.getElementById("stranded");
   var nodeCopy = $(node).clone(true)[0];
   var tar  = document.getElementById("nested");
   tar.appendChild(nodeCopy);
 }
);
}

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

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

Я думаю, что вы ищете, это предотвращение дефолта

<script>
$("a").click(function(event) {
  event.preventDefault();
  $('<div/>')
    .append('default ' + event.type + ' prevented')
    .appendTo('#log');
});
</script>

также вы можете проверить это

Например, клики по клику не приведут браузер к новому URL. Мы можем использовать event.isDefaultPrevented(), чтобы определить, был ли этот метод вызван обработчиком события, который был вызван этим событием.

Вы точно не сообщите нам, каковы ваши ограничения на редактирование и какой код вы можете изменить.

Самое простое было бы перестать использовать .live() и просто прикрепить событие непосредственно к объекту. Затем, когда объект удаляется, то же происходит и с обработчиком событий.

Если вы не можете сделать это по другой причине, вы также отслеживаете, установлен ли обработчик событий уже в глобальной переменной или с помощью jQuery's. .data() на #stranded элемент.

PS .live() устарела, и вы должны использовать .on() (jQuery 1.7+) или .delegate() (jQuery до 1.7) для всех версий jQuery.

Почему вы вызываете функцию addLive() дважды?

удалить один, это будет работать:)

Другие вопросы по тегам