各浏览器对document.getElementById等方法的实现差异解析


Posted in Javascript onDecember 05, 2013

所有Web前端同仁对 document.getElementById 都非常熟悉了。开发过程中经常需要用其获取页面id为xx的元素,自从元老级JS库Prototype流行后,都喜欢这么简写它

// 方式1 
function $(id){ return document.getElementById(id); }

有没有人想过为什么要这么写,而不用下面的方式写呢?
// 方式2 
var $ = document.getElementById;

这么写的$更简洁啊,也很明了,将document的方法getElementById赋值给变量$,用$去获取页面id为xx的元素。实际上方式2在IE6/7/8中是可行的(IE9中有些变动),Firefox/Safari/Chrome/Opera则行不通。还请自行测试。

为什么Firefox/Safari/Chrome/Opera 方式2获取就不行呢,原因是这些浏览器中getElementById方法内部实现中需依赖this(document),IE则不需要this。或者说方式2在Firefox/Safari/Chrome/Opera中调用时说丢失了this,以下是个简单示例

// 定义一个函数show 
function show(){alert(this.name);} // 定义一个p对象,有name属性 
var p = {name:'Jack'}; 
show.call(p); // -> 'Jack' 
show(); // -> '' 
show.call(null); // -> ''<BR>

可以看到show的实现中依赖this(简单说方法体中使用了this),因此调用时的环境(执行上下文)如果没有name属性,则得不到期望的结果。
换句话说,IE6/7/8实现document.getElementById时没有用到this,而 IE9/Firefox/Safari/Chrome/Opera 需要用到this,这里的this正是document对象。直接调用方式2时内部的 this却是window对象,所以造成方式2在 Firefox/Safari/Chrome/Opera 不能根据id来正常获取元素。

如果将document.getElementById的 执行环境换成了document而非window,则可以正常的使用$了。如下

// 修复document.getElementById 
document.getElementById = (function(fn){ 
    return function(){  
        return fn.apply(document,arguments); 
    }; 
})(document.getElementById); // 修复后赋值给$,$可正常使用了 
var $ = document.getElementById;

再次,ECMAScript5 中为function新增的 bind 方法可以实现同样的效果
// 方式3 
var $ = document.getElementById.bind(document);

但目前方式3只有IE9/Firefox/Chrome/支持。

分析了getElementById的情况,下面的一些方法在各浏览器中的差异原因就很好明白了

var prinf = document.write; 
prinf('<h3>Test prinf</h3>'); // IE6/7/8可运行,其它浏览器报错 var prinfln = document.writeln; 
prinfln('<h3>Test prinfln</h3>'); // IE6/7/8可运行,其它浏览器报错 
var reload = location.reload; 
reload(); // IE6/7/8可运行,其它浏览器报错 
var go = history.go;  
go(-2); // IE6/7/8可运行,其它浏览器报错
Javascript 相关文章推荐
Jquery Autocomplete 结合asp.net使用要点
Oct 29 Javascript
js循环改变div颜色具体方法
Jun 25 Javascript
使用js实现雪花飘落效果
Aug 26 Javascript
jquery中对于批量deferred的处理方法
Jan 22 Javascript
jquery制作select列表双向选择示例代码
Sep 02 Javascript
JS中的hasOwnProperty()、propertyIsEnumerable()和isPrototypeOf()
Aug 11 Javascript
利用jquery实现实时更新歌词的方法
Jan 06 Javascript
如何解决vue与传统jquery插件冲突
Mar 20 Javascript
微信小程序显示下拉列表功能【附源码下载】
Dec 12 Javascript
Angular数据绑定机制原理
Apr 17 Javascript
详解如何用webpack4从零开始构建react开发环境
Jan 27 Javascript
vue脚手架项目创建步骤详解
Mar 02 Vue.js
给事件响应函数传参数的四种方式小结
Dec 05 #Javascript
弹出最简单的模式化遮罩层的js代码
Dec 04 #Javascript
js如何设置在iframe框架中指定div不显示
Dec 04 #Javascript
jquery动态改变onclick属性导致失效的问题解决方法
Dec 04 #Javascript
javascript设置金额样式转换保留两位小数示例代码
Dec 04 #Javascript
下拉列表select 由左边框移动到右边示例
Dec 04 #Javascript
JS获得QQ号码的昵称,头像,生日的简单实例
Dec 04 #Javascript
You might like
php 判断访客是否为搜索引擎蜘蛛的函数代码
2011/07/29 PHP
一张表搞清楚php is_null、empty、isset的区别
2015/07/07 PHP
php封装好的人民币数值转中文大写类
2015/12/20 PHP
PHP两个n位的二进制整数相加问题的解决
2018/08/26 PHP
解决windows上php xdebug 无法调试的问题
2020/02/19 PHP
基于PHP实现短信验证码发送次数限制
2020/07/11 PHP
基于jquery的3d效果实现代码
2011/03/23 Javascript
javascript针对DOM的应用分析(二)
2012/04/15 Javascript
window.location.href中url中数据量太大时的解决方法
2013/12/23 Javascript
JQuery对表格进行操作的常用技巧总结
2014/04/23 Javascript
动态加载iframe时get请求传递中文参数乱码解决方法
2014/05/07 Javascript
DOM操作一些常用的属性汇总
2015/03/13 Javascript
JS实现向表格中动态添加行的方法
2015/03/30 Javascript
jQuery on()方法绑定动态元素的点击事件无响应的解决办法
2016/07/07 Javascript
值得分享和收藏的xmlplus组件学习教程
2017/05/05 Javascript
带你了解session和cookie作用原理区别和用法
2017/08/14 Javascript
详解webpack的配置文件entry与output
2017/08/21 Javascript
javascript 面向对象实战思想分享
2017/09/07 Javascript
[01:04:31]DOTA2-DPC中国联赛定级赛 iG vs Magma BO3第二场 1月8日
2021/03/11 DOTA
Python装饰器用法实例总结
2018/05/26 Python
浅谈Pandas 排序之后索引的问题
2018/06/07 Python
浅谈Python基础—判断和循环
2019/03/22 Python
Pandas时间序列重采样(resample)方法中closed、label的作用详解
2019/12/10 Python
Python 创建TCP服务器的方法
2020/07/28 Python
Python 代码调试技巧示例代码
2020/08/11 Python
使用canvas生成含有微信头像的邀请海报没有微信头像问题
2019/10/29 HTML / CSS
哈萨克斯坦移动和数字技术在线商店:SatelOnline.kz
2020/09/04 全球购物
请写一个C函数,若处理器是Big_endian的,则返回0;若是Little_endian的,则返回1
2015/07/16 面试题
美术毕业生求职信
2014/02/25 职场文书
英语演讲稿3分钟
2014/04/29 职场文书
环境工程专业自荐信范文
2014/06/24 职场文书
公司离职证明范本(5篇)
2014/09/17 职场文书
幼儿园教师师德表现自我评价
2015/03/05 职场文书
2015社区个人工作总结范文
2015/05/13 职场文书
跑出一片天观后感
2015/06/08 职场文书
美德少年事迹材料(2016推荐版)
2016/02/25 职场文书