一行代码告别document.getElementById


Posted in Javascript onJune 01, 2012

所以绝大多数的脚本里,都是直接通过元素的id来访问DOM的。


后来随着各种浏览器接踵而至,逐渐的替代了ie。为了保证各路门派统一规则,标准化越来越被重视。当初那种直接访问id的方法,逐渐被document.getElementById所替代。如果这年头还在用id访问元素,要么就是做程序里的内嵌网页,要么就是像铁道部那样的超境界仿古网站:) 当然只要保证你的用户都是用ie访问,这样的非标准也但用无妨。


然而,很多第三方浏览器刚出来的时候,为了保证能与当时大量的非标准页面兼容,都保留了用id访问DOM这一非标准做法。事实上如今的主流浏览器,只有FireFox不支持这种做法,而Chrome,Opera,Safari,Mobile Safari都支持。


既然如此,我们不如让FireFox也支持,这样所有的浏览器都可以直接用id直接访问DOM,不仅快捷方便,减少了累赘的代码,更能提升运行的效率。


实现很简单,文档载入完成后查询带有id属性的元素,然后在window对象里添加其引用:

var list = document.querySelectorAll('[id]'); 
for(var i = 0; i < list.length; i++) 
{ 
if(list[i].id) 
window[list[i].id] = list[i]; 
}

当然,只有FF需要这个hack,所以我们先检测下是否有其特征。最后精简下代码,利用数组遍历回调,即可压缩到简单的一行:
<script> 
if('mozHidden' in document) [].forEach.call(document.querySelectorAll('[id]'),function(k){this[k.id]=k}); 
</script>

不过有个值得注意的地方,在文档载入尚未完成前 querySelectorAll,只能查询当前<script>之前的元素。所以以上代码必须放在文档的末尾。而使用id访问,也必须在文档载入完成之后,否则就可能找不到这个元素。下面是个测试页面,在所有浏览器下都通过:

<!DOCTYPE html> 
<html> 
<head> 
<title>No document.getElementById</title> 
</head> 
<body> 
<div id="mytag"></div> 
<script> 
onload = function() 
{ 
mytag.innerHTML = "Goodbye, document.getElementById!"; 
} 
</script> 
<script> 
if('mozHidden' in document) [].forEach.call(document.querySelectorAll('[id]'),function(e){self[e.id]=e}); 
</script> 
</body> 
</html>
Javascript 相关文章推荐
关于JavaScript的一些看法
May 27 Javascript
ExtJs 3.1 XmlTreeLoader Example Error
Feb 09 Javascript
jquery select(列表)的操作(取值/赋值)
Mar 16 Javascript
JavaScript中逗号运算符介绍及使用示例
Mar 13 Javascript
avalon js实现仿google plus图片多张拖动排序附源码下载
Sep 24 Javascript
拥有一个属于自己的javascript表单验证插件
Mar 24 Javascript
原生js实现打字动画游戏
Feb 04 Javascript
vuejs通过filterBy、orderBy实现搜索筛选、降序排序数据
Oct 26 Javascript
vue2.0获取自定义属性的值
Mar 28 Javascript
Web开发使用Angular实现用户密码强度判别的方法
Sep 27 Javascript
快速了解vue-cli 3.0 新特性
Feb 28 Javascript
Angular ui-roter 和AngularJS 通过 ocLazyLoad 实现动态(懒)加载模块和依赖
Nov 25 Javascript
javascript的console.log()用法小结
May 31 #Javascript
jQuery 联动日历实现代码
May 31 #Javascript
从阶乘函数对比Javascript和C#的异同
May 31 #Javascript
javascript 快速排序函数代码
May 30 #Javascript
使用jQuery Ajax功能时需要注意的一个问题(内存溢出)
May 30 #Javascript
Chosen 基于jquery的选择框插件使用方法
May 30 #Javascript
基于jquery的鼠标拖动效果代码
May 30 #Javascript
You might like
一个oracle+PHP的查询的例子
2006/10/09 PHP
PHP实现采集中国天气网未来7天天气
2014/10/15 PHP
PHP基于方差和标准差计算学生成绩的稳定性示例
2017/07/04 PHP
在 Laravel 中 “规范” 的开发短信验证码发送功能
2017/10/26 PHP
PHP mongodb操作类定义与用法示例【适合mongodb2.x和mongodb3.x】
2018/06/16 PHP
PHP7新特性之抽象语法树(AST)带来的变化详解
2018/07/17 PHP
PHP session垃圾回收机制实例分析
2019/06/28 PHP
jQuery对象和DOM对象的相互转化实现代码
2010/03/02 Javascript
js+css使DIV始终居于屏幕中间 左下 左上 右上 右下的代码集合
2011/03/10 Javascript
深入理解JavaScript中的传值与传引用
2013/12/09 Javascript
jQuery实现动画效果的简单实例
2014/01/27 Javascript
JavaScript实现简单的二级导航菜单实例
2015/04/15 Javascript
JavaScript数据结构与算法之集合(Set)
2016/01/29 Javascript
JavaScript比较当前时间是否在指定时间段内的方法
2016/08/02 Javascript
功能强大的Bootstrap组件(结合js)
2016/08/03 Javascript
谈谈第三方App接入微信登录 解读
2016/12/27 Javascript
vue实现页面加载动画效果
2017/09/19 Javascript
JS中比Switch...Case更优雅的多条件判断写法
2019/09/05 Javascript
vue.js 实现a标签href里添加参数
2019/11/12 Javascript
js通过canvas生成图片缩略图
2020/10/02 Javascript
Python基础教程之正则表达式基本语法以及re模块
2016/03/25 Python
python简单验证码识别的实现方法
2019/05/10 Python
python nmap实现端口扫描器教程
2020/05/28 Python
django框架使用views.py的函数对表进行增删改查内容操作详解【models.py中表的创建、views.py中函数的使用,基于对象的跨表查询】
2019/12/12 Python
在flask中使用python-dotenv+flask-cli自定义命令(推荐)
2020/01/05 Python
python使用建议与技巧分享(一)
2020/08/17 Python
python实现扫雷游戏的示例
2020/10/20 Python
Python 排序最长英文单词链(列表中前一个单词末字母是下一个单词的首字母)
2020/12/14 Python
印尼网上商店:Alfacart.com
2019/03/11 全球购物
商务助理岗位职责
2013/11/13 职场文书
采购部部长岗位职责
2014/02/06 职场文书
银行竞聘报告范文
2014/11/06 职场文书
2014教师年度思想工作总结
2014/11/10 职场文书
先进班组事迹材料
2014/12/25 职场文书
销售内勤岗位职责范本
2015/04/13 职场文书
python的变量和简单数字类型详解
2021/09/15 Python