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 相关文章推荐
node.js中的fs.lchownSync方法使用说明
Dec 16 Javascript
对Web开发中前端框架与前端类库的一些思考
Mar 27 Javascript
js中日期的加减法
May 06 Javascript
javascript实现信息增删改查的方法
Jul 25 Javascript
获取JS中网页各种高宽与位置的方法总结
Jul 27 Javascript
功能强大的Bootstrap使用手册(一)
Aug 02 Javascript
浅谈js中字符和数组一些基本算法题
Aug 15 Javascript
JavaScript递归操作实例浅析
Oct 31 Javascript
jQuery Easyui Treegrid实现显示checkbox功能
Aug 08 jQuery
vue.js实现只弹一次弹框
Jan 29 Javascript
Vue中key的作用示例代码详解
Jun 10 Javascript
关于ES6尾调用优化的使用
Sep 11 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实现小型站点广告管理
2006/10/09 PHP
PHP使用 Imagick 扩展实现图片合成,圆角处理功能示例
2019/09/09 PHP
Add Formatted Text to a Word Document
2007/06/15 Javascript
JS Array对象入门分析
2008/10/30 Javascript
写出更好的JavaScript程序之undefined篇(中)
2009/11/23 Javascript
jquery 问答知识整理
2010/02/11 Javascript
基于jQuery的Tab选项框效果代码(插件)
2011/03/01 Javascript
JavaScript的常见兼容问题及相关解决方法(chrome/IE/firefox)
2013/12/31 Javascript
JavaScript自定义日期格式化函数详细解析
2014/01/14 Javascript
把jQuery的类、插件封装成seajs的模块的方法
2014/03/12 Javascript
Jquery 获取指定标签的对象及属性的设置与移除
2014/05/29 Javascript
JavaScript中的setUTCDate()方法使用详解
2015/06/11 Javascript
JavaScript操作选择对象的简单实例
2016/05/16 Javascript
基于jQuery实现页面搜索功能
2020/03/26 Javascript
JS双击变input框批量修改内容
2016/12/12 Javascript
详解angular用$sce服务来过滤HTML标签
2017/04/11 Javascript
js实现文件上传功能 后台使用MultipartFile
2018/09/08 Javascript
java实现单链表增删改查的实例代码详解
2019/08/30 Javascript
JS自定义对象创建与简单使用方法示例
2020/01/15 Javascript
extjs图表绘制之条形图实现方法分析
2020/03/06 Javascript
JS变量提升及函数提升实例解析
2020/09/03 Javascript
如何管理Vue中的缓存页面
2021/02/06 Vue.js
Sanic框架基于类的视图用法示例
2018/07/18 Python
Python中的 sort 和 sorted的用法与区别
2019/08/10 Python
Python接口测试环境搭建过程详解
2020/06/29 Python
世界上最大的二手相机店:KEN
2017/05/17 全球购物
澳大利亚顶级美发和美容贸易超市:glamaCo
2020/01/19 全球购物
大学毕业生文采飞扬的自我鉴定
2013/12/03 职场文书
通用自荐信范文
2014/03/14 职场文书
节能环保标语
2014/06/12 职场文书
迟到检讨书2000字(精选篇)
2014/10/07 职场文书
学校党员干部承诺书
2015/05/04 职场文书
入党介绍人意见2015
2015/06/01 职场文书
军训新闻稿范文
2015/07/17 职场文书
2016年大学校运会广播稿件
2015/12/21 职场文书
mysql 获取相邻数据项
2022/05/11 MySQL