一行代码告别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 相关文章推荐
比较简单的一个符合web标准的JS调用flash方法
Nov 29 Javascript
Javascript 命名空间模式
Nov 01 Javascript
JS中数组Array的用法示例介绍
Feb 20 Javascript
jQuery插件简单实现方法
Jul 18 Javascript
基于BootStrap Metronic开发框架经验小结【七】数据的导入、导出及附件的查看处理
May 12 Javascript
微信小程序 Record API详解及实例代码
Sep 30 Javascript
简单实现IONIC购物车功能
Jan 10 Javascript
基于JS实现二维码图片固定在右下角某处并跟随滚动条滚动
Feb 08 Javascript
Angularjs为ng-click事件传递参数
Jun 15 Javascript
Vue开发之封装分页组件与使用示例
Apr 25 Javascript
vue 动态表单开发方法案例详解
Dec 02 Javascript
vue 解决setTimeOut和setInterval函数无效报错的问题
Jul 30 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 skymvc 一款轻量、简单的php
2011/06/28 PHP
php教程 插件机制在PHP中实现方案
2012/11/02 PHP
使用gd库实现php服务端图片裁剪和生成缩略图功能分享
2013/12/25 PHP
php比较两个绝对时间的大小
2014/01/31 PHP
PHP中Session引起的脚本阻塞问题解决办法
2014/04/08 PHP
php生成静态html页面的方法(2种方法)
2015/09/14 PHP
laravel5.6 框架操作数据 Eloquent ORM用法示例
2020/01/26 PHP
js 新浪的一个图片播放图片轮换效果代码
2008/07/15 Javascript
关于UTF-8的客户端用AJAX方式获取GB2312的服务器端乱码问题的解决办法
2010/11/30 Javascript
jqPlot 基于jquery的画图插件
2011/04/26 Javascript
javascript的函数作用域
2014/11/12 Javascript
jQuery中slideUp()方法用法分析
2014/12/24 Javascript
jQuery实现仿淘宝带有指示条的图片转动切换效果完整实例
2015/03/04 Javascript
实例讲解jquery中mouseleave和mouseout的区别
2016/02/17 Javascript
JavaScript_object基础入门(必看篇)
2016/06/13 Javascript
基于Javascript实现文件实时加载进度的方法
2016/10/12 Javascript
浅谈jquery采用attr修改form表单enctype不起作用的问题
2016/11/25 Javascript
详解创建自定义的Angular Schematics
2018/06/06 Javascript
VUE 3D轮播图封装实现方法
2018/07/03 Javascript
jQuery zTree插件快速实现目录树
2019/08/16 jQuery
详解如何在Vue项目中发送jsonp请求
2019/10/25 Javascript
vue 动态添加的路由页面刷新时失效的原因及解决方案
2021/02/26 Vue.js
详解python进行mp3格式判断
2016/12/23 Python
python pandas dataframe 行列选择,切片操作方法
2018/04/10 Python
Django文件存储 默认存储系统解析
2019/08/02 Python
Python 处理文件的几种方式
2019/08/23 Python
修改Pandas的行或列的名字(重命名)
2019/12/18 Python
基于Tensorflow读取MNIST数据集时网络超时的解决方式
2020/06/22 Python
通过Python实现Payload分离免杀过程详解
2020/07/13 Python
pycharm永久激活超详细教程
2020/10/29 Python
详解HTML5中ol标签的用法
2015/09/08 HTML / CSS
原装进口全世界:天猫国际
2016/08/03 全球购物
Everlast官网:拳击、综合格斗和健身相关的体育用品
2020/08/03 全球购物
亿阳信通股份有限公司笔试题(C#)
2016/03/04 面试题
中专生的个人自我评价
2013/12/11 职场文书
爱心募捐通知范文
2015/04/27 职场文书