2012-04-14 3 views
1

У меня есть несколько вопросов (меня интересуют ответы, связанные с Firefox, но ответы в контексте другого браузера также могут быть приемлемыми).Firefox: DOM Mutation Events для отключенных узлов?

  1. Выполняется ли событие DOM Mutation для узлов, отсоединенных от основного документа, то есть отключенных? Согласно информации, присутствующей в одной из ошибок Mozilla, ответ кажется да. Может ли кто-нибудь дать мне несколько примеров?

  2. Каков самый быстрый способ найти, отключен ли узел или нет? Наивный подход - это прогулка (с использованием node.parentNode) вплоть до достижения нулевого или документа. Что-нибудь быстрее?

  3. Поддерживает ли Firefox функцию «magic iframe» Webkit? Если нет, что произойдет, если этот код будет работать в Firefox?

  4. Связано с №3, возможно ли, чтобы iframe продолжал загружать, будучи отсоединенным от документа? То есть он был подключен к основному документу, загрузился, а затем переместился в другой документ (с использованием acceptNode()), но никогда не добавлялся к родительскому узлу в новом документе. Будет ли iframe продолжать загрузку?

Заранее спасибо, SUNIL

ответ

1
  1. DOMNodeRemoved событие вызывается, когда узел (элемент, текстовый узел, комментарий, ..) удаляется из документа/элемента, к которому событие связано.

    document.addEventListener('DOMNodeRemoved', function(event) { 
        console.log('Removed node: ' + event.target.nodeName); 
    }); 
    
  2. Бенчмаркинг две возможности:

    • Простой цикл:

      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-parentnode
    Метод document.contains() значительно (47x) быстрее, чем метод петли (будь то узлы отсоединенным или нет, метод document.contains всегда превосходит петлю).

  3. Волшебная функция IFrame делает не работать в Firefox, как проверено с помощью этой скрипки: http://jsfiddle.net/GRFsd/
    Для тех, кто не знает об этой функции: В Chrome IFrame может быть переехал из одного документа в другой, без разгрузки кадра. Это называется функцией magic iframe.

Предусмотренные jsfiddle перемещает Iframe которого src атрибут установлен в "data:text/html,<script>alert(/Test/);<\/script>". Когда этот URL-адрес загружен, появляется предупреждение. Два предупреждения показывают, что функция Magic iframe не поддерживается.Один оповещение о срабатывании означает, что функция поддерживается. Отображение нулевых предупреждений означает, что ваш JavaScript отключен или ваш браузер не поддерживает URI-данные.

+1

Обратите внимание, что WebKit удалил функцию «magic iframe» несколько дней назад; они столкнулись с множеством проблем с безопасностью. –

+0

Спасибо Робу за ответ. Что касается № 1, я не могу получить событие DOMNodeRemoved, запущенное, когда parentNode не подключен к DOM. Он срабатывает, если parentNode подключен. Не могли бы вы привести несколько примеров? –

+0

(Пожалуйста, проигнорируйте предыдущий комментарий, я получил ответ). Спасибо Робу и Борису за ответы. Борис предоставил дополнительную информацию по №1 выше в другом потоке: «Любая мутация для отключенных узлов будет запускать события мутации. Вам просто нужно, чтобы слушатели находились где-то в родительской цепочке узлов. Я тестировал и работает, как описано Борисом. –

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

  • Нет связанных вопросов^_^