2

好的,我有一个像这样走树的小功能:

function walkTree(node, func, args) {
    func(node, args);
    node = node.firstChild;
    while (node) {
        walkTree(node, func, args);
        node = node.nextSibling;
    }
}

另一个函数只会拾取文本节点,如下所示:

function selectTextNodes(node, nodes) {
    if (node instanceof Text) {
        nodes.push(node);
    }
}

最后,同时使用:

texts = [];
walkTree(body, selectTextNodes, texts);

但是,它根本没有填满列表!

如果我要修改测试以使用Node.nodeType它会起作用:

function selectTextNodes(node, nodes) {
    if (node.nodeType == Node.TEXT_NODE) {
        nodes.push(node);
    }
}

另一方面,在控制台中它可以双向工作:

t = window.document.createTextNode("test");
r = (t.nodeType == Node.TEXT_NODE) && (t instanceof Text);

也就是说,r 为真。

请注意,所有函数都嵌套在另一个接收body变量的函数中。就我而言,这是contentDocument.body一个iframe. 没有应用 x 域限制。

知道发生了什么吗?

4

2 回答 2

8

不同的窗口有不同Text的界面。因此,如果您的 iframe 文档中有一个 DOM 节点,那么它不是. instanceof window.Text,而是instanceof iframe.contentWindow.Text. Afaik,Text接口作为 Javascript 对象的可用性也是非标准的。

这就是为什么你应该检查nodeType元素的原因。但请注意(旧版?)IE 不支持TEXT_NODE常量 on Node,因此您需要与 比较3或将该值作为 polyfill 分配给Node.TEXT_NODE.

于 2012-12-15T19:20:02.180 回答
1

主要文件

<body>
  <iframe name="ifr" id="ifr" src='test1.html'></iframe>
  <button onclick="clkfn()">test</button>

  <script>

    function wrapper(body, iframeWindow) {
      function walkTree(node, func, args) {
        func(node, args);
        node = node.firstChild;
        while (node) {
            walkTree(node, func, args);
            node = node.nextSibling;
        }
      }

      function selectTextNodes(node, nodes) {
          if (node instanceof iframeWindow.Text) {
              nodes.push(node);
          }
      }    

      texts = [];
      walkTree(body, selectTextNodes, texts);

      for (var i = 0; i < texts.length; i++) {    
        console.log("text #" + i + texts[i].nodeValue);
      }
    }

    function clkfn() {
      var ifr = frames["ifr"];
      wrapper(ifr.document.body, ifr);
    }

  </script>


</body>

iFrame

<!doctype html>
<html>
    <head>
    </head>
    <body>
      how are you?
      I am fine. Thank you!
    </body>
</html>

安慰

当您单击按钮时,控制台会打印:

   text #0  
        how are you?  
        I am fine. Thank you!

只有对代码所做的更改才会传递给 iframe 主体和窗口。然后从 iFrame 窗口引用 Text 对象。

于 2012-12-15T18:25:44.583 回答