I know that MutationObservers callbacks may get called sometime after the DOM change. But the question is: What is the timing of these callbacks? Do the callbacks enter the event queue of the browsers? If so, when do they enter the queue?
Are the callbacks:
- called immediately after the DOM mutation take place,
- called as soon as the function that manipulate DOM finishes,
- called as soon as the call stack is empty,
- enqueued immediately after the DOM mutation take place,
- enqueued as soon as the function that manipulate DOM finishes, or
- at some other time?
For example, if the following piece of code is executed (with 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");
Should "MutationObserver" be printed before "message event" or after it? Or is it implementation-defined?
I'm getting "MutationObserver" before "message event" on Chromium 26, though the DOM mutation is after message posting. Maybe this is indicating that MutationObserver callbacks are not using the event queue.
I have googled for HTML specification, DOM specification or browser implementation documents, but I didn't found anything related to this behavior.
Any explanation or documentation on the timing of MutationObservers callbacks please?
message event
comes beforeMutationObserver
. ThepostMessage
handler insetZeroTimeout
fires and triggers an event (which is added to the event queue), and then thesetAttribute
call trips the observer (and that probably also adds an event to the queue, behind the message event). – BoeotianMutationObserver
s don't use the event queue. – BoeotianpostMessage
events might not behave the same as other events, but I'm not 100% sure on that. – Boeotian