HTML
<div class="mybox" id="element1">
<div class="mybox" id="element2">
<div class="mybox" id="element3">
</div>
<div class="mybox" id="element4">
</div>
</div>
</div>
JS-
$(".mybox").live("mouseup", function(event) {
alert($(this).attr("id"));
});
好吧,我的问题是如何只获取活动的div(我点击的那个,而不是所有的父)。当我点击element2时,我得到element2&然后"element1"激活,当我点击element3时,我得到element2&然后元素1再次激活,等等
有什么建议吗?
您看到所有这些警报的原因是由于事件冒泡。每次单击某个元素时,事件都会在链上传播。每一个附带了点击事件的元素都将被执行。
为了确保您只在单击当前元素时执行代码,并忽略冒泡事件,请更改事件以检查当前元素是否是您使用event.target单击的元素,然后才执行您想要的代码:
$(".mybox").live("mouseup", function(event) {
if(event.target === this){
alert($(this).attr("id"));
}
});
DEMO-使用live
如果您使用的是jQuery 1.7或更高版本,live()
已被弃用,并且on()现在是附加和删除事件的首选方式。
要使用on()
,您可以执行以下操作:
(document).on("mouseup", ".mybox", function(event) {
if (event.target === this) {
alert($(this).attr("id"));
}
});
DEMO-使用on()
当使用on()
时,您可以指定最接近的静态元素,在上面的示例中就是文档。但是,如果您有一个更接近的静态元素,则应该使用它而不是document
。
我已经在答案中链接了所有需要的文件,但要再次总结。
资源
- live()-提供了它被弃用的所有详细信息
- on()-自1.7起首选
- delegate()-自1.4.2或更高版本起,可以使用它而不是live
正如Francois所写,这种效果被称为"事件冒泡"。但是jquery有自己的功能来防止事件向上传播:stopPropagation
$("p").click(function(event){
event.stopPropagation();
// do something
});
只有当这种方法在您的特殊情况下不起作用时,才应该使用比较事件目标的解决方案。