首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >防止为重叠的HTML元素触发事件

防止为重叠的HTML元素触发事件
EN

Stack Overflow用户
提问于 2013-01-05 01:51:35
回答 3查看 6.4K关注 0票数 13

因此,我有两个元素,一个嵌套在另一个元素中

代码语言:javascript
复制
<div id="outer">
    <div id="inner">
         <p>Lorem Ipsum</p>
    </div>
</div>

外部容器比内部容器大,从而实现模式覆盖布局。我想在外部暴露的表面上注册一个click事件,这将导致两者都被清除,但我不希望在单击内部div时发生这种情况。

我正在使用jQuery委托/停止传播,并试图询问元素以确保它是外部div,但无济于事-它仍然接收外部事件。我正在考虑在内部div之外的命中区域进行手摇,但我想知道是否有更优雅的替代方案。

编辑:

这里发布了几个很好的解决方案-非常感谢反馈!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-01-05 01:54:57

代码语言:javascript
复制
$("#inner").click(function(event){
  event.stopPropagation();
  // do something
});  

这里有一个小把戏:http://jsfiddle.net/sajjansarkar/fA2sd/1/

票数 21
EN

Stack Overflow用户

发布于 2013-01-05 01:54:22

代码语言:javascript
复制
$('#outer').on('click', function (e) {
    if ( e.target != this) return;
    // run your code here...
});

这就是问题所在:http://jsfiddle.net/9sLCx/

票数 8
EN

Stack Overflow用户

发布于 2013-01-05 02:04:27

event对象作为两个属性,这两个属性将帮助您完成此任务:

当事件遍历DOM时,event.currentTarget标识事件的当前目标。它总是引用事件处理程序所附加到的元素,而不是标识发生事件的元素的event.target。对于外部div,事件通知将传递两次,第一次是在捕获阶段,第二次是在冒泡阶段,在中间如果在内部div中实例化了一个处理程序,就会收到通知。您可以在需要时停止传播。

http://fiddle.jshell.net/hmariod/dvV4E/

代码语言:javascript
复制
document.getElementById("outer").addEventListener('click',etvFn,true);
document.getElementById("outer").addEventListener('click',etvFn,false);
document.getElementById("inner").addEventListener('click',etvFn,true);
document.getElementById("inner").addEventListener('click',etvFn,false);
document.getElementById("innerP").addEventListener('click',etvFn);

function etvFn(evt){
    var phase;
    if(evt.eventPhase === 1){
        phase = "Capture";
    }else if(evt.eventPhase === 2){
        phase = "Target";
    }else{
        phase = "Bubbling";
    }
    alert("Target:" + evt.target.id + "\nCurrent Target:" + evt.currentTarget.id + "\nPhase:" + phase);
}​
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14162237

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档