一行代码告别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+FSO遍历文件夹下文件并显示
Mar 07 Javascript
2007/12/23更新创意无限,简单实用(javascript log)
Dec 24 Javascript
DOM 基本方法
Jul 18 Javascript
js 屏蔽鼠标右键脚本附破解方法
Dec 03 Javascript
jQuery插件HighCharts绘制2D带有Legend的饼图效果示例【附demo源码下载】
Mar 10 Javascript
vue项目总结之文件夹结构配置详解
Dec 13 Javascript
create-react-app构建项目慢的解决方法
Mar 14 Javascript
移动端图片上传旋转、压缩问题的方法
Oct 16 Javascript
vue-cli3 从搭建到优化的详细步骤
Jan 20 Javascript
VUE 动态组件的应用案例分析
Dec 02 Javascript
JS动态图片的实现方法完整示例
Jan 13 Javascript
原生JS实现音乐播放器
Jan 26 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
PHP删除HTMl标签的实现代码
2013/06/30 PHP
php两点地理坐标距离的计算方法
2018/12/29 PHP
php命名空间设计思想、用法与缺点分析
2019/07/17 PHP
如何制作浮动广告 JavaScript制作浮动广告代码
2012/12/30 Javascript
js实现页面转发功能示例代码
2013/08/05 Javascript
js中array的sort()方法使用介绍
2014/02/20 Javascript
js实现遮罩层划出效果是生成div而不是显示
2014/07/29 Javascript
javascript实现在指定元素中垂直水平居中
2015/09/13 Javascript
javascript实现保留两位小数的多种方法
2015/12/18 Javascript
设计模式中的facade外观模式在JavaScript开发中的运用
2016/05/18 Javascript
基于JavaScript实现熔岩灯效果导航菜单
2017/01/04 Javascript
p5.js入门教程之小球动画示例代码
2018/03/15 Javascript
vue侧边栏动态生成下级菜单的方法
2018/09/07 Javascript
JS实现动态无缝轮播
2020/01/11 Javascript
JS数据类型判断的几种常用方法
2020/07/07 Javascript
python生成器的使用方法
2013/11/21 Python
sublime text 3配置使用python操作方法
2017/06/11 Python
关于python pyqt5安装失败问题的解决方法
2017/08/08 Python
python基于物品协同过滤算法实现代码
2018/05/31 Python
python 对类的成员函数开启线程的方法
2019/01/22 Python
Python中如何使用if语句处理列表实例代码
2019/02/24 Python
Python实现一个数组除以一个数的例子
2019/07/20 Python
Python测试线程应用程序过程解析
2019/12/31 Python
windows系统Tensorflow2.x简单安装记录(图文)
2021/01/18 Python
CSS3系列教程:背景图片(背景大小和多背景图) 应用说明
2012/12/19 HTML / CSS
AHAVA美国官方网站:死海海泥护肤品牌
2016/10/18 全球购物
Cotton On美国网站:澳洲时装连锁品牌
2016/10/25 全球购物
演讲稿怎么写才完美
2014/01/02 职场文书
机关办公室岗位职责
2014/04/16 职场文书
美丽家庭事迹材料
2014/05/03 职场文书
新书发布会策划方案
2014/06/09 职场文书
企业员工集体活动方案
2014/08/17 职场文书
感谢信怎么写
2015/01/21 职场文书
观后感开头
2015/06/19 职场文书
vue中div禁止点击事件的实现
2022/04/02 Vue.js
MySQL约束(创建表时的各种条件说明)
2022/06/21 MySQL