jQuery:忽略选择器中的 class
jQuery: Ignore class in selector
我有一个 div 和里面的 div 各种元素。现在我不想将点击事件添加到 div,但不要将它添加到具有特定 class.
的 div 内的元素
问题是,元素可以处于我不知道的不同级别,所以 $("#mydiv > :not(.disabled)").click
不起作用。
如何排除具有特定 class 的子元素?
$("#mydiv").on("click",function(e){
if($(e.target).closest("#mydiv .disabled").length){
return
}else{
//do whatever you want to do.
}
});
如果单击的元素正在 .disabled
,则忽略该事件
您的代码非常接近您的要求。您只需要从直接子项 select 或一般子项切换即可。
示例标记:
<div id="myDiv">
<div class="enabled"></div>
<div class="enabled"></div>
<div class="disabled"></div>
<div>
<div class="disabled"></div>
</div>
</div>
$("#myDiv > :not(.disabled)")
将忽略第一个禁用的 class 但不会影响任何嵌套元素,因为“>”只有 select 下一层的子元素。
$("#myDiv :not(.disabled)")
将 select #myDiv 的所有子级(不包括层次结构中的任何位置的 .disabled)。
正如@Robo Robok 指出的那样,不清楚您是否想要 selector 在 #myDiv 或其子元素上。在此示例中,在 #myDiv 内单击而不是在禁用区域上将产生所需的效果。但是,如果您的 div 中有 space,如 padding 或 space children 之间,单击那里将没有效果。
我想你要做的是将 selector 放在 div 上,然后防止从禁用区域冒泡。
$("#myDiv").on("click", function(e) {
if ($(e.target).is(".disabled")) {
return;
}
//your code
});
如果您想抑制对禁用元素和任何后代元素的点击,Sushi 的答案是可以的。
如果在某些情况下你有一个带有非禁用后代的 .disabled 元素,并且你想要:
- 允许点击未禁用的后代来触发
#myDiv
点击操作
- 禁止点击 .disabled 元素本身
然后进行如下操作:
$("#mydiv").on("click", function(e) {
// desired action.
}).find(".disabled").on('click', function(e) {
e.stopPropagation();
});
最有可能导致此考虑成为问题的情况是具有大量绝对定位的页面,其中 DOM 层次结构未反映在页面布局中。
你可以使用这样的东西
$("#mydiv :not(.disabled)").on("click", function (event) {
// DO WHATEVER YOU WANT
event.stopPropagation(); // Prevents multiple-firing of event
});
这里有一个 jsfiddle 示例。单击非禁用元素时,它会显示 "click" 消息。但是,如果您在禁用元素位于启用元素内时未捕获点击事件,则会触发该事件。解决方案是捕获 .disabled 元素上的点击事件并停止传播点击事件。
$("#mydiv .disabled").on("click", function (event) {
event.stopPropagation(); // Prevents bubbling up of event
});
我有一个 div 和里面的 div 各种元素。现在我不想将点击事件添加到 div,但不要将它添加到具有特定 class.
的 div 内的元素问题是,元素可以处于我不知道的不同级别,所以 $("#mydiv > :not(.disabled)").click
不起作用。
如何排除具有特定 class 的子元素?
$("#mydiv").on("click",function(e){
if($(e.target).closest("#mydiv .disabled").length){
return
}else{
//do whatever you want to do.
}
});
如果单击的元素正在 .disabled
您的代码非常接近您的要求。您只需要从直接子项 select 或一般子项切换即可。
示例标记:
<div id="myDiv">
<div class="enabled"></div>
<div class="enabled"></div>
<div class="disabled"></div>
<div>
<div class="disabled"></div>
</div>
</div>
$("#myDiv > :not(.disabled)")
将忽略第一个禁用的 class 但不会影响任何嵌套元素,因为“>”只有 select 下一层的子元素。
$("#myDiv :not(.disabled)")
将 select #myDiv 的所有子级(不包括层次结构中的任何位置的 .disabled)。
正如@Robo Robok 指出的那样,不清楚您是否想要 selector 在 #myDiv 或其子元素上。在此示例中,在 #myDiv 内单击而不是在禁用区域上将产生所需的效果。但是,如果您的 div 中有 space,如 padding 或 space children 之间,单击那里将没有效果。
我想你要做的是将 selector 放在 div 上,然后防止从禁用区域冒泡。
$("#myDiv").on("click", function(e) {
if ($(e.target).is(".disabled")) {
return;
}
//your code
});
如果您想抑制对禁用元素和任何后代元素的点击,Sushi 的答案是可以的。
如果在某些情况下你有一个带有非禁用后代的 .disabled 元素,并且你想要:
- 允许点击未禁用的后代来触发
#myDiv
点击操作 - 禁止点击 .disabled 元素本身
然后进行如下操作:
$("#mydiv").on("click", function(e) {
// desired action.
}).find(".disabled").on('click', function(e) {
e.stopPropagation();
});
最有可能导致此考虑成为问题的情况是具有大量绝对定位的页面,其中 DOM 层次结构未反映在页面布局中。
你可以使用这样的东西
$("#mydiv :not(.disabled)").on("click", function (event) {
// DO WHATEVER YOU WANT
event.stopPropagation(); // Prevents multiple-firing of event
});
这里有一个 jsfiddle 示例。单击非禁用元素时,它会显示 "click" 消息。但是,如果您在禁用元素位于启用元素内时未捕获点击事件,则会触发该事件。解决方案是捕获 .disabled 元素上的点击事件并停止传播点击事件。
$("#mydiv .disabled").on("click", function (event) {
event.stopPropagation(); // Prevents bubbling up of event
});