Измените идентификатор элемента, но jQuery все еще запускает событие, вызывающее старый идентификатор. Почему это работает?
Я создал скрипку, чтобы попытаться отладить проблему, с которой я сталкиваюсь, когда я переставляю html-элементы с помощью jQuery, события наведения на эти элементы больше не работают.
однако я наткнулся на эту интересную ситуацию здесь:http://jsfiddle.net/4yv1trj4/
у меня есть main div
это меняет цвет, как только я наведу на него курсор.
$("#block").hover(function() {
$(this).css("backgroundColor", "red");
}, function() {
$(this).css("backgroundColor", "#888");
});
если нажать на кнопку main div
' S ID изменяется на block2
:
$("#block").attr("id","block2");
но $("#block").hover()
все еще срабатывает, когда я зависаю над #block2
. Кроме того, все вызовы наведения на #block2
не работают. Есть ли фундаментальный принцип работы jQuery, который объяснил бы это?
4 ответов
при этом:
$("#block").hover(function() {
$(this).css("backgroundColor", "red");
}, function() {
$(this).css("backgroundColor", "#888");
});
вы говорите jQuery искать элемент с block
ID и привязать к нему событие наведения. После этого мероприятия останется привязана к этому элементу, не важно, что происходит с его ID потом.
то есть, если у вас нет кода, который отвязывается это, конечно.
как расширение к ответу lucasnadalutti: стоит отметить, что вы можете добавить привязку к контейнеру и дать результат, который вы ожидаете:
пример:
$("body").on("mouseenter", "#block", function () {
$(this).css("backgroundColor", "red");
}).on('mouseleave', "#block", function () {
$(this).css("backgroundColor", "#888");
});
видеть привязки на body
, а не фактический элемент. Трюк, который нужно держать в заднем кармане.
демо: jsFiddle
обновление:
из раздела комментариев ясно, что требуется предупреждение - вы должны привязаться к ближайшему элементу на странице. body
использовался здесь в качестве простого примера.
хотя я думаю, что это решение подойдет вам элегантно, вы должны прочитать должны ли все события jquery быть привязаны к $(document)? прежде, чем вы начнете злоупотреблять этой властью.
Если вы удалите прослушиватель наведения jQuery и добавите наведение CSS, он работает так, как вы хотите:
#block:hover {
background-color:red;
width:300px;
height:300px;
}
$("#block")
ищет конкретный объект DOM. .hover()
свяжет событие наведения с этим объектом DOM. $("#block").attr("id","block2");
изменит атрибут (id) этого объекта DOM, но событие наведения по-прежнему привязано к нему.