为什么getElementsByTagName返回undefined?

时间:2012-05-27 16:25:10

标签: javascript html firefox dom

我正在尝试拨打document.getElementsByTagName,无论我通过什么参数,我都会返回undefined。 (即使我通过“*”。)

我尝试使用谷歌搜索,但所有搜索结果都是关于未定义的getElementsByTagName结果数组的元素。我得到的是undefined作为结果本身,它正在推动我上升。

有谁知道是什么原因引起的? (使用Firefox 12.0。在Chrome中我得到了预期的结果。)

编辑:好的,这是示例代码:

function buttonClick(){
   var xhr = new XMLHttpRequest();
   var msg = document.getElementById('message');
   var buttons = document.getElementsByTagName("button");
   var button, i;
   for (i = 0; i < buttons.length; ++i){
      button = buttons[i];
      msg.removeChild(button);
   }

   xhr.onreadystatechange = function() {
        if(xhr.readyState == 4){
            handleResult(xhr.responseText, msg);
        }
   };
   xhr.open("POST", location.href, true);
   xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
   xhr.send("cmd=MyCommand");
}

getElementsByTagName始终返回undefined,无论是在Firebug的“脚本”选项卡中跟踪它还是从“控制台”选项卡中调用它。 (同样在Firebug,因为这似乎让人感到困惑。显然有太多的控制台漂浮在周围。)。

作为证据,这是我尝试使用Firebug控制台时所得到的:

>>> document.getElementsByTagName("button");
undefined
>>> msg.getElementsByTagName("button");
undefined
>>> msg.getElementsByTagName
getElementsByTagName()
>>> msg.getElementsByTagName("BUTTON");
undefined
>>> msg.getElementsByTagName("*");
undefined
>>> document.getElementsByTagName("*");
undefined
>>> document.getElementsByTagName("body");
undefined

标记是(或应该)无关紧要。它是一个有效的,格式良好的HTML页面,上面有一些按钮和其他元素。此JS函数附加到其中一个按钮的onclick。但它看起来像这样:

<html xmlns="http://www.w3.org/1999/xhtml"><head>
blah
</head>
<body>
<script type="text/javascript" src="/myJS.js"></script>
<div id="page-container">
   <div id="message"><button onclick="buttonClick();">Button 1</button><button onclick="ButtonClick2()">Button 2</button></div>

</div>

</body></html>

4 个答案:

答案 0 :(得分:8)

修改

这是firebug中的一个错误,可以通过升级到1.10.0a7

来修复

因为此方法无法返回undefined,所以有两种可能性:

  • 您的调试工具对您说谎
  • document.getElementsByTagName未引用原始主机对象。它应该打印 在控制台中引用时function getElementsByTagName() {[native code]}

你应该能够可靠地查看它是否实际上是undefined(在firefox中):

delete window.alert;
window.alert(buttons);

如果delete已经引用原始主机对象,则window.alert是NOOP,否则 它会恢复它。

如果提醒 undefined,您应该可以

delete document.getElementsByTagName

恢复主机对象引用。

此处的所有控制台引用都是指默认情况下随Firefox附带的内置Web控制台。

答案 1 :(得分:0)

REPL不是一个独立的,独立于浏览器的JavaScript环境吗?虽然,在你的情况下,恰好在你的浏览器中作为一个插件运行,它应该模仿一个“干净的房间”每个说...

总结这个家伙的答案:document.getElementById() returns null when using mozrepl (but not in firebug)

默认情况下,您在浏览器的上下文中,而不是文档的。

请尝试将其切换为文档:

repl.enter(content)

答案 2 :(得分:0)

当我难以看到语法错误时,我遇到了问题。当我应该使用方形括号

时,我使用了括号

错:

selectedItem._element.childNodes(0).getElementsByTagName('input').item();

右:

selectedItem._element.childNodes[0].getElementsByTagName('input').item();

看到区别?注意,顶级语法的工作原理是IE的旧版本,比如IE8,但它在ie10,ie11,Edge等中不起作用

答案 3 :(得分:0)

您无法提醒Array,应执行for循环来提醒它。示例:

var x = document.getElementsByTagName('a');
for (var i = 0, c = x.length ; i < c ; i++) {
    alert('Element n° ' + (i + 1) + ' : ' + x[i]);
}