如何倾听孩子们的心声;s儿童停止传播的事件
How to listen children's events when children stop propagation
我需要在Document
级别观看儿童事件,但如果儿童使用方法stopPropagation()
停止传播,我将无法侦听这些事件在儿童中发生。
有人知道更好的方法吗?
EDIT:现在我想创建一个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();
});
chrome扩展内容脚本
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.
});
您可以使用"捕获"在冒泡之前跟踪事件。在这篇文章中,有一个非常好的描述捕捉是如何工作的(与冒泡相比):冒泡和捕捉。
总之,除了IE9之前的IE之外,所有浏览器都会将事件沿链向下发送到事件发生的叶,然后将事件气泡返回。普通事件侦听只侦听实际对象上的事件或传播的事件,但如果将.addEventListener()
的第三个参数设置为true,则它也将侦听链上的事件,在冒泡开始或取消之前,document
对象将首先看到事件。
下面是一个工作片段演示:
// 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) {
log("document message - click in leaf");
}
}, true);
<div id="topParent">
<div id="midParent">
<div id="leaf">
Click Here
</div>
</div>
</div>
相关文章:
- 停止jquery中元素上的事件传播
- 停止点击事件传播
- 为什么我的按钮正在将事件传播到其父项
- 我可以停止某个函数上的事件传播吗
- AngularJS:如何通过点击停止事件传播
- 避免通过指令中的事件传播进行自切换
- 棱角分明如何防止点击事件传播到日期选取器元素
- 停止自动回发复选框的事件传播
- jQuery 事件传播无法按预期工作
- 用于停止事件传播的 jQuery UI 滑块
- 在 Google Maps API v3 中有效启用事件传播
- 停止传单事件传播
- 角度/离子点击事件传播
- setAbstractView() 可防止鼠标关闭事件传播到 KmlFeatures
- Phaser JS如何停止事件从textButton.events.onInputDown事件传播(触发)到game.i
- 仅追加一次 UI 元素,避免事件传播
- JavaScript + 事件传播
- 在表行单击时停止 JS 事件传播
- 停止特定处理程序的事件传播
- 无法停止 AngularJS 中路由控制器之间的事件传播