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高级程序设计 阅读笔记(十四) js继承机制的实现
Aug 14 Javascript
jquery实现效果比较好的table选中行颜色
Mar 25 Javascript
浅谈利用JavaScript进行的DDoS攻击原理与防御
Jun 04 Javascript
vue-hook-form使用详解
Apr 07 Javascript
angular json对象push到数组中的方法
Feb 27 Javascript
浅析java线程中断的办法
Jul 29 Javascript
Vue实现类似Spring官网图片滑动效果方法
Mar 01 Javascript
详解一个基于套接字实现长连接的express
Mar 28 Javascript
详解小程序开发经验:多页面数据同步
May 18 Javascript
JointJS JavaScript流程图绘制框架解析
Aug 15 Javascript
微信小程序自定义纯净模态框(弹出框)的实例代码
Mar 09 Javascript
解决vue字符串换行问题(绝对管用)
Aug 06 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
探讨如何使用SimpleXML函数来加载和解析XML文档
2013/06/07 PHP
thinkPHP实现递归循环栏目并按照树形结构无限极输出的方法
2016/05/19 PHP
jQuery live
2009/05/15 Javascript
JavaScript 工具库 Cloudgamer JavaScript Library v0.1 发布
2009/10/29 Javascript
模仿JQuery sortable效果 代码有错但值得看看
2009/11/05 Javascript
jQuery EasyUI API 中文文档 - ProgressBar 进度条
2011/09/29 Javascript
jquery实现table鼠标经过变色代码
2013/09/25 Javascript
jquery 页眉单行信息滚动显示实现思路及代码
2014/06/26 Javascript
angular.js分页代码的实例
2016/07/27 Javascript
bootstrap 设置checkbox部分选中效果
2017/04/20 Javascript
node 使用 async 控制并发的方法
2018/05/07 Javascript
JS获取浏览器地址栏的多个参数值的任意值实例代码
2018/07/24 Javascript
vue下的@change事件的实现
2019/10/25 Javascript
element-plus一个vue3.xUI框架(element-ui的3.x 版初体验)
2020/12/02 Vue.js
[02:40]DOTA2英雄基础教程 炼金术士
2013/12/23 DOTA
[51:06]2018DOTA2亚洲邀请赛3月29日 小组赛A组 KG VS Liquid
2018/03/30 DOTA
python实现数通设备端口监控示例
2014/04/02 Python
python在windows命令行下输出彩色文字的方法
2015/03/19 Python
python简单操作excle的方法
2018/09/12 Python
对pandas中iloc,loc取数据差别及按条件取值的方法详解
2018/11/06 Python
python向xls写入数据(包括合并,边框,对齐,列宽)
2021/02/02 Python
如何用 Python 制作一个迷宫游戏
2021/02/25 Python
表单button的outline在firefox浏览器下的问题
2012/12/24 HTML / CSS
印度网上购物首选目的地:Flipkart
2016/08/01 全球购物
Charlotte Tilbury英国官网:英国彩妆品牌
2017/05/26 全球购物
Everything But Water官网:美国泳装品牌
2019/03/17 全球购物
美国唇部护理专家:Sara Happ
2019/06/19 全球购物
施工材料员岗位职责
2014/02/12 职场文书
《蓝色的树叶》教学反思
2014/02/24 职场文书
道路建设实施方案
2014/03/18 职场文书
2016年三八红旗手先进事迹材料
2016/02/26 职场文书
Python+uiautomator2实现自动刷抖音视频功能
2021/04/29 Python
Vue过滤器(filter)实现及应用场景详解
2021/06/15 Vue.js
Spring mvc是如何实现与数据库的前后端的连接操作的?
2021/06/30 Java/Android
Win11如何设置右键单击显示所有选项?Win11右键单击显示所有选项设置教程
2022/04/08 数码科技
css3手动实现pc端横向滚动
2022/06/21 HTML / CSS