Как предотвратить регистрацию нескольких повторяющихся событий?
У меня есть ситуация, когда библиотека.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() дважды?
удалить один, это будет работать:)