为什么getElementsByTagName返回undefined?

Mas*_*ler 4 html javascript 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");
}
Run Code Online (Sandbox Code Playgroud)

并且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
Run Code Online (Sandbox Code Playgroud)

标记是(或应该)无关紧要.它是一个有效的,格式良好的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>
Run Code Online (Sandbox Code Playgroud)

Esa*_*ija 8

编辑:

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


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

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

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

delete window.alert;
window.alert(buttons);
Run Code Online (Sandbox Code Playgroud)

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

如果它发出警报 undefined,你应该可以做到

delete document.getElementsByTagName
Run Code Online (Sandbox Code Playgroud)

恢复主机对象引用.

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

  • @amnotiam同意,很好的例子就是Chrome控制台中的问题,你可以直接记录对象引用,直到在控制台中手动扩展状态快照才会实际获取状态快照. (2认同)