【发布时间】:2016-02-25 23:28:53
【问题描述】:
我有一个简单的MutationObserver 设置作为测试。 HTML 有一个 span,其文本内容每秒更新一次(div 用于消息):
<span class="tester"></span>
<div id="msg"></div>
MutationObserver 设置为监视.tester,并在观察到更改时将文本写入#msg div。同时,setInterval() 每秒运行一次以更改 .tester 中的文本:
var target = document.querySelector('.tester');
var observer = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
console.log(mutation.type);
$('#msg').append(mutation.type+"<br/>")
setTimeout(function() { $('#msg').text(''); }, 500);
});
});
var config = { attributes: true, childList: true, characterData: true };
observer.observe(target, config);
setInterval(function() {
$('#msg').text('');
$('.tester').text("update: "+Math.random())
}, 1000);
我希望此代码每秒打印一次 characterData 已更改。根据Mozilla's docs for MutationObserver,它说关于characterData:“如果要观察到目标数据的突变,则设置为true。”相反,我没有看到 characterData 突变,但 确实 每秒看到两个 childList 突变。
为什么我没有看到任何 characterData 突变,为什么我看到 两个 childList 突变?
这是CodePen 的工作示例。
【问题讨论】:
-
我还没有验证这一点,但我认为
jQuery().text()/.innerText隐式删除现有文本节点并在其位置添加一个新节点,而不是更新现有文本节点。尝试手动更改target.firstChild.nodeValue,看看是否有不同的结果。 -
@JeremyBanks:就是这样,您应该发布一个答案来证明它(与修改现有文本节点的
nodeValue形成对比)。 -
@T.J.Crowder 我尝试更改代码:我确实停止获取 childList 事件,但没有开始获取 characterData 事件。 :/我现在没有时间弄清楚为什么不。如果有其他人可以发布答案。
-
@JeremyBanks:完成。 (你必须观察
subtree。)
标签: javascript dom mutation-observers