与.find(someElem)相反,即.想要省略子项,如果 e.target 用于事件处理程序
Opposite of .find(someElem), ie. want to omit children if e.target for event handler
我正在尝试解决一些困境,遇到了一点问题。
所以,我想跟踪页面上的所有点击,并且只有在 e.target 不是某些元素的子元素时才做一些事情。所以我有:
jQuery('body').click(function(e){
// some stuff
// do some more stuff
if(!(jQuery('#element1, #element2, #element3').find(e.target))){
// do something extra here ONLY if the target is NOT a child
// of any of those elements
}
})
这似乎不起作用。我尝试了一些其他事情来营造"找不到"的氛围,唉,.not,!(),等。不能。似乎忽略了整个代码。即使我做了一个简单的:只是为了测试:
// I expressly click outside this area of element1, still captures it.
if(jQuery('#element1').find(e.target)){
console.log('in')
e.stopPropagation();
// failes
有几种方法可以做到这一点。最小的更改是将.length
附加到您的条件:
if(!jQuery('#element1, #element2, #element3').find(e.target).length) {
// do something extra here ONLY if the target is NOT a child
// of any of those elements
}
如果没有.length
条件将始终为 false,因为 jQuery 对象是一个真值,即使它不包装任何 DOM 元素。
更好的方法可能是向后进行检查:与其从目标元素散开并遍历所有 DOM(这可能意味着访问数百个后代),为什么不简单地走目标的父元素(这将是一个小得多的数字)代替?
if(!$(e.target).parents().filter('#element1, #element2, #element3').length) {
// do stuff
}
第三种方法是在您感兴趣的元素上安装一个单独的单击处理程序,并使用它来阻止单击事件冒泡到<body>
:
$('#element1, #element2, #element3').click(function(e){
e.stopPropagation();
});
这样,您就不需要在原始处理程序中使用条件,但我不希望这样做,因为它在处理程序之间引入了乍一看不相关的"微妙"依赖关系。
我想你搜索jQuery.parents(selector)
: 文档 jQuery
$('body').click(function(e) {
if (e.target.parents(<selector>).length == 0) {
// Not child of selected parent => do something
}
});
相关文章:
- 如果 a 为 false,则 if(a) === if(false)
- RegEx删除空属性?例如,如果(class=“”||class=“”)移除;否则就下课
- 如何在angularJS中编辑时,如果DB中的值为true,则设置复选框,如果值为false,则取消选中复选框
- 如果使用 lodash 将属性存在于另一个对象中,则向对象添加属性
- 如果文本字段为空,则使用JavaScript应用CSS样式
- 如果我在javascript中输入无效的电子邮件或空白,如何显示特定的文本框边框红色
- 如果href包含X,请更改href
- 如果localstorage为空,则显示欢迎消息
- 点击后隐藏潜水?(但如果Div是一面旗帜呢?)
- 如果元素's的ID以数字开头
- Jquery表单验证插件-如果选中复选框,如何在提交时执行某些操作
- Jquery模板,如果xx&&如果yy
- 如果值为空,如何设置输入的默认值?jQuery
- 如果选中了多个复选框,如何添加事件
- 如何检查元素的内容是否为空,如果为空,请在jquery中删除该元素
- 如何知道元素在屏幕上是否可见.如果没有,请滚动页面
- Javascript,如果条件在没有&&逻辑运算符当&&它不起作用
- 如果 href=“#” 或 target=“_blank” 则不会阻止 请求
- 与.find(someElem)相反,即.想要省略子项,如果 e.target 用于事件处理程序
- 如果iframe页面使用_parent target,请在新选项卡中打开iframe