一行代码告别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 相关文章推荐
一些常用的JS功能函数代码
Jun 23 Javascript
jquery 年会抽奖程序
Dec 22 Javascript
js借助ActiveXObject实现创建文件
Sep 29 Javascript
动态创建script在IE中缓存js文件时导致编码的解决方法
May 04 Javascript
ionic2自定义cordova插件开发以及使用(Android)
Jun 19 Javascript
20行JS代码实现粘贴板复制功能
Feb 06 Javascript
浅谈VUE监听窗口变化事件的问题
Feb 24 Javascript
VUE Error: getaddrinfo ENOTFOUND localhost
May 03 Javascript
angular4 获取wifi列表中文显示乱码问题的解决
Oct 20 Javascript
实例讲解JS中pop使用方法
Jan 27 Javascript
一个Java程序猿眼中的前后端分离以及Vue.js入门(推荐)
Apr 19 Javascript
微信小程序 Storage更新详解
Jul 16 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
DC漫画《蝙蝠侠和猫女》图透 猫女怀孕老爷当爹
2020/04/09 欧美动漫
PHP一些有意思的小区别
2006/12/06 PHP
浅谈php函数serialize()与unserialize()的使用方法
2014/08/19 PHP
php防止sql注入之过滤分页参数实例
2014/11/03 PHP
php+xml结合Ajax实现点赞功能完整实例
2015/01/30 PHP
php项目开发中用到的快速排序算法分析
2016/06/25 PHP
php使用event扩展的io复用测试的示例
2020/10/20 PHP
初学JavaScript第二章
2008/09/30 Javascript
JavaScript是否可实现多线程  深入理解JavaScript定时机制
2009/12/22 Javascript
js 全兼容可高亮二级缓冲折叠菜单
2010/06/04 Javascript
javascript获取选中的文本的方法代码
2013/10/30 Javascript
Windows8下搭建Node.js开发环境教程
2014/09/03 Javascript
javascript框架设计之框架分类及主要功能
2015/06/23 Javascript
全面解析Bootstrap排版使用方法(标题)
2015/11/30 Javascript
理解Javascript的call、apply
2015/12/16 Javascript
javascript嵌套函数和在函数内调用外部函数的区别分析
2016/01/31 Javascript
JavaScript必知必会(二) null 和undefined
2016/06/08 Javascript
ES6新增的math,Number方法
2017/08/06 Javascript
AngularJS通过ng-Img-Crop实现头像截取的示例
2017/08/17 Javascript
javascript trie前缀树的示例
2018/01/29 Javascript
vue监听键盘事件的快捷方法【推荐】
2018/07/11 Javascript
python类继承用法实例分析
2015/05/27 Python
Python实现去除列表中重复元素的方法小结【4种方法】
2018/04/27 Python
python爬取内容存入Excel实例
2019/02/20 Python
Python Django切换MySQL数据库实例详解
2019/07/16 Python
PyTorch中Tensor的数据统计示例
2020/02/17 Python
python 一维二维插值实例
2020/04/22 Python
python 多线程死锁问题的解决方案
2020/08/25 Python
生产班组长岗位职责
2014/01/05 职场文书
学校节能减排倡议书
2014/05/16 职场文书
解除劳动合同证明书模板
2014/11/20 职场文书
2014公司年终工作总结
2014/12/19 职场文书
财务人员岗位职责
2015/02/03 职场文书
解决Tkinter中button按钮未按却主动执行command函数的问题
2021/05/23 Python
JavaScript 对象创建的3种方法
2021/11/17 Javascript
CSS实现五种常用的2D转换
2021/12/06 HTML / CSS