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 相关文章推荐
js函数的引用, 关于内存的开销
Sep 17 Javascript
jQuery学习笔记 更改jQuery对象
Sep 19 Javascript
javascript实现随时变化着的背景颜色
Apr 02 Javascript
jQuery超酷平面式时钟效果代码分享
Mar 30 Javascript
JS实现星星评分功能实例代码(两种方法)
Jun 09 Javascript
vue如何在自定义组件中使用v-model
May 14 Javascript
angular4 获取wifi列表中文显示乱码问题的解决
Oct 20 Javascript
ES6 Promise对象的含义和基本用法分析
Jun 14 Javascript
layui2.0使用table+laypage实现真分页
Jul 27 Javascript
关于vue.js中实现方法内某些代码延时执行
Nov 14 Javascript
使用preload预加载页面资源时注意事项
Feb 03 Javascript
vue如何在项目中调用腾讯云的滑动验证码
Jul 15 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生成UTF8文件的方法
2010/05/15 PHP
11个PHP 分页脚本推荐
2011/08/15 PHP
PHP通过串口实现发送短信
2015/07/08 PHP
PHP折半(二分)查找算法实例分析
2018/05/12 PHP
一个很简单的办法实现TD的加亮效果.
2006/06/29 Javascript
JavaScript高级程序设计
2006/12/29 Javascript
JS关闭窗口与JS关闭页面的几种方法小结
2013/12/17 Javascript
js 判断浏览器使用的语言示例代码
2014/03/22 Javascript
JQuery异步提交表单与文件上传功能示例
2017/01/12 Javascript
纯js仿淘宝京东商品放大镜功能
2017/03/02 Javascript
Angular 4根据组件名称动态创建出组件的方法教程
2017/11/01 Javascript
sublime text配置node.js调试(图文教程)
2017/11/23 Javascript
vue中post请求以a=a&amp;b=b 的格式写遇到的问题
2018/04/27 Javascript
vue异步加载高德地图的实现
2018/06/19 Javascript
JS添加或删除HTML dom元素的方法实例分析
2019/03/05 Javascript
用PyInstaller把Python代码打包成单个独立的exe可执行文件
2018/05/26 Python
Python 给屏幕打印信息加上颜色的实现方法
2019/04/24 Python
python numpy 矩阵堆叠实例
2020/01/17 Python
html5+css3之动画在webapp中的应用
2014/11/21 HTML / CSS
浅谈CSS3鼠标移入图片动态提示效果(transform)
2017/11/06 HTML / CSS
浅谈css3中calc在less编译时被计算的解决办法
2017/12/04 HTML / CSS
乌克兰在线商店的价格比较:Price.ua
2019/07/26 全球购物
意大利和国际最佳时尚品牌:Drestige
2019/12/28 全球购物
美国滑板店:Tactics
2020/11/08 全球购物
上海雨人软件技术开发有限公司测试题
2015/07/14 面试题
初中班主任评语
2014/04/24 职场文书
2014年教师党员自我评价范文
2014/09/22 职场文书
民事诉讼代理授权委托书
2014/10/11 职场文书
公司员工辞职信范文
2015/05/12 职场文书
撤诉书怎么写
2015/05/19 职场文书
特种设备安全管理制度
2015/08/06 职场文书
大学生暑期社会实践的个人总结!
2019/07/17 职场文书
高端收音机+蓝牙音箱,JBL TUNER FM带收音蓝牙音箱评测
2021/04/24 无线电
python-for x in range的用法(注意要点、细节)
2021/05/10 Python
详解nginx进程锁的实现
2021/06/14 Servers
动画电影《擅长捉弄人的高木同学》6月10日上映!
2022/03/20 日漫