2015-12-22 130 views
0

我需要在Document级别观看儿童事件,但是如果儿童使用方法stopPropagation()停止传播,我无法听到儿童发生的这些事件。如何在儿童停止传播时聆听儿童事件

有人可以知道更好的方法来做到这一点吗?


编辑:现在我想创建一个Chrome扩展监视DOM节点事件,但事件可以停止传播,这是不是一个很好的做法,额外的监听器添加到所有节点。以下示例将显示我的问题。

客户HTML片段

<body> 
    <input type="button" value="Click Me" id="b"> 
</body> 

客户的JavaScript

var button = document.querySelector('#b'); 
button.addEventListener('click', function(e) { 
    console.log('Button has been clicked'); 
    e.stopPropagation(); 
}); 

浏览器扩展程序内容脚本

document.addEventListener('click', function(e) { 
    console.log('Node(' + e.target.nodeName + ') has been clicked'); 
    // this listener will not be invoked because event has been stopped 
    // propagation. 
}); 
+0

当问的问题在这里它始终是更好地描述你真正的问题,不只是你的尝试性解决方案的问题。这可以让人们阅读你的问题,为你提供你甚至没有意识到的解决方案。当你只描述你尝试的解决方案的问题并且没有描述真正的问题时,除了你正在尝试创建的解决方案之外,我们几乎无法做到。这被称为[XY问题](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem),严重限制了人们可以帮助你的程度。 – jfriend00

回答

2

您可以使用“捕获”在冒泡之前跟踪事件。这篇文章中有很好的描述捕捉工作的原理(与冒泡形成对照):Bubbling and capturing。总之,IE9之前除了IE以外的所有浏览器,都会将事件沿链发送到发生事件的叶,然后它们将事件重新启动。正常事件侦听只侦听实际对象上的事件或传播事件,但如果将第三个参数设置为.addEventListener()为true,那么它也将侦听事件沿着链条向下传递,其中document对象将在此之前看到事件FIRST冒泡甚至已经开始或被取消。

这里的工作片断演示:

// show output 
 
function log(x) { 
 
    var div = document.createElement("div"); 
 
    div.innerHTML = x; 
 
    document.body.appendChild(div); 
 
} 
 

 
// stop propagation on leaf click 
 
var leaf = document.getElementById("leaf"); 
 

 
leaf.addEventListener("click", function(e) { 
 
    log("leaf message - click in leaf, propagation stopped") 
 
    e.stopPropagation(); 
 
}, false); 
 

 
// capture listen 
 
document.addEventListener("click", function(e) { 
 
    if (e.target === leaf) { 
 
    \t log("document message - click in leaf"); 
 
    } 
 
}, true);
<div id="topParent"> 
 
    <div id="midParent"> 
 
    <div id="leaf"> 
 
    Click Here 
 
    </div> 
 
    </div> 
 
</div>

+0

其实,现在我正在开发Chrome扩展来监视DOM事件。将事件侦听器添加到所有DOM节点并不是一种好方法,所以我需要在高级别中添加侦听器,例如'document'。但是,事件可能会在其自己的听众中停止传播。 – nailiebreak

+0

@nailiebreak - 您要监控哪个事件,为什么? – jfriend00

+0

我已更新我的问题。为什么我需要在'document'中观看事件是因为我不知道哪个实际的DOM节点客户点击或更改。 – nailiebreak