- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我真的很喜欢Javascript中的事件,尤其是冒泡 - 但我一直想知道是否有可能获得反向冒泡效果,例如通过事件而不是 parent 到达 child 。我知道有捕获阶段 - 但这实际上只适用于点击和点赞,而不适用于自定义事件。
那么,这可能吗?
谢谢!亚历山德罗
最佳答案
我认为您可能正在寻找事件委托(delegate)或至少与事件委托(delegate)使用的内容相关的内容:事件对象的target
属性。无论您在何处 Hook 事件,target
属性都会反射(reflect)事件分派(dispatch)到的元素。这意味着您可以在祖先元素上 Hook 事件,然后查看 target
属性来确定事件分派(dispatch)到的后代元素。这是一个示例(我在这里使用 click
,但稍后有一个自定义事件示例):
document.getElementById("parent").addEventListener(
"click",
function(e) {
console.log("Element clicked: " + e.target.id);
},
false
);
<p>Click either of the child elements below:</p>
<div id="parent">
<div id="first-child">first child</div>
<div id="second-child">second child</div>
</div>
还有 currentTarget
,它是您 Hook 事件的元素(如果您通过 addEventListener
Hook 事件,它也是 this
并且您不要使用绑定(bind)或箭头函数)。
这意味着从到达祖先的事件开始,您可以通过循环目标元素的 parentNode
来跟踪其通过后代元素的整个路径:
document.getElementById("root").addEventListener(
"click",
function(e) {
var path = [];
for (var node = e.target; node != this; node = node.parentNode) {
path.push(node.id);
}
console.log("Path: " + path.join(", "));
},
false
);
<p>Click below:</p>
<div id="root">
<div id="branch-1-level-1">
<div id="branch-1-level-2">
<div id="branch-1-level-3">
<div id="branch-1-level-4-child-1">branch-1-level-4-child-1</div>
<div id="branch-1-level-4-child-2">branch-1-level-4-child-2</div>
</div>
</div>
</div>
<div id="branch-2-level-1">
<div id="branch-2-level-2">
<div id="branch-2-level-3">
<div id="branch-2-level-4-child-1">branch-2-level-4-child-1</div>
<div id="branch-2-level-4-child-2">branch-2-level-4-child-2</div>
</div>
</div>
</div>
</div>
以下是自定义事件的示例:
Array.prototype.forEach.call(
document.querySelectorAll("#root, #child2"),
function(element) {
element.addEventListener(
"my-custom-event",
function(e) {
console.log("Element " + this.id + " got " + e.type + " on " + e.target.id);
},
false
);
}
);
// Fire a custom bubbling event at child2
var e = new CustomEvent("my-custom-event", {
bubbles: true
});
document.getElementById("child2").dispatchEvent(e);
<div id="root">
<div id="parent">
<div id="child1">child1</div>
<div id="child2">child2</div>
</div>
</div>
关于javascript - 实际反向冒泡到 DOM 中的叶子节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37521406/
Infix[]仅适用于第一级: Infix[(c a^b)^d] (* -> (a^b c) ~Power~ d *) 由于我想(不要问为什么)将完整表达式切换为中缀表示法,因此我尝试了以下操作: S
我正在寻找遍历特定元素的叶子的最有效方法。例如: One Two Paragraph Text
我想评估 bool 表达式,例如 a=b & s、>=、{ eval() {} // bool operator()(const var& v) const {
我正在尝试将物联网边缘设备设置为边缘网关。我们不希望我们的叶子/传感器/下游设备直接连接到互联网/云,因此我希望物联网边缘网关(顾名思义)能够桥接下游设备和云/物联网之间的连接中心。但是,我意识到任何
我是一名优秀的程序员,十分优秀!