一行代码告别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高级程序设计 读书笔记之九 本地对象Array
Feb 27 Javascript
Json字符串转换为JS对象的高效方法实例
May 01 Javascript
js获取内联样式的方法
Jan 27 Javascript
javascript实现简单的分页特效
Aug 12 Javascript
实例分析浏览器中“JavaScript解析器”的工作原理
Dec 12 Javascript
JS在浏览器中解析Base64编码图像
Feb 09 Javascript
微信小程序 action-sheet 反馈上拉菜单简单实例
May 11 Javascript
Vue中组件之间数据的传递的示例代码
Sep 08 Javascript
js将键值对字符串转为json字符串的方法
Mar 30 Javascript
浅谈javascript中的prototype和__proto__的理解
Apr 07 Javascript
微信小程序用户盒子、宫格列表的实现
Jul 01 Javascript
解决elementui表格操作列自适应列宽
Dec 28 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
咖啡与水的关系
2021/03/03 冲泡冲煮
prototype与jquery下Ajax实现的差别
2009/09/13 Javascript
原生js做的手风琴效果的导航菜单
2013/11/08 Javascript
javascript setinterval 的正确语法如何书写
2014/06/17 Javascript
JavaScript对象属性检查、增加、删除、访问操作实例
2015/07/08 Javascript
javascript单页面手势滑屏切换原理详解
2016/03/21 Javascript
angular route中使用resolve在uglify压缩后问题解决
2016/09/21 Javascript
微信小程序 闭包写法详细介绍
2016/12/14 Javascript
bootstrap table实例详解
2017/01/06 Javascript
微信小程序 this和that详解及简单实例
2017/02/13 Javascript
javascript基本常用排序算法解析
2017/09/27 Javascript
cdn模式下vue的基本用法详解
2018/10/07 Javascript
Vue 中使用富文本编译器wangEditor3的方法
2019/09/26 Javascript
多页vue应用的单页面打包方法(内含打包模式的应用)
2020/06/11 Javascript
python为tornado添加recaptcha验证码功能
2014/02/26 Python
Python 爬虫学习笔记之多线程爬虫
2016/09/21 Python
如何在Python函数执行前后增加额外的行为
2016/10/20 Python
Pycharm学习教程(4) Python解释器的相关配置
2017/05/03 Python
Python实现的科学计算器功能示例
2017/08/04 Python
Python如何实现MySQL实例初始化详解
2017/11/06 Python
Python常见字符串操作函数小结【split()、join()、strip()】
2018/02/02 Python
Django框架的使用教程路由请求响应的方法
2018/07/03 Python
基于python实现高速视频传输程序
2019/05/05 Python
python实现翻转棋游戏(othello)
2019/07/29 Python
python selenium自动化测试框架搭建的方法步骤
2020/06/14 Python
python Canny边缘检测算法的实现
2020/04/24 Python
python 使用OpenCV进行简单的人像分割与合成
2021/02/02 Python
详解如何使用CSS3中的结构伪类选择器和伪元素选择器
2020/01/06 HTML / CSS
HTML5拖放API实现自动生成相框功能
2020/04/07 HTML / CSS
环境工程毕业生自荐信
2013/11/17 职场文书
临床医学专业学生的自我评价分享
2013/11/21 职场文书
商场促销活动总结
2014/07/10 职场文书
学生自我鉴定格式及范文
2014/09/16 职场文书
酒店财务总监岗位职责
2015/04/03 职场文书
干货:企业内部人才推荐奖励方案!
2019/07/09 职场文书
解决flex布局中子项目尺寸不受flex-shrink限制
2022/05/11 HTML / CSS