17

我编写了以下 JS 并在 IE 10 中运行:

function test() {
    var nodes = document.getElementsByTagName("h1");
    document.writeln(nodes.length);
    for (var j = 0; j < nodes.length; j++) {   <=== THIS LINE!
        document.writeln(j.toString());
        }
    document.writeln("abc");
}

但是我一直收到标记行的“无效调用对象”错误。

为什么?

这是我的页面来源:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
    <head>
        <title>This is JS fun!</title>
        <script type="text/javascript" language="javascript" src="test.js">
        </script>
    </head>
    <body>
        <h1>1111</h1>   
        <h1>2222</h1>   
        <h1>3333</h1>   
        <h1>4444</h1>   
            <input type="button" onclick="test()" value="click me!" />
    </body>
</html>

下面是我的截图:

在此处输入图像描述

4

3 回答 3

12

出现错误是因为您在页面完成后运行代码。

第一次document.writeln调用创建一个新文档,其中仅包含字符串。这意味着集合nodes不再有效。它是文档中不再存在的元素的集合,因此您不能再使用length该集合的任何属性(如 )。

如果您在创建页面时运行代码,它可以正常工作:http: //jsfiddle.net/Guffa/4w949/

于 2012-10-20T16:13:38.190 回答
3

好吧,我可能已经想通了。

我试过这个:

function test() {
    var nodes = document.getElementsByTagName("h1");
    document.writeln(nodes.length); // 1st writeln
    nodes2 = document.getElementsByTagName("h1");
    alert(nodes2.length);  //  <========= MARK1
    for (var j = 0; j < nodes2.length; j++) {
        alert(j);
            }
    document.writeln("abc");
}

以上代码没有错误。但是MARK1行给出了 0。因为在第一次 writeln之后,重新构建了完整的页面内容,所以新构建的页面中不再有 <h1> 标记

然后我把上面的代码改成这样:

 function test() {
    var nodes = document.getElementsByTagName("h1");
    document.writeln(nodes.length + "<h1>new h1</h1>");   // ADD a new < h1 > tag
    nodes2 = document.getElementsByTagName("h1");
    alert("node2 length = " + nodes2.length);   //MARKED
    for (var j = 0; j < nodes2.length; j++) {
        alert(j);
            }
    document.writeln("abc");
}

现在MARKED行给了我预期的长度,1。因为我在新构建的文档中添加了一个新的 < h1 > 标签。

至于Invalid Calling Object错误。我认为因为文档是用 writeln 重新构造的,所以之前用旧的无效文档对象获得的所有 DOM 对象也将无效。

关键是通过 document.writeln 方法隐式创建一个新文档。

如果我错了,请纠正我。

感谢古法的洞察力。

于 2012-10-21T03:52:48.540 回答
-7

j是一个变量计数器,而不是对象。

你需要nodes.item(j).toString();

于 2012-10-20T16:02:22.110 回答