【发布时间】:2013-01-11 22:39:15
【问题描述】:
我知道 MutationObservers 回调可能会在 DOM 更改后的某个时间被调用。但问题是:这些回调的时机是什么? 回调是否进入浏览器的事件队列?如果是,他们什么时候进入队列?
是回调:
- 在 DOM 突变发生后立即调用,
- 在操作 DOM 的函数完成后立即调用,
- 调用堆栈为空时立即调用,
- 在 DOM 突变发生后立即排队,
- 在操作 DOM 的函数完成后立即入队,或者
- 在其他时间?
例如,如果执行以下代码(使用setZeroTimeout defined here):
var target = document.body;
new MutationObserver(function(mutations) {
console.log('MutationObserver');
}).observe(target, {
attributes: true,
childList: true,
characterData: true
});
// Post message
setZeroTimeout(function () { console.log('message event'); });
// DOM mutation
target.setAttribute("data-test", "value");
“MutationObserver”应该打印在“消息事件”之前还是之后? 还是实现定义的?
我在 Chromium 26 上的“消息事件”之前获得了“MutationObserver”,尽管 DOM 突变是在消息发布之后。也许这表明 MutationObserver 回调不使用事件队列。
我搜索了 HTML 规范、DOM 规范或浏览器实现文档,但没有找到与此行为相关的任何内容。
请提供关于 MutationObservers 回调时间的任何解释或文档?
【问题讨论】:
-
我的猜测是,如果突变观察者使用事件队列,
message event出现在MutationObserver之前就不足为奇了。setZeroTimeout中的postMessage处理程序触发并触发一个事件(添加到事件队列中),然后setAttribute调用触发观察者(这可能还会在消息事件后面添加一个事件到队列中)。 -
@apsillers 我在“消息事件”之前得到“MutationObserver”,而不是相反。
-
啊,我的错。那么,是的,这似乎表明
MutationObservers 不使用事件队列。 -
这可能会因为
postMessage事件的行为可能与其他事件不同这一事实而变得更加复杂,但我不能 100% 确定这一点。 -
@joseeight 但是本文档没有定义它们何时被“调用”。相反,它说“HTML 标准定义了这个概念如何与平台的其余部分集成以及何时调用调用。”
标签: javascript dom browser dom4