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 Split方法,indexOf方法、lastIndexOf 方法和substring 方法
Mar 21 Javascript
jQuery图片的展开和收缩实现代码
Apr 16 Javascript
js setTimeout opener的用法示例详解
Oct 23 Javascript
jQuery之过滤元素操作小结
Nov 30 Javascript
jquery清空表单数据示例分享
Feb 13 Javascript
javascript数组操作总结和属性、方法介绍
Apr 05 Javascript
js实现的标题栏新消息闪烁提示效果
Jun 06 Javascript
JS模仿编辑器实时改变文本框宽度和高度大小的方法
Aug 17 Javascript
JavaScript学习笔记之数组去重
Mar 23 Javascript
浅谈jquery中ajax跨域提交的时候会有2次请求的问题
Nov 10 jQuery
详解如何使用 vue-cli 开发多页应用
Dec 16 Javascript
使用live-server快速搭建本地服务器+自动刷新的方法
Mar 09 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/12/25 PHP
PHP和JavaScrip分别获取关联数组的键值示例代码
2013/09/16 PHP
smarty中js的调用方法示例
2014/10/27 PHP
使用php完成常见的文件上传功能(推荐)
2017/01/13 PHP
phpMyAdmin无法登陆的解决方法
2017/04/27 PHP
PHP simplexml_import_dom()函数讲解
2019/02/03 PHP
一些mootools的学习资源
2010/02/07 Javascript
事件模型在各浏览器中存在差异
2010/10/20 Javascript
Jquery中获取iframe的代码
2011/01/11 Javascript
jquery插件开发注意事项小结
2013/06/04 Javascript
用jquery写的一个万年历(自写)
2014/01/20 Javascript
node.js中的fs.unlink方法使用说明
2014/12/15 Javascript
超实用的javascript时间处理总结
2016/08/16 Javascript
AngularJS控制器controller给模型数据赋初始值的方法
2017/01/04 Javascript
JS实现简单表格排序操作示例
2017/10/07 Javascript
原生JS实现的雪花飘落动画效果
2018/05/03 Javascript
Vue中使用 setTimeout() setInterval()函数的问题
2018/09/13 Javascript
基于Vue实现图片在指定区域内移动的思路详解
2018/11/11 Javascript
bootstrap与pagehelper实现分页效果
2018/12/29 Javascript
vue 进阶之实现父子组件间的传值
2019/04/26 Javascript
JavaScript本地储存:localStorage、sessionStorage、cookie的使用
2020/10/13 Javascript
Python扫描IP段查看指定端口是否开放的方法
2015/06/09 Python
详解Django通用视图中的函数包装
2015/07/21 Python
python实现class对象转换成json/字典的方法
2016/03/11 Python
Python实现一个简单的验证码程序
2017/11/03 Python
python 日志增量抓取实现方法
2018/04/28 Python
python绘制热力图heatmap
2020/03/23 Python
美国女士泳装店:Swimsuits For All
2017/03/02 全球购物
英国领先的杂志订阅网站:Magazine.co.uk
2018/01/25 全球购物
澳大利亚领先的折扣药房:Chemist Direct(有中文站)
2018/11/24 全球购物
党员志愿者活动总结
2014/06/26 职场文书
拆迁委托协议书
2014/09/15 职场文书
教师求职自荐信范文
2015/03/04 职场文书
毕业设计论文致谢词
2015/05/14 职场文书
反四风问题学习心得体会
2016/01/22 职场文书
golang slice元素去重操作
2021/04/30 Golang