【发布时间】:2015-06-17 11:46:54
【问题描述】:
我有一个父母 <div> 和一个孩子 <div> 在内存中 - 未附加到当前文档。我想在孩子身上触发CustomEvent,但要听来自父母的那个事件。这是我的代码:
var parent = document.createElement('div');
var child = document.createElement('div');
parent.appendChild(child);
parent.addEventListener('boom', function(event) {
console.log('parent listener', event); // <~ This never runs!
});
var event = new CustomEvent('boom', { bubbles: true });
child.dispatchEvent(event);
此代码未按预期工作。父级上的事件侦听器永远不会触发。这似乎与 JavaScript 事件系统的矛盾,即事件从目标冒泡。但是,如果我将此 sn-p 的最后两行修改为以下内容,回调将按我的预期触发:
document.body.appendChild(parent);
child.dispatchEvent(event);
换句话说,如果我在分派事件之前将我的片段附加为文档的子树,那么父事件侦听器将完全按预期触发。为什么?有没有办法在使用分离的 DOM 元素时允许冒泡?
【问题讨论】:
-
我在这里看不到任何虚拟 DOM,虚拟 DOM 通常意味着不是真正的 DOM 的 DOM - 你的 DOM 是非常真实的,只是分离的。
-
另外,这里有一个解决方案medium.com/@webprolific/…,如果这解决了您的问题,请为未来的访问者写一个答案:)
-
@RobG 是文档对象模型,它代表了你如何通过一个对象API与文档交互,一个有子元素的元素肯定是一个指定与文档交互的对象,而文档更多不仅仅是dom树。 AJAX 等也是 DOM API 的一部分,webworkers 也是如此。
-
好的,修改了标题。虽然……在实践中,“虚拟 DOM”不是经常简单地通俗地用来表示分离的 DOM 元素吗?
-
@BenjaminGruenbaum——应该在某处放一个幽默的表情……
标签: javascript google-chrome dom javascript-events