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 相关文章推荐
javascript的offset、client、scroll使用方法详解
Dec 25 Javascript
js/html光标定位的实现代码
Sep 23 Javascript
jquery简单实现鼠标经过导航条改变背景图
Dec 17 Javascript
Javascript实现Array和String互转换的方法
Dec 21 Javascript
JS组件Bootstrap实现弹出框效果代码
Apr 26 Javascript
微信小程序手势操作之单触摸点与多触摸点
Mar 10 Javascript
AngularJS 控制器 controller的详解
Oct 17 Javascript
JavaScript数据结构之优先队列与循环队列实例详解
Oct 27 Javascript
解决vue动态为数据添加新属性遇到的问题
Sep 18 Javascript
vue-element-admin 菜单标签失效的解决方式
Nov 12 Javascript
vue 需求 data中的数据之间的调用操作
Aug 05 Javascript
AJAX实现省市县三级联动效果
Oct 16 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
福利彩票幸运号码自动生成器
2006/10/09 PHP
AMFPHP php远程调用(RPC, Remote Procedure Call)工具 快速入门教程
2010/05/10 PHP
php防攻击代码升级版
2010/12/29 PHP
PHP版网站缓存加快打开速度的方法分享
2012/06/03 PHP
详解PHP的Laravel框架中Eloquent对象关系映射使用
2016/02/26 PHP
php如何执行非缓冲查询API
2016/07/22 PHP
利用php获得flv视频长度的实例代码
2017/10/26 PHP
实例讲解PHP验证邮箱是否合格
2019/01/28 PHP
jQuery 性能优化指南 (1)
2009/05/21 Javascript
如何用jquery控制表格奇偶行及活动行颜色
2014/04/20 Javascript
nodejs 整合kindEditor实现图片上传
2015/02/03 NodeJs
jQuery实现的简单折叠菜单(折叠面板)效果代码
2015/09/16 Javascript
bootstrap组件之按钮式下拉菜单小结
2017/01/19 Javascript
VUE中使用Vue-resource完成交互
2017/07/21 Javascript
Vue SSR 组件加载问题
2018/05/02 Javascript
微信小程序支付功能 php后台对接完整代码分享
2018/06/12 Javascript
Vue 开发音乐播放器之歌手页右侧快速入口功能
2018/08/08 Javascript
apicloud拉起小程序并传递参数的方法示例
2018/11/21 Javascript
vue实现密码显示与隐藏按钮的自定义组件功能
2019/04/23 Javascript
微信小程序在其他页面监听globalData中值的变化
2019/07/15 Javascript
JavaScript canvas绘制折线图
2020/02/18 Javascript
python使用7z解压apk包的方法
2015/04/18 Python
Python排序搜索基本算法之冒泡排序实例分析
2017/12/09 Python
Python自定义线程池实现方法分析
2018/02/07 Python
pandas修改DataFrame列名的方法
2018/04/08 Python
python hook监听事件详解
2018/10/25 Python
python判断输入日期为第几天的实例
2018/11/13 Python
PYTHON如何读取和写入EXCEL里面的数据
2019/10/28 Python
Python Pickle 实现在同一个文件中序列化多个对象
2019/12/30 Python
利用Python计算KS的实例详解
2020/03/03 Python
python图片剪裁代码(图片按四个点坐标剪裁)
2020/03/10 Python
药学专业毕业生求职信
2013/10/20 职场文书
支教自我鉴定
2014/01/18 职场文书
企业安全生产目标责任书
2014/07/23 职场文书
查摆问题整改措施范文
2014/10/11 职场文书
Java详细解析==和equals的区别
2022/04/07 Java/Android