各浏览器对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 相关文章推荐
Convert Seconds To Hours
Jun 16 Javascript
关于IE、Firefox、Opera页面呈现异同 写脚本很痛苦
Aug 28 Javascript
jQuery控制图片的hover效果(smartRollover.js)
Mar 18 Javascript
JavaScript两种跨域技术全面介绍
Apr 16 Javascript
javascript实现playfair和hill密码算法
Dec 07 Javascript
纯Javascript实现ping功能的方法
Mar 20 Javascript
使用AngularJS来实现HTML页面嵌套的方法
Jun 17 Javascript
JavaScript数组方法大全(推荐)
Jul 05 Javascript
JS控件bootstrap suggest plugin使用方法详解
Mar 25 Javascript
Angularjs 动态添加指令并绑定事件的方法
Apr 13 Javascript
打字效果动画的4种实现方法(超简单)
Oct 18 Javascript
vue.js使用v-model实现父子组件间的双向通信示例
Feb 05 Javascript
给事件响应函数传参数的四种方式小结
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 编程请选择正确的文本编辑软件
2006/12/21 PHP
php做下载文件的实现代码及文件名中乱码解决方法
2011/02/03 PHP
关于PHP的curl开启问题探讨
2014/04/08 PHP
网站防止被刷票的一些思路与方法
2015/01/08 PHP
简单谈谈favicon
2015/06/10 PHP
PHP文件上传小程序 适合初学者学习!
2019/05/23 PHP
laravel框架中表单请求类型和CSRF防护实例分析
2019/11/23 PHP
PHP高并发和大流量解决方案整理
2021/03/09 PHP
Prototype 1.5.0_rc1 及 Prototype 1.5.0 Pre0小抄本
2006/09/22 Javascript
js split 的用法和定义 js split分割字符串成数组的实例代码
2012/05/13 Javascript
关于火狐(firefox)及ie下event获取的两种方法
2012/12/27 Javascript
用示例说明filter()与find()的用法以及children()与find()的区别分析
2013/04/26 Javascript
js和jquery中循环的退出和继续下一个循环
2014/09/03 Javascript
js获取时间并实现字符串和时间戳之间的转换
2015/01/05 Javascript
HTML5使用DeviceOrientation实现摇一摇功能
2015/06/05 Javascript
javascript实现标签切换代码示例
2016/05/22 Javascript
javascript获取select标签选中的值
2016/06/04 Javascript
JS字符串false转boolean的方法(推荐)
2017/03/08 Javascript
Vue响应式添加、修改数组和对象的值
2017/03/20 Javascript
Google 爬虫如何抓取 JavaScript 的内容
2017/04/07 Javascript
基于layui table返回的值的多级嵌套的解决方法
2019/09/19 Javascript
Python函数中定义参数的四种方式
2014/11/30 Python
一些常用的Python爬虫技巧汇总
2016/09/28 Python
Python 自动刷博客浏览量实例代码
2017/06/14 Python
python 列表,数组和矩阵sum的用法及区别介绍
2018/06/28 Python
Pycharm 实现下一个文件引用另外一个文件的方法
2019/01/17 Python
详解Python3序列赋值、序列解包
2019/05/14 Python
python PyAutoGUI 模拟鼠标键盘操作和截屏功能
2019/08/04 Python
基于PyQT实现区分左键双击和单击
2020/05/19 Python
Lookfantastic挪威官网:英国知名美妆购物网站
2017/07/26 全球购物
美国豪华的多品牌精品店:The Webster
2019/07/31 全球购物
考博专家推荐信模板
2013/12/02 职场文书
商场开业庆典策划方案
2014/06/02 职场文书
公司门卫岗位职责
2015/04/13 职场文书
学生会自荐信
2019/05/16 职场文书
浅谈如何写好演讲稿?
2019/06/12 职场文书