js DOM 元素ID就是全局变量


Posted in Javascript onSeptember 20, 2012

标准规范

HTML5规范文档中指出:如果一个元素符合下面两条规则中的任一条,则window对象中必须要有与之对应的一个属性,属性值就是这个对象.

  • 如果一个元素拥有ID属性,那么ID属性的属性值就会成为window对象的属性名.
  • 如果一个元素拥有name属性,那么name属性的属性值就会成为window对象的属性名.但这个元素的标签名必须是: a, applet, area, embed, form, frame, frameset, iframe, img, object,其中的一个.

让我们看一个例子.假定存在一个页面,该页面包含了一个ID属性为“foo”的div元素:

<div id="foo"></div>

这样一来,上面的的div元素就可以通过window.foo(和其他的window属性一样),或者全局变量foo来访问到.比如,在Chrome控制台中,你可以这样做:
> "foo" in window 
true 
> foo 
<div id="foo"></div>

Firefox

火狐(14)的工作方式略有不同.

> "foo" in window 
false 
> typeof foo // 这个全局变量到底有木有? 
object 
//错误控制台输出了下面的警告.//Element referenced by ID/NAME in the global scope. 
//Use W3C standard document.getElementById() instead. > foo 
[object HTMLDivElement] 
//错误控制台输出了下面的警告.//Element referenced by ID/NAME in the global scope. 
//Use W3C standard document.getElementById() instead.> "foo" in window true
> "foo" in window
false
> typeof foo  // 这个全局变量到底有木有?
object
//错误控制台输出了下面的警告.//Element referenced by ID/NAME in the global scope.
//Use W3C standard document.getElementById() instead.
> foo
[object HTMLDivElement]
//错误控制台输出了下面的警告.//Element referenced by ID/NAME in the global scope.
//Use W3C standard document.getElementById() instead.> "foo" in window true

这到底是怎么一回事?初始化时,window并没有属性foo.但在第一次访问这个属性的时候(通过window.foo属性直接访问或者通过全局变量foo来访问都可以),它会被自动建立.

译者注:我在Firefox14,15,18中都没有发现警告,不过在Firefox12试验时,的确有警告.

js DOM 元素ID就是全局变量

[注意:例子中的代码只能在网页中通过script标签运行才能见效,不能通过终端运行.这是因为终端在处理全局对象时,使用了不同的方式.]

译者注:我在Firebug中尝试例子中的代码,并没发现有什么差别.

一旦你尝试读取foo的值,虽然会正常返回那个div元素,但同时错误控制台会有警告,告诉你不应该那么做.很显然,这样的警告是正确的:在终端调试的时候,你可以使用这个特性,但在实际的代码中,不应该使用.

Cody Lindley写了一个jsPerf测试来比较通过全局变量访问foo和通过window.foo来访问foo的性能差别.有趣的是,只有在Firefox中访问window.foo更快点.

Javascript 相关文章推荐
Html中JS脚本执行顺序简单举例说明
Jun 19 Javascript
Jquery.LazyLoad.js修正版下载,实现图片延迟加载插件
Mar 12 Javascript
JavaScript中的函数嵌套使用
Jun 04 Javascript
jQuery实现的数值范围range2dslider选取插件特效多款代码分享
Aug 27 Javascript
js不间断滚动的简单实现
Jun 03 Javascript
浅谈jQuery效果函数
Sep 16 Javascript
JQuery和html+css实现带小圆点和左右按钮的轮播图实例
Jul 22 jQuery
JS中关于正则的巧妙操作
Aug 31 Javascript
基于Vue实现拖拽效果
Apr 27 Javascript
JQuery样式与属性设置方法分析
Dec 07 jQuery
在 Vue 中使用 JSX 及使用它的原因浅析
Feb 10 Javascript
js实现简易点击切换显示或隐藏
Nov 29 Javascript
JavaScript NaN和Infinity特殊值 [译]
Sep 20 #Javascript
JavaScript 更严格的相等 [译]
Sep 20 #Javascript
JavaScript 反科里化 this [译]
Sep 20 #Javascript
Array.prototype.concat不是通用方法反驳[译]
Sep 20 #Javascript
JavaScript 用Node.js写Shell脚本[译]
Sep 20 #Javascript
一个简单的网站访问JS计数器 刷新1次加1次访问
Sep 20 #Javascript
javascript分页代码(当前页码居中)
Sep 20 #Javascript
You might like
关于PHP自动判断字符集并转码的详解
2013/06/26 PHP
Mozilla中显示textarea中选择的文字
2006/09/07 Javascript
IE浏览器PNG图片透明效果代码
2008/09/02 Javascript
几个比较经典常用的jQuery小技巧
2010/03/01 Javascript
说明你的Javascript技术很烂的五个原因
2011/04/26 Javascript
IE6/7/8/9不支持exec的简写方式
2011/05/25 Javascript
javascript date格式化示例
2013/09/25 Javascript
jQuery获得内容和属性示例代码
2014/01/16 Javascript
javascript怎么禁用浏览器后退按钮
2014/03/27 Javascript
node.js中的fs.chown方法使用说明
2014/12/16 Javascript
javascript中var的重要性分析
2015/02/11 Javascript
JavaScript简单修改窗口大小的方法
2015/08/03 Javascript
JS给Textarea文本框添加行号的方法
2015/08/20 Javascript
JavaScript高级教程5.6之基本包装类型(详细)
2015/11/23 Javascript
JS小数转换为整数的方法分析
2017/01/07 Javascript
在vue.js中抽出公共代码的方法示例
2017/06/08 Javascript
js轮播图无缝滚动效果
2017/06/17 Javascript
详解vue + vuex + directives实现权限按钮的思路
2017/10/24 Javascript
基于javascript 显式转换与隐式转换(详解)
2017/12/15 Javascript
Jquery ajax书写方法代码实例解析
2020/06/12 jQuery
用实例说明python的*args和**kwargs用法
2013/11/01 Python
Python求算数平方根和约数的方法汇总
2016/03/09 Python
python with提前退出遇到的坑与解决方案
2018/01/05 Python
PyCharm代码整体缩进,反向缩进的方法
2018/06/25 Python
Python生态圈图像格式转换问题(推荐)
2019/12/02 Python
解决torch.autograd.backward中的参数问题
2020/01/07 Python
使用html5制作loading图的示例
2014/04/14 HTML / CSS
海滩咖啡馆:Beach Cafe
2018/02/02 全球购物
文秘专业应届生求职信
2014/05/26 职场文书
小学课外阅读总结
2014/07/09 职场文书
住宿生擅自离校检讨书
2014/09/22 职场文书
担保书范本
2015/01/20 职场文书
2015小学教师年度工作总结
2015/05/12 职场文书
2015秋季新学期开学寄语
2015/05/28 职场文书
python入门之算法学习
2021/04/22 Python
解析探秘fescar分布式事务实现原理
2022/02/28 Java/Android