遇到DOM节点和instanceof问题

Alb*_*ore 2 javascript dom

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

function walkTree(node, func, args) {
    func(node, args);
    node = node.firstChild;
    while (node) {
        walkTree(node, func, args);
        node = node.nextSibling;
    }
}
Run Code Online (Sandbox Code Playgroud)

而另一个只拾取文本节点的函数如下:

function selectTextNodes(node, nodes) {
    if (node instanceof Text) {
        nodes.push(node);
    }
}
Run Code Online (Sandbox Code Playgroud)

最后,使用两者:

texts = [];
walkTree(body, selectTextNodes, texts);
Run Code Online (Sandbox Code Playgroud)

但是,它根本没有填写清单!

如果我要修改测试使用Node.nodeType它将工作:

function selectTextNodes(node, nodes) {
    if (node.nodeType == Node.TEXT_NODE) {
        nodes.push(node);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

t = window.document.createTextNode("test");
r = (t.nodeType == Node.TEXT_NODE) && (t instanceof Text);
Run Code Online (Sandbox Code Playgroud)

也就是说,r是真的.

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

知道发生了什么事吗?

Ber*_*rgi 6

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

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