一行代码告别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具有类似Lambda表达式编程能力的代码(改进版)
Sep 14 Javascript
JS获取后台Cookies值的小例子
Mar 04 Javascript
JavaScript中判断对象类型的几种方法总结
Nov 11 Javascript
jquery实现图片灯箱明暗的遮罩效果
Nov 15 Javascript
使用jquery prev()方法找到同级的前一个元素
Jul 11 Javascript
IE下支持文本框和密码框placeholder效果的JQuery插件分享
Jan 31 Javascript
JavaScript中的getTime()方法使用详解
Jun 10 Javascript
关于获取DIV内部内容报错的原因分析及解决办法
Jan 29 Javascript
讲解vue-router之什么是动态路由
May 28 Javascript
angular4 获取wifi列表中文显示乱码问题的解决
Oct 20 Javascript
JavaScript常用工具方法封装
Feb 12 Javascript
vue 实现v-for循环回来的数据动态绑定id
Nov 07 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脚本的10个技巧(4)
2006/10/09 PHP
ThinkPHP 防止表单重复提交的方法
2011/08/08 PHP
php实现多张图片上传加水印技巧
2013/04/18 PHP
php微信浏览器分享设置以及回调详解
2016/08/01 PHP
JavaScript判断访问的来源是手机还是电脑,用的哪种浏览器
2013/12/12 Javascript
document.forms[].submit()使用介绍
2014/02/19 Javascript
javascript笛卡尔积算法实现方法
2015/04/08 Javascript
比例尺、缩略图、平移缩放之百度地图添加控件方法
2015/08/03 Javascript
实例详解jQuery结合GridView控件的使用方法
2016/01/04 Javascript
浅谈Node.js:理解stream
2016/12/08 Javascript
js实现的xml对象转json功能示例
2016/12/24 Javascript
JavaScript实现瀑布流以及加载效果
2017/02/11 Javascript
JavaScript使用Ajax上传文件的示例代码
2017/08/10 Javascript
[07:01]DOTA2-DPC中国联赛正赛 Aster vs Magma 3月5日 赛后选手采访
2021/03/11 DOTA
python 爬取微信文章
2016/01/30 Python
Python爬取APP下载链接的实现方法
2016/09/30 Python
详解python上传文件和字符到PHP服务器
2017/11/24 Python
Python实现字符串匹配算法代码示例
2017/12/05 Python
Python使用try except处理程序异常的三种常用方法分析
2018/09/05 Python
PySide2出现“ImportError: DLL load failed: 找不到指定的模块”的问题及解决方法
2020/06/10 Python
keras绘制acc和loss曲线图实例
2020/06/15 Python
html5实现微信打飞机游戏
2014/03/27 HTML / CSS
HTML5 Canvas+JS控制电脑或手机上的摄像头实例
2014/05/03 HTML / CSS
复古斯堪的纳维亚儿童服装:Baby go Retro
2017/09/09 全球购物
劳力士官方珠宝商:J.R. Dunn Jewelers
2018/09/29 全球购物
美国演唱会和体育门票购买网站:Ticketnetwork
2018/10/19 全球购物
亚洲颇具影响力的男性在线购物零售商:His
2019/11/24 全球购物
计算机网络专业个人的自我评价
2013/10/17 职场文书
技术总监个人的自我评价范文
2013/12/18 职场文书
拖鞋店创业计划书
2014/01/15 职场文书
2014年关工委工作总结
2014/11/17 职场文书
2016年“11.11”光棍节活动总结
2016/04/05 职场文书
2019通用版劳动合同范本!
2019/07/11 职场文书
css3实现背景图片颜色修改的多种方式
2021/04/13 HTML / CSS
pytorch 如何使用amp进行混合精度训练
2021/05/24 Python
Python语言内置数据类型
2022/02/24 Python