好的,我有一个小功能像这样走在树上:
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域限制。
知道发生了什么事吗?
答案 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>
<!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对象。