Firefox: события мутации DOM для отключенных узлов?
У меня есть несколько вопросов (меня интересуют ответы, связанные с Firefox, но ответы в контексте другого браузера тоже могут быть приемлемыми).
События мутации DOM запускаются для узлов, отключенных от основного документа, то есть отключенных? Согласно информации, представленной в одной из ошибок Mozilla, ответ кажется да. Может кто-нибудь привести примеры?
Какой самый быстрый способ определить, отключен узел или нет? Наивный подход - это пройтись (используя node.parentNode) до тех пор, пока мы не достигнем нуля или документа. Что-нибудь быстрее?
Поддерживает ли Firefox функцию "волшебного фрейма" Webkit? Если нет, что произойдет, если этот код запускается в Firefox?
Относительно #3, возможно ли для iframe продолжить загрузку, когда он отключен от документа? Т.е. он был подключен к основному документу, загрузка началась, затем был перемещен в другой документ (с использованием acceptNode()), но никогда не добавлялся к родительскому узлу в новом документе. Будет ли iframe продолжать загрузку?
Заранее спасибо, Сунил
1 ответ
DOMNodeRemoved
событие вызывается, когда узел (элемент, текстовый узел, комментарий,..) удаляется из документа / элемента, с которым связано событие.document.addEventListener('DOMNodeRemoved', function(event) { console.log('Removed node: ' + event.target.nodeName); });
Сравнительный анализ двух возможностей:
Простой цикл:
function isDisconnected(node) { var rootElement = document.documentElement; while (node) { if (node === rootElement) return false; node = node.parentNode; } return true; }
document.contains( node )
:function isDisconnected(node) { return !document.contains(node); }
Результат: http://jsperf.com/dom-contains-vs-parentnodedocument.contains()
метод значительно (в 47 раз) быстрее, чем метод цикла (независимо от того, отсоединены ли узлы или нет,document.contains
метод всегда превосходит цикл).- Функция Magic iframe не работает в Firefox, как было протестировано с использованием этой скрипки: http://jsfiddle.net/GRFsd/
Для тех, кто не знает об этой функции: в Chrome iframe можноперемещать из одного документа в другой, не выгружая фрейм. Это называется волшебной функцией iframe.
Предоставленный jsfiddle перемещает фрейм, чей src
атрибут установлен в "data:text/html,<script>alert(/Test/);<\/script>"
, Когда этот URL загружен, появляется предупреждение. Отображение двух предупреждений означает, что функция Magic iframe не поддерживается. Отображение одного предупреждения означает, что функция поддерживается. Отображение нулевых предупреждений означает, что ваш JavaScript отключен или ваш браузер не поддерживает URI данных.