我不确定这真是冒泡,我会解释。
我有这个:
<div>
<div>
text here
</div>
</div>
如何绑定一个on click事件,以便它只影响所包含的div?如果我这样设置:
jQuery('div').bind('click', function() {
jQuery(this).css('background','blue');
});
它使所有的div成为蓝色。如果我将false作为第三个参数(防止冒泡)添加到绑定函数,它什么都不做。
我怎样解决这个问题?
答案 0 :(得分:6)
http://api.jquery.com/event.stopPropagation/
在犯罪者中添加event.stopPropagation();
。
(但是,为嵌套的DIV分配ID或类可能会更好,因此您可以确定它是受影响的唯一一个。)
答案 1 :(得分:4)
您应该使用ID或类等标识符,但对于您的示例,您可以执行此操作:
jQuery('div > div').bind('click', function() {
jQuery(this).css('background','blue');
});
...它会将处理程序绑定到另一个div
的直接后代div
。
因此,要么初始选择特定于您想要影响的元素,要么使用事件委托,在祖先上放置处理程序,并测试您想要的元素。
委托示例: http://jsbin.com/ehemac/edit#javascript,live
<div id="container">
<div class="outer">
<div>
text here
</div>
</div>
<div class="outer">
<div>
text here
</div>
</div>
</div>
jQuery('#container').delegate( '.outer > div', 'click', function() {
jQuery(this).css('background','blue');
});
这使用delegate()
[docs]方法将处理程序置于具有ID #container
的祖先。
.delegate()
的第一个参数是选择器。在#container
内单击的任何元素都会将该选择器与单击的元素进行比较。如果选择器匹配,则将调用处理程序。
答案 2 :(得分:2)
http://jsfiddle.net/vol7ron/WzSkj/
jQuery('div:not(:has(div))').bind('click', function() {
jQuery(this).css('background','blue');
});
这应该是您所需要的全部内容,因为它会查看所有div
并查找那些没有子div的内容(因此,它们将是该元素类型的最后一个后代。您可以进一步过滤此内容如果您想要排除那些独立的div
,请确保他们的父级是div。
这绝不是一个完整/健壮的插件。它仅作为如何定位链中最后一个元素的示例。有关使用插件执行此操作的方法,请参阅修订历史记录。如果您希望将其用于生产,则应对此进行修改。
(function($){
$.fn.lastDescendant = function(el){
var found = jQuery(el + ':first').siblings(el).andSelf();
var prev, curr;
var stack = this;
for (var i=0,n=found.length; i<n; i++){
curr = found.eq(i).find(el);
while (curr.length){
prev = curr;
curr = curr.find(el);
}
stack = stack.add(prev);
}
return stack;
};
})( jQuery );
jQuery.fn.lastDescendant('div')
.click(function(){
jQuery(this).css("background","#09c");
});
<强> 注意:的强>
div
中,然后执行上述操作。 答案 3 :(得分:0)
要解决此问题,只需使用更具体的选择器
jQuery('div > div').bind('click', function() {
jQuery(this).css('background','blue');
})
答案 4 :(得分:0)
解决问题的最佳方法是为内部div
提供一个可识别的功能,例如类<div class="inner"></div>
。
或者,更改您的选择器:
$('div > div').click(function() {
$(this).css('background', 'blue');
}
答案 5 :(得分:0)
尝试给内部div一个id标签并引用它......
<div><div id=foo>text goes here</div></div>
...
$('#foo').bind('click', function() {
$(this).css('background','blue');
});
HTH - 乔