一行代码告别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中的数字与字符串相加实例分析
Aug 14 Javascript
js history对象简单实现返回和前进
Oct 30 Javascript
jQuery简单实现banner图片切换
Jan 02 Javascript
Javascript写入txt和读取txt文件示例
Feb 12 Javascript
判断在css加载完毕后执行后续代码示例
Sep 03 Javascript
JS实现保留n位小数的四舍五入问题示例
Aug 03 Javascript
详解Vue.js——60分钟组件快速入门(上篇)
Dec 05 Javascript
JavaScript数组迭代方法
Mar 03 Javascript
记React connect的几种写法(小结)
Sep 18 Javascript
vue 实现模糊检索并根据其他字符的首字母顺序排列
Sep 19 Javascript
vue-router重写push方法,解决相同路径跳转报错问题
Aug 07 Javascript
JavaScript实现HTML导航栏下拉菜单
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
openPNE常用方法分享
2011/11/29 PHP
PHP的引用详解
2015/02/22 PHP
php生成带logo二维码方法小结
2016/04/08 PHP
原生PHP实现导出csv格式Excel文件的方法示例【附源码下载】
2019/03/07 PHP
从零开始学习jQuery (二) 万能的选择器
2010/10/01 Javascript
Javascript异步编程的4种方法让你写出更出色的程序
2013/01/17 Javascript
jQuery中:radio选择器用法实例
2015/01/03 Javascript
JavaScript数组常用方法
2015/03/02 Javascript
javascript编写贪吃蛇游戏
2015/07/07 Javascript
很棒的js Tab选项卡切换效果
2016/08/30 Javascript
Javascript 一些需要注意的细节(必看篇)
2017/07/08 Javascript
浅谈vue-lazyload实现的详细过程
2017/08/22 Javascript
利用express启动一个server服务的方法
2017/09/17 Javascript
vue-cli启动本地服务局域网不能访问的原因分析
2018/01/22 Javascript
JS如何在数组指定位置插入元素
2020/03/10 Javascript
前端 javascript 实现文件下载的示例
2020/11/24 Javascript
python实现解数独程序代码
2017/04/12 Python
深入理解python中的select模块
2017/04/23 Python
Python实现基于PIL和tesseract的验证码识别功能示例
2018/07/11 Python
在Python中给Nan值更改为0的方法
2018/10/30 Python
python3实现网络爬虫之BeautifulSoup使用详解
2018/12/19 Python
使用python打印十行杨辉三角过程详解
2019/07/10 Python
python elasticsearch从创建索引到写入数据的全过程
2019/08/04 Python
python之PyQt按钮右键菜单功能的实现代码
2019/08/17 Python
python opencv根据颜色进行目标检测的方法示例
2020/01/15 Python
Python实现列表索引批量删除的5种方法
2020/11/16 Python
全球性的在线购物网站:Zapals
2017/03/22 全球购物
西铁城美国官方网站:Citizen Watch美国
2019/11/08 全球购物
轻金属冶金专业毕业生自荐信
2013/11/02 职场文书
教师自我反思材料
2014/02/14 职场文书
中餐厅经理岗位职责
2014/04/11 职场文书
党支部三会一课计划
2014/09/24 职场文书
2014年大学生社会实践自我鉴定
2014/09/26 职场文书
八项规定自查自纠报告及整改措施
2014/10/26 职场文书
大学生军训感言
2015/08/01 职场文书
nginx 添加http_stub_status_module模块
2022/05/25 Servers