这个问题困扰了我很长一段时间。对不起,如果这是一个愚蠢的问题。
之前,我知道你可以获得带有类名的元素
document.body.getElementsByClassName("foo");
我太懒了,所以我只是复制并粘贴代码到另一部分来做这个
document.body.getElementById("bar");
我意外地发现它不起作用。我测试了,它说
TypeError:Object#< HTMLBodyElement>没有方法'getElementById'
那为什么它有getElementsByClassName
和getElementsByTagName
以及所有类似的方法,但只有getElementById
?
typeof document === typeof document.body //true
他们的类型是相同的,所以他们应该有相同的东西。但这似乎并非如此。
答案 0 :(得分: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
共享相同类型,但它们是否具有相同的方法......? 否强>
答案 1 :(得分:4)
Ids对于整个文档是唯一的,因此将它们范围扩展到文档的子节点是没有意义的。
类名不是唯一的,并且有一些用例可以找到在另一个元素下面有类名的元素。
body.getElementsByClassName('foo')
将获得具有类名'foo'但包含在正文中的元素。
document.getElementsByClassName('foo')
将在整个文档中获取包含类名“foo”的所有元素,包括<head>
。
答案 2 :(得分:1)
typeof document
和typeof 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