一行代码告别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 相关文章推荐
用jquery来定位
Feb 20 Javascript
jquery 经典动画菜单效果代码
Jan 26 Javascript
用Jquery实现多级下拉框无刷新的联动
Dec 22 Javascript
如何让页面加载完成后执行js
Jun 26 Javascript
Express的路由详解
Dec 10 Javascript
JS实现table表格数据排序功能(可支持动态数据+分页效果)
May 26 Javascript
使用jquery如何获取时间
Oct 13 Javascript
80%应聘者都不及格的JS面试题
Mar 21 Javascript
bootstrap table表格使用方法详解
Apr 26 Javascript
详解Vue-axios 设置请求头问题
Dec 06 Javascript
react 生命周期实例分析
May 18 Javascript
js实现表格单列按字母排序
Aug 12 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
yii2实现根据时间搜索的方法
2016/05/25 PHP
Thinkphp实现站点静态化的方法详解
2017/03/21 PHP
php实现微信企业号支付个人的方法详解
2017/07/26 PHP
php ActiveMQ的安装与使用方法图文教程
2020/02/23 PHP
第一个JavaScript入门基础 document.write输出
2010/02/22 Javascript
iframe 父窗口和子窗口相互的调用方法集锦
2010/12/15 Javascript
js 上下左右键控制焦点(示例代码)
2013/12/14 Javascript
Angularjs 基础入门
2014/12/26 Javascript
javascript实现五星评价代码(源码下载)
2015/08/11 Javascript
学习JavaScript设计模式之迭代器模式
2016/01/19 Javascript
javascript实现不同颜色Tab标签切换效果
2016/04/27 Javascript
bootstrap按钮插件(Button)使用方法解析
2017/01/13 Javascript
JS基于面向对象实现的多个倒计时器功能示例
2017/02/28 Javascript
fckeditor部署到weblogic出现xml无法读取及样式不能显示问题的解决方法
2017/03/24 Javascript
H5图片压缩与上传实例
2017/04/21 Javascript
Mui使用jquery并且使用点击跳转新窗口的实例
2017/08/19 jQuery
JavaScript学习教程之cookie与webstorage
2019/06/23 Javascript
微信小程序实现选项卡滑动切换
2020/10/22 Javascript
npm全局环境变量配置详解
2020/12/15 Javascript
利用node.js开发cli的完整步骤
2020/12/29 Javascript
python使用beautifulsoup从爱奇艺网抓取视频播放
2014/01/23 Python
python对html代码进行escape编码的方法
2015/05/04 Python
python实现实时监控文件的方法
2016/08/26 Python
python tkinter实现界面切换的示例代码
2019/06/14 Python
PyTorch中常用的激活函数的方法示例
2019/08/20 Python
python编程进阶之异常处理用法实例分析
2020/02/21 Python
Python接口测试数据库封装实现原理
2020/05/09 Python
在pycharm中创建django项目的示例代码
2020/05/28 Python
python opencv 实现读取、显示、写入图像的方法
2020/06/08 Python
pytorch 计算ConvTranspose1d输出特征大小方式
2020/06/23 Python
pycharm激活码免费分享适用最新pycharm2020.2.3永久激活
2020/11/25 Python
HTML5实现桌面通知 提示功能
2017/10/11 HTML / CSS
日语专业毕业生求职信
2013/12/04 职场文书
党员教师工作决心书
2014/03/13 职场文书
总结表彰大会主持词
2014/03/26 职场文书
交警失职检讨书
2015/01/26 职场文书