这个问题在这里已有答案:
- 带有id的DOM树元素是否成为全局变量? 4个答案
5355
2017-10-03 12:21
起源
不是特定于jQuery,而是Javascript。从来没有注意到这一点,好问题。这是一个小提琴,演示了以上内容: jsfiddle.net/Blade0rz/rjwPA/1 - CodingIntrigue
它找到了 window.foo,这是ID的元素。 - Archer
这巧合地证明了原因 ids需要在DOM中是唯一的,否则行为将是不确定的。 - David
答案:
这与jQuery无关。
这是因为命名元素(带有元素的元素) ID
要么 name
attribute)成为window对象的属性。
console.log(foo)
是完全相同的 console.log(window.foo);
既然你的 div
是一个命名元素(id="foo"
),它被添加到 window
。
7
2017-10-03 12:28
但不是在每个浏览器中,它不是规范的一部分。 - plalx
它不是jQuery行为,它(最初)是Internet Explorer行为。 IE总是为每个拥有的DOM元素创建全局变量 id
属性。变量以。命名 id
并引用DOM元素。最近,其他浏览器一直在效仿。
- http://www.west-wind.com/weblog/posts/2009/Mar/22/Internet-Explorer-Global-Variable-Blow-ups
- http://blogs.msdn.com/b/alvar/archive/2009/10/22/internet-explorer-creates-global-variables-for-each-object-in-the-dom.aspx
- http://www.shanison.com/2010/06/17/ie-id-and-javascript-global-variable/
- http://www.2ality.com/2012/08/ids-are-global.html
2
2017-10-03 12:30
JQuery没有假设,而是JavaScript。你的 foo
是不加引号,因此它必须是标识符或未定义。 id为的元素 foo
恰好位于脚本范围内,因此会记录由其标识的元素。
如果您将其重命名为 bar
,那么你就可以参考了 bar
因为它是一个顶级的id。
请注意,这种用法是不受欢迎的,因为在不引用html的情况下不清楚你在代码中做了什么。运用 document.getElementById(...)
或者其变体通常是优选的,因为它清楚你正在做什么。
0
2017-10-03 12:30