Firefox:断开连接节点的DOM Mutation事件?

时间:2012-04-14 16:18:19

标签: firefox mutation-events

我有几个问题(我对与Firefox有关的答案感兴趣,但其他浏览器的上下文答案也可以接受)。

  1. 对于与主文档断开连接的节点,是否会断开DOM Mutation事件?根据其中一个Mozilla错误中的信息,答案似乎是肯定的。有人可以给我一些例子吗?

  2. 查找节点是否断开连接的最快方法是什么?天真的方法是walk(使用node.parentNode)一直到我们达到null或文档。什么更快?

  3. Firefox是否支持Webkit的“神奇iframe”功能?如果没有,如果该代码在Firefox中运行会发生什么?

  4. 与#3相关,iframe是否可以在与文档断开连接时继续加载?即它连接到主文档,加载已启动,然后移动到另一个文档(使用adoptNode()),但从未添加到新文档中的父节点。 iframe会继续加载吗?

  5. 提前致谢, 苏尼

1 个答案:

答案 0 :(得分: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()方法比循环方法快得多(47倍)(节点是否断开连接,document.contains方法总是优于循环)。

  3. Magic iframe功能在Firefox中运行,正如使用此小提琴测试的那样:http://jsfiddle.net/GRFsd/
    对于那些不了解此功能的人:在Chrome中,iframe可以移动从一个文档移动到另一个文档,而无需卸载框架。这称为magic iframe功能。
  4. 提供的jsfiddle会移动其src属性设置为"data:text/html,<script>alert(/Test/);<\/script>"的iframe。加载此URL后,将显示警报。 显示两个警报表示不支持Magic iframe功能 显示一个警告表示支持功能。显示零警报意味着您的JavaScript被禁用,或者您的浏览器不支持数据URI。