一行代码告别document.getElementById

 更新时间:2012年06月01日 23:04:33   作者:  
很久以前做网页的时候,几乎没有听说过 getElementById 这一玩意儿。在那个ie独占天下的年代里,做的页面也几乎都是ie only的。只要ie没问题,那就OK了
所以绝大多数的脚本里,都是直接通过元素的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实现shuffle数组洗牌操作示例

    JavaScript实现shuffle数组洗牌操作示例

    这篇文章主要介绍了JavaScript实现shuffle数组洗牌操作,结合实例形式分析了javascript数组的定义、构造、排序等相关操作技巧,需要的朋友可以参考下
    2019-01-01
  • js实现以最简单的方式将数组元素添加到对象中的方法

    js实现以最简单的方式将数组元素添加到对象中的方法

    下面小编就为大家分享一篇js实现以最简单的方式将数组元素添加到对象中的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • 用JavaScript 判断用户使用的是 IE6 还是 IE7

    用JavaScript 判断用户使用的是 IE6 还是 IE7

    判断IE浏览器的脚本,方便根据浏览器不懂,支持不同的代码的分别调用。
    2008-01-01
  • Web前端开发工具——bower依赖包管理工具

    Web前端开发工具——bower依赖包管理工具

    Bower 是 twitter 推出的一款包管理工具,基于nodejs的模块化思想,把功能分散到各个模块中,让模块和模块之间存在联系,通过 Bower 来管理模块间的这种联系,本文给大家介绍bower依赖包管理工具,感兴趣的朋友一起学习
    2016-03-03
  • JS随拖拽速度设置倾斜角度的实现代码

    JS随拖拽速度设置倾斜角度的实现代码

    这篇文章主要给大家介绍了JS如何随拖拽速度设置倾斜角度,文中有详细的代码讲解,对大家的学习或工作有一定的帮助,感兴趣的小伙伴可以自己动手尝试一下
    2023-09-09
  • js select下拉联动 更具级联性!

    js select下拉联动 更具级联性!

    这篇文章主要为大家详细介绍了js select下拉联动的相关资料,更具级联性!文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01
  • js中Array对象的常用遍历方法详解

    js中Array对象的常用遍历方法详解

    今天小编就为大家分享一篇关于js中Array对象的常用遍历方法详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • layUI实现前端分页和后端分页

    layUI实现前端分页和后端分页

    这篇文章主要为大家详细介绍了layUI实现前端分页和后端分页,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-07-07
  • 浅谈JavaScript超时调用和间歇调用

    浅谈JavaScript超时调用和间歇调用

    JavaScript是单线程语言,但它允许通过设置超时值和间歇时间值来调度代码在特定的时刻执行。前者是在指定的时间过后执行代码,而后者则是每隔指定的时间就执行一次代码。
    2015-08-08
  • JS中不为人知的五种声明Number的方式简要概述

    JS中不为人知的五种声明Number的方式简要概述

    声明一个数值类型的变量我看到三种;我嘴角微微一笑:少年你还嫩了点,哪止三种,我知道的至少有五种,好奇的你可以参考下哈,希望本文可以帮助到你
    2013-02-02

最新评论