当您调用 时$(".red")
,它会返回当时存在的 DOM 元素的集合。因此$(".red").click(function...)
,只需将处理程序绑定到这些元素上的单击事件。如果您稍后创建具有相同类的新元素,它们不在此集合中,因此它们没有绑定到它们的处理程序。jQuery 不会监视 DOM 的变化并动态更新处理程序——绑定只是在您调用时匹配的元素上click()
。
您要么需要在添加新 HTML 后再次绑定处理程序,要么使用以下委托.on()
:
$(".blue").on("click", ".red", function(){
alert('click on a red box detected');
});
这通过将处理程序绑定到 来工作$(".blue")
,该处理程序不会动态更改。处理程序检查您单击的元素是否与“.red”选择器匹配,因此它能够处理动态添加的元素而无需重新绑定。
我认为它在您的第二个示例中起作用的原因是因为红色块不在蓝框内开始。当您将其移入内部时,jQuery 会重用相同的 DOM 元素,因此绑定也随之而来。在第一个示例中,红色框从蓝色框内开始。当你这样做时$('.red').parent().html(...)
,它做的第一件事是空$('.red').parent()
的(蓝色框),所以原来的红色元素从 DOM 中删除,它的绑定丢失了。