2014-01-29 3 views
0

Интересно, какой самый чистый способ найти окружающие Element s для данного MutationRecord?Каков самый чистый способ получить nextElementSibling (previousElementSibling) из MutationRecord?

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 приходилось обращаться.

Смежные вопросы