我知道MutationObservers回调可能会在DOM更改后的某个时刻被调用。但问题是:这些回调的时间是什么时候?
这些回调是:
- 在DOM变异发生后立即被调用,
- 在操纵DOM的函数完成后立即被调用,
- 在调用栈为空时立即被调用,
- 在DOM变异发生后立即进入队列,
- 在操作DOM的函数完成后立即进入队列,或者
- 在其他时间被调用?
例如,如果执行以下代码(其中此处定义了setZeroTimeout):
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");
在"message event"之前或之后打印"MutationObserver",这是固定的顺序吗?还是由浏览器实现来决定?
在Chromium 26中,我发现"MutationObserver"在"message event"之前被打印出来了,尽管DOM修改是在消息发布之后的。也许这表明MutationObserver回调没有使用事件队列。
我尝试搜索HTML规范、DOM规范或浏览器实现文档,但没有找到与此行为相关的任何内容。
请问有关MutationObservers回调时间的说明或文档吗?
MutationObserver
不使用事件队列。 - apsillerspostMessage
事件的行为可能与其他事件不同,但我对此并不完全确定。 - apsillers