为什么 dom-elements 作为窗口对象的属性存在
Why do dom-elements exist as properties on the window-object?
如果我像这样写html:
<div id="foo">Foo<div>
window.foo
返回一个 dom-element window.document.getElementById("foo") === window.foo
返回 true
。
为什么?为什么每个人都使用getElementById
?
还有一个旁注:为什么在IE7/8中禁止覆盖window.foo
?如果我设置window.foo = "bar"
会发生什么?
我不确定历史角度,但 HTML 5 指定元素是候选对象,如果它们具有 id
属性,则直接作为window
对象的属性公开:
窗口接口支持命名属性。支持的属性 名称在任何时候都由以下内容组成,按树顺序排列,忽略 以后的重复:
[...]
- 活动文档中具有非空 ID 内容属性的任何 HTML 元素的 ID 内容属性的值。
这个定义的问题在于,它只保证如果有<div id="foo">Foo<div>
,那么window.foo
将被定义。它不保证它的确切值是什么(阅读规范以了解如何确定的规则;例如,它可能会返回一个集合)。
因此,事实证明,"为什么要使用getElementById
?"的答案很简单:因为您可以依靠它来返回您期望的内容,而无需考虑整个文档。
通常,在窗口对象中放置某些内容将使其全局化。例如:
var A = function() {
window.test = "bla";
console.log(test);
}
var B = function() {
console.log(test);
}
A();
B();
但是,这不是一个好的做法。不应依赖任何全局对象,因为您可能希望将代码移动到没有窗口的浏览器。或者以nodejs为例。
我发现window.foo有点不对劲,因为您可能有创建名为foo的全局变量的代码。因此,使用 getElementById 可以确保您始终获得 DOM 元素。
Window.foo在您的场景中工作正常,但是如果Id是类似于"foo-test"而不是"foo"的东西,您可以看到它不起作用。 这是因为Javascript变量不允许在其中使用破折号。而在document.getElementById的情况下,它可以正常工作
- 如果使用 lodash 将属性存在于另一个对象中,则向对象添加属性
- 未捕获的类型错误:无法读取属性'name'即使它存在,也无法定义
- 查找数组's按属性不存在于另一个数组中的对象
- 为什么没有从数组中存在的对象中删除属性
- 正在检查对象javascript中是否存在嵌套属性
- 正在检查属性的属性是否存在
- 为什么属性存在于对象实例上,即使其原型发生了更改
- 默认选中;为什么这个属性甚至存在
- HTML 中是否存在属性节点
- 错误 TS2339:类型“{}”上不存在属性“forEach”
- 如何获取数据属性中存在的现有JSON并更新它
- 类型错误: 无法读取未定义的属性“存在”
- _.assign 仅当属性存在于目标对象中时
- 当工具提示属性存在时更改引导弹出框标题
- 为什么 jquery 在我刷新时显示“禁用”属性存在
- 为什么 dom-elements 作为窗口对象的属性存在
- Qunit测试属性存在于对象中
- 未捕获的类型错误:不能读取属性-尽管属性存在
- 无法读取未定义的属性-但属性存在
- 如何添加名称已作为另一个属性存在的JSON项