遇到DOM节点和instanceof问题

时间:2012-12-15 17:49:04

标签: javascript dom

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

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的{​​{1}}。没有应用x域限制。

知道发生了什么事吗?

2 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分: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对象。