我的代码简化版本:
<div id="d">text<br><hr>text</div>
<script>
// Called when DOM changes.
function mutationCallback(mutations) {
// assert(mutations.length === 3);
var insertImg = mutations[0];
console.log(insertImg.previousSibling.parentNode); // Null!
console.log(insertImg.nextSibling.parentNode); // Null!
// Can't determine where img was inserted!
}
// Setup
var div = document.getElementById('d');
var br = div.childNodes[1];
var hr = div.childNodes[2];
var observer = new MutationObserver(mutationCallback);
observer.observe(div, {childList: true, subtree: true});
// Trigger DOM Changes.
var img = document.createElement('img');
div.insertBefore(img, hr);
div.removeChild(hr);
div.removeChild(br); // mutationCallback() is first called after this line.
</script>
另一种方法是遍历整个文档以查找更改,但这将抵消使用Mutation Observers的性能优势。
.parentNode
?mutations[0].target
给出了p
,而mutations[0].removedNodes[0]
给出了x
。然后,由于这是一个单独的变化,mutations[1].target
给出了div
,而mutations[1].removedNodes[0]
给出了p
。这些信息足以重构发生的情况。 - loganfsmyth