`
zhouyrt
  • 浏览: 1180916 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

阅读更多

所有的Web前端同仁对 document.getElementById 都非常熟悉了。

开发过程中经常需要用其获取页面id为xx的元素,自从元老级js库Prototype流行后,都喜欢这么简写它

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

 

有没有人想过为什么要这么写,而不用下面的方式写呢?

// 方式2
var $ = document.getElementById;

这么写的$更简洁啊,也很明了,将document的方法getElementById赋值给变量$,用$去获取页面id为xx的元素。

实际上方式2在IE中是可行的(暂且这么说,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属性,则得不到期望的结果。
换句话说,IE引擎实现document.getElementById时没有用到this,而非IE浏览器 (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;
 
上面说到IE9有些变动。的确,IE9的情形和Firefox/Safari/Chrome/Opera是一样的,使用方式2将获取不了元素。

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

 目前方式3只在IE9和Chrome中支持。(测试用的是IE9 pre4和Chrome7.0.503.0 dev)

分析了document.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可运行,其它浏览器报错

 
 

 

4
1
分享到:
评论
1 楼 L--A--N--G 2010-09-28  
牛。拜读了

相关推荐

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

    在Web前端开发中,了解不同浏览器对JavaScript API的实现差异是非常重要的。本文主要讨论的是`document.getElementById`这个常用方法在不同浏览器之间的实现区别,以及如何处理这些差异。 `document.getElementById...

    浅谈vue中document.getElementById()拿到的是原值的问题

    总的来说,本篇内容针对在Vue中使用`document.getElementById()`时遇到的问题提供了深入的分析和具体的解决方案,帮助开发者更好地理解Vue的工作原理以及如何在Vue项目中合理使用原生JavaScript DOM操作方法。...

    document.getElementById方法在Firefox与IE中的区别

    `document.getElementById`是一个常见的DOM操作方法,用于根据指定的ID获取HTML元素,但在不同的浏览器中,其行为可能略有差异。本文将详细讨论`document.getElementById`在Firefox和IE中的不同之处。 首先,`...

    javascript代码在ie8里报错 document.getElementById(...) 为空或不是对象的解决方法 <font color=red>原创</font>

    IE8中JavaScript报错document.getElementById(...)为空或不是对象的解决方法知识点: 1. 针对IE8浏览器的兼容性问题,主要是由于IE8对文档类型的声明(DTD)变得更为严格。这导致在不正确的文档类型声明下,...

    JavaScript 中document.URL 和 [removed].href 的区别

    在探讨JavaScript中`document.URL`与`window.location.href`之间的差异之前,我们首先需要了解`document`和`window`这两个核心对象的基本概念及其作用。这不仅有助于理解它们各自属性的具体含义,还能帮助开发者在...

    document.getElementById介绍

    在本文中,我们将深入探讨 `document.getElementById` 的工作原理,以及在不同浏览器环境下可能出现的行为差异。 首先,`document.getElementById` 返回的是一个对 HTML 元素的引用,这个引用可以用来操作对应的 ...

    document.getElementsByName和document.getElementById 在IE与FF中不同实现

    本文将探讨`document.getElementsByName`和`document.getElementById`这两个DOM操作方法在Internet Explorer(IE)与Firefox(FF)中的不同实现,以及这对开发者的影响。 `document.getElementsByName`这个方法是...

    事件模型在各浏览器中存在差异

    但各个浏览器对某些特定事件属性或方法的支持可能存在差异。例如,`event.preventDefault()`在某些早期浏览器中可能不完全符合标准,或者某些自定义事件的属性和方法可能只有部分浏览器支持。 因此,了解和掌握不同...

    document.all与getElementById、getElementsByName、getElementsByTagName用法区别-getElementById

    在Firefox、Chrome、Safari等现代浏览器以及IE9及以上版本中,`getElementById()` 都能正确地根据ID查找元素。然而,如描述中提到的,IE(尤其是早期版本)在处理`getElementById()`时,如果找不到匹配ID的元素,它...

    浏览器中JS的兼容问题.docx

    JavaScript在不同浏览器中的兼容性问题一直是开发者面临的重要挑战,尤其是Internet Explorer (IE) 和 Firefox (FF) 这两个浏览器之间的差异。以下是一些关键的兼容性问题和解决方案: 1. **对象问题** - **Form...

    浏览器兼容页面开发注意事项(javascript篇)_101028参考.pdf

    在旧版IE中,可以使用`document.form.item(name)`来访问表单元素,但在其他浏览器如Firefox、Chrome等,推荐使用`document.forms[formName].elements[name]`或者`document.getElementById(formId).elements[name]...

    Firefox浏览器兼容JS脚本

    在处理CSS样式时,不同浏览器对某些CSS属性的支持也存在差异。例如,“cursor: hand;”在IE中表示鼠标指针为手形,但在Firefox中却不被识别。此时,可以改为使用“cursor: pointer;”。 ##### 7. 子元素访问差异 ...

    浏览器兼容总结.txt

    例如,在引用框架中的内容时,IE 支持`window.frameId`、`window.frameName`、`frame.frameId`和`frameName`等方法,而 Firefox 仅支持`window.frameName`和`frame`。此外,在获取框架元素时,两种浏览器都支持`...

    浏览器兼容性汇总借鉴.pdf

    例如,`document.getElementById()`在所有浏览器中都可用,但`document.all`是IE特有的,而其他浏览器可能需要使用`document.querySelector()`或`document.getElementsByTagName()`。 3. **const声明问题**:`const...

    js中各浏览器中鼠标按键值的差异.docx

    ### JavaScript 中各浏览器鼠标按键值差异详解 #### 一、引言 在Web开发中,处理用户交互是一项基本而重要的任务。其中,鼠标事件是非常常见的一类交互方式。不同的浏览器对于鼠标事件的处理存在一定的差异性,...

    Document和Document.all区别分析

    例如,通过 `document.getElementById` 或 `document.querySelector` 方法,我们可以找到文档中具有特定ID或满足CSS选择器的元素。 然而,`Document.all` 是一个过时的属性,它返回一个HTMLAllCollection对象,这个...

    Document.body.scrollTop的值总为零的快速解决办法

    在JavaScript中,`document.body.scrollTop` 是一个常用于获取网页滚动条顶部到页面内容顶部的距离的属性。然而,有时候你会发现这个属性的值始终为零,即使页面已经进行了滚动。这通常与文档类型声明(DOCTYPE)...

    js浏览器兼容手册OSOS.pdf

    JavaScript是Web开发中不可或缺的一部分,但在不同的浏览器之间,其实现可能存在差异,这导致了兼容性问题。本手册主要关注JavaScript在Internet Explorer(IE)和Firefox(FF)中的兼容性问题及解决方案。 1. `...

    浏览器中JS的兼容问题

    然而,由于不同浏览器对JS的支持程度和解析方式存在差异,开发者在实际项目中经常会遇到兼容性问题。本文将详细探讨在Internet Explorer(IE)和Mozilla Firefox(FF)两大主流浏览器中常见的JS兼容问题及其解决方案...

Global site tag (gtag.js) - Google Analytics