2014-01-29 63 views
0

我想知道什么是最简洁的方式来找到周围Element s给定MutationRecord从MutationRecord获取nextElementSibling(previousElementSibling)的最简洁方法是什么?

MutationRecord具有.nextSibling,.previousSibling属性,但可能包含文本节点,我需要获得常规元素节点。

工作例子是在这里:http://jsfiddle.net/tomalec/ceku2/

我尝试使用

mutation.addedNodes[0].previousElementSibling; 
mutation.addedNodes[mutation.addedNodes.length - 1].nextElementSibling); 

http://jsfiddle.net/tomalec/Q2HFY/2/

但是它看起来有点冒险,它不适合去除那些在所有的工作。

mutation.removedNodes[0].previousElementSibling; //null 
mutation.removedNodes[mutation.removedNodes.length - 1].nextElementSibling); //null 

http://jsfiddle.net/tomalec/Q2HFY/3/

回答

1

这肯定是有风险的。由于MutationRecords被批量化,DOM的当前状态可能难以确定突变的周围节点。例如,如果您将两个MutationRecords发送到MutationObserver,则第二个MutationRecord可能会删除第一个节点的周围节点,这意味着您无法通过简单的 DOM检查来完成此操作。

为了使问题具体,借此HTML:

<ul><li>One</li><li>Two</li><li>Three</li></ul> 

而且此javascript:

var ul = document.querySelector('ul'); 
while (ul.lastChild) ul.removeChild(ul.lastChild); 

突变观察员将获得两个突变的记录,你必须做一些花哨搞清楚他们是否连接在一起。我不确定那个算法是什么样子的,或者它在任何情况下都是可能的。

不管怎么说,这是我的例子的jsfiddle:

http://jsfiddle.net/theazureshadow/88egh/

也许你可以做一些更容易或更聪明,如果你可以限制你的MutationObserver必须处理的案件。

相关问题