所有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); // -> ''

可以看到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可运行,其它浏览器报错

转自: http://www.cnblogs.com/snandy/archive/2011/03/24/1993380.html

转载于:https://www.cnblogs.com/likebeta/archive/2012/05/04/2483455.html

各浏览器对document.getElementById等方法的实现差异相关推荐

  1. document.getElementById 学习总结

    document.getElementById获取控件对象为空的解决方法 1.下面是一个简单的例子,页面加载时显示一段信息 代码如下: <%@ page language="java& ...

  2. uniapp真机 document.getElementById报错

    项目场景: 项目需要在扫描后自动跳转到scroll-view的底部. 问题描述 内置浏览器使用document.getElementById获取子组件高度没问题,但真机调试时无document对象. ...

  3. document.getElementById vs jQuery $()

    本文翻译自:document.getElementById vs jQuery $() Is this: 这是: var contents = document.getElementById('con ...

  4. document.write vs document.getElementById

    document.write: JavaScript中对document.open所开启的文档流(document stream操作的API方法,它能够直接在文档流中写入字符串,一旦文档流已经关闭,那 ...

  5. python回调类_python 回调函数和回调方法的实现分析

    回调与事件驱动 回调函数有比较重要的意义:它在是事件驱动的体现 我们试想一个场景,如果我们触发了某个事件,比如点击事件 那么只要给这个点击事件绑定一个或多个处理事件,也就是回调函数 我们就可以在点击事 ...

  6. javascript中document.getelementbyid缺少对象的问题原因

    下面这段代码浏览器端运行时会报错:缺少对象 原因是:在还未加载img对象前就试图通过它的id得到img对象. 从这个错误就可以看出Javascript和html的一些特性. 下面是报错的代码段 < ...

  7. document.getElementById

    var element = document.getElementById(id); 因为Id具有唯一性,所以这个方法用来查找页面中的某一个元素. 无Id元素的查找可以使用CSS选择器 querySe ...

  8. document.getElementById与document.getElementsById的区别

    document.getElementById 是用Id选择元素,一个Id只对应一个元素. document.getElementsById 是用元素名称选择元素一个元素名称可能有很多元素,取的是集, ...

  9. document.getElementById与getElementByName的区别

    document.getElementById( "id_Number ")   得到的是单个元素 document.getElementsByName( "name & ...

最新文章

  1. 上海交大计算机网络课件 翁惠玉 ppt,上海交通大学 计算机网络PPT3 翁惠玉.ppt
  2. require引入js vue_请教 关于使用require 引入vue 和公共js的问题
  3. 写一个Android输入法01——最简步骤
  4. 看懂这些代码,我哭着笑了
  5. html 两个idv上下居中,Django搭建个人博客:回到顶部浮动按钮、矢量图标、页脚沉底和粘性侧边栏...
  6. 伯克利与微软联合发布Blink:使GPU计算实现高达2倍加速
  7. cognos ibm 收购_IBM Cognos与Linux上的Sterling Selling and Fulfillment Suite集成
  8. 网上怎么下载ug软件ug怎样下载安装ug安装包免费领取
  9. 如何打开计算机控制面板,控制面板怎么打开 快速打开控制面板方法大全-电脑教程...
  10. Java调用热敏打印机
  11. 工具类 - 思维导图
  12. 《《《翻译》》》pointNet
  13. C语言校园家教管理系统
  14. termios程序范例
  15. 史上最硬核网页截图方案原理深度剖析
  16. 卡西欧计算机亮度,卡西欧怎么调3秒灯
  17. おひきは本当にいじめ彼女と呼ばれる
  18. python女生就业前景好的专业_人工智能专业适合女生学吗 好不好就业
  19. 整流桥的工作原理是什么?什么是全桥?什么是半桥?
  20. jacob使用异常解决

热门文章

  1. kubernetes log 流式数据处理
  2. BZOJ1086:[SCOI2005]王室联邦——题解
  3. xs_run加密还原
  4. Git版本服务器搭建(CentOS)--gitblit
  5. windows 下使用 Filezilla server 搭建 ftp 服务器
  6. windows环境下bat和python调用rysnc的方式
  7. lsof 查看进程打开那些文件 和 查看文件给那个进程使用
  8. 鑿婂瓙鏇版祴璇曡崏绋縶29C28FD771BA4B0D8693}
  9. 吉林大学数据结构(C++版)
  10. 大型网站演化发展历程之三