好的,我有一个小功能像这样走在树上:
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域限制.
知道发生了什么事吗?
Text不同的窗口中有不同的接口.因此,如果您的iframe文档中有一个DOM节点,那么它不是一个instanceof window.Text,而是一个instanceof iframe.contentWindow.Text.Afaik,Text作为Javascript对象的接口的可用性也是非标准的.
这就是你应该检查nodeType元素的原因.但请注意(较旧的?)IE不支持TEXT_NODE常量Node,因此您需要与之比较3或将该值指定为polyfill Node.TEXT_NODE.