我正在构建一个 undomanager,类似于 W3C undomanager,它还没有在各种浏览器中准备好。我实现了一个简单的事务调用,它在监视 DOM 更改的同时调用回调,然后将必要的结构添加到稍后可用于撤消(或重做)更改的数组中。
一个简单的例子:
function transact(callback){
/* Watch content area for mutations */
observer = new MutationObserver(function(){
/* TODO: collect mutations in here */
alert('Mutations observed');
});
observer.observe(document.getElementById('content'), {
attributes: false,
childList: true,
characterData: false,
subtree: false
});
/* Perform the callback */
callback();
/* Stop observing */
//observer.disconnect();
setTimeout(function(){ observer.disconnect();}, 1);
}
要使用这个:
transact(function(){
var p = document.createElement('p');
p.innerHTML = 'Hello';
document.getElementById('content').appendChild(p);
});
如果我observer.disconnect()
立即调用,突变观察者永远不会到达alert
调用,但如果我使用 setTimeout,它工作正常。
我很乐意接受 setTimeout 调用,唯一的问题似乎是对于较大的更改,您必须将断开连接延迟多达 800 毫秒。
几乎就好像断开连接发生在 DOM 更改实际完成之前,因此没有检测到任何内容。
这发生在 Firefox 25 和 Chrome 32 中。
我想了一秒钟,因为observer
它是一个局部变量,也许它很快就超出了范围,但是将其更改为全局变量并没有帮助。我不得不推迟调用以disconnect()
让 DOM 有机会赶上它。
这是浏览器错误吗?disconnect()
一旦 DOM 再次准备好,有没有更好的方法来调用?