7

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

之前,我知道可以通过类名获取元素

document.body.getElementsByClassName("foo");

而且我太懒了,所以我只是将代码复制并粘贴到另一部分来执行此操作

document.body.getElementById("bar");

不小心发现不行 我测试了它说

类型错误:对象 #<HTMLBodyElement> 没有方法“getElementById”

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

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

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

4

4 回答 4

5

您可以拥有多个具有相同类名的元素,因此缩小搜索范围以从特定节点开始是有意义的。

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

你可以只有一个id中的document,这为什么getElementById是一种方法document

例子:

<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只检查类型,而不是值,document并且document.body都是对象,但不同的对象。

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

如您所见,null并且document共享相同的类型,但是它们是否具有相同的方法...?

于 2012-06-27T22:03:59.697 回答
4

Id 对于整个文档是唯一的,因此将它们限定在文档的子节点是没有意义的。

类名不是唯一的,有些用例可以找到类名低于另一个元素的元素。

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

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

于 2012-06-27T22:04:10.740 回答
1

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

(“医生,医生,当我将手臂举过头顶并以 8 字形快速旋转时很痛!”“是吗?所以把它打掉。”)

于 2012-06-27T22:05:10.320 回答
0

您的typeof示例不是比较它们是相同的东西,而是它们是相同的“类型”,两者都返回object

Firebug 控制台的输出:

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

有关更多详细信息,请typeof访问:

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

于 2012-06-27T22:05:47.127 回答