一行代码告别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 相关文章推荐
mysql输出数据赋给js变量报unterminated string literal错误原因
May 22 Javascript
修改jQuery Validation里默认的验证方法
Feb 14 Javascript
Javascript中Event属性搜集整理
Sep 17 Javascript
比较新旧两个数组值得增加和删除的JS代码
Oct 30 Javascript
5个可以帮你理解JavaScript核心闭包和作用域的小例子
Oct 08 Javascript
jQuery自定义添加&quot;$&quot;与解决&quot;$&quot;冲突的方法
Jan 19 Javascript
jQuery模拟实现的select点击选择效果【附demo源码下载】
Nov 09 Javascript
jQuery插件zTree实现单独选中根节点中第一个节点示例
Mar 08 Javascript
vue.js实现简单轮播图效果
Oct 10 Javascript
JS运算符简单用法示例
Jan 19 Javascript
封装 axios+promise通用请求函数操作
Aug 11 Javascript
js实现手表表盘时钟与圆周运动
Sep 18 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
抓取YAHOO股票报价的类
2009/05/15 PHP
php实现批量下载百度云盘文件例子分享
2014/04/10 PHP
PHP实现AES256加密算法实例
2014/09/22 PHP
PHP面试常用算法(推荐)
2016/07/22 PHP
PHP使用星号替代用户名手机和邮箱的实现代码
2018/02/07 PHP
使用闭包对setTimeout进行简单封装避免出错
2013/07/10 Javascript
IE6已终止操作问题的2种情况及解决
2014/04/23 Javascript
jQuery选择器源码解读(二):select方法
2015/03/31 Javascript
原生JS实现简单放大镜效果
2017/02/08 Javascript
Vue cli 引入第三方JS和CSS的常用方法分享
2018/01/20 Javascript
jQuery使用bind动态绑定事件无效的处理方法
2018/12/11 jQuery
JavaScript中的惰性载入函数及优势
2020/02/18 Javascript
vue的webcamjs集成方式
2020/11/16 Javascript
通过python下载FTP上的文件夹的实现代码
2013/02/10 Python
python实现代码行数统计示例分享
2014/02/10 Python
Python通过递归遍历出集合中所有元素的方法
2015/02/25 Python
用Python进行一些简单的自然语言处理的教程
2015/03/31 Python
Python实现telnet服务器的方法
2015/07/10 Python
python 截取 取出一部分的字符串方法
2017/03/01 Python
一个月入门Python爬虫学习,轻松爬取大规模数据
2018/01/03 Python
强悍的Python读取大文件的解决方案
2019/02/16 Python
python写入数据到csv或xlsx文件的3种方法
2019/08/23 Python
pycharm 配置svn的图文教程(手把手教你)
2021/01/15 Python
CSS3属性box-shadow使用详细教程
2012/01/21 HTML / CSS
详解webapp页面滚动卡顿的解决办法
2018/12/26 HTML / CSS
车库门开启器、遥控器和零件:Chamberlain
2019/04/09 全球购物
图库照片、免版税图片、矢量艺术、视频片段:Depositphotos
2019/08/02 全球购物
手工社团活动方案
2014/02/17 职场文书
《宿建德江》教学反思
2014/04/23 职场文书
2014年庆祝国庆65周年演讲稿
2014/09/21 职场文书
2014年校务公开工作总结
2014/12/18 职场文书
普宁寺导游词
2015/02/04 职场文书
五四青年节活动总结
2015/02/10 职场文书
小学副班长竞选稿
2015/11/21 职场文书
Redis 持久化 RDB 与 AOF的执行过程
2021/11/07 Redis
Selenium浏览器自动化如何上传文件
2022/04/06 Python