身体没有getElementById?

时间:2012-06-27 22:01:17

标签: javascript dom

这个问题困扰了我很长一段时间。对不起,如果这是一个愚蠢的问题。

之前,我知道你可以获得带有类名的元素

document.body.getElementsByClassName("foo");

我太懒了,所以我只是复制并粘贴代码到另一部分来做这个

document.body.getElementById("bar");

我意外地发现它不起作用。我测试了,它说

  

TypeError:Object#< HTMLBodyElement>没有方法'getElementById'

那为什么它有getElementsByClassNamegetElementsByTagName以及所有类似的方法,但只有getElementById

typeof document === typeof document.body   //true

他们的类型是相同的,所以他们应该有相同的东西。但这似乎并非如此。

4 个答案:

答案 0 :(得分:5)

您可以拥有多个具有相同类名的元素,从而缩小搜索范围,使其从特定节点开始。

它对id没有意义,因为它应该是唯一的。

id中只能有一个document,这就是为什么getElementByIddocument的方法。

示例:

<body>
    <div id="start">
        <span class="a">
    </div>
    <div class="a">
    </div>
</body>

从节点a开始搜索课程<div id="start">将为您提供一个元素,
如果您从顶级节点文档开始,它将以两个元素结束。

关于typeof比较:

typeof 1 == typeof 2 == "Number" // true
1 !== 2 // true.

typeof仅检查类型,而不是值,documentdocument.body都是对象,但不同的对象。

typeof document === typeof document.body === typeof null === "object" // true
document === document.body // false!!!

正如您所看到的,nulldocument共享相同类型,但它们是否具有相同的方法......?

答案 1 :(得分:4)

Ids对于整个文档是唯一的,因此将它们范围扩展到文档的子节点是没有意义的。

类名不是唯一的,并且有一些用例可以找到在另一个元素下面有类名的元素。

body.getElementsByClassName('foo')将获得具有类名'foo'但包含在正文中的元素。

document.getElementsByClassName('foo')将在整个文档中获取包含类名“foo”的所有元素,包括<head>

答案 2 :(得分:1)

typeof documenttypeof document.body是相同的,因为它们都是object。类型不像你认为他们在对象方面那样工作。所以不,它们不一样,并且没有特别的理由它们必须支持相同的功能集。 (即使具有相同原型的对象也不必支持相同的功能集,但这是另一回事。)只需在getElementById上调用document即可。

(“医生,医生,当我把手臂抱在头上并快速旋转通过8字形图案时会疼!”“是吗?所以把它关掉。”)

答案 3 :(得分:0)

您的typeof示例并未比较它们是相同的,但它们是相同的'类型',两者都返回object

Firebug控制台的输出:

>>> typeof document
"object"
>>> typeof document.body
"object"

有关typeof的更多详情,请访问:

https://developer.mozilla.org/en/JavaScript/Reference/Operators/typeof