`

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

 
阅读更多

本文来自:http://www.cnblogs.com/snandy/archive/2011/03/24/1993380.html

 

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

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

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

1
2
// 方式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,以下是个简单示例

1
2
3
4
5
6
7
8
9
// 定义一个函数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,则可以正常的使用$了。如下

1
2
3
4
5
6
7
8
9
// 修复document.getElementById
document.getElementById = (function(fn){
    return function(){
        return fn.apply(document,arguments);
    };
})(document.getElementById);
 
// 修复后赋值给$,$可正常使用了
var $ = document.getElementById;


再次,ECMAScript5 中为function新增的 bind 方法可以实现同样的效果

1
2
// 方式3
var $ = document.getElementById.bind(document);

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

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

1
2
3
4
5
6
7
8
9
10
11
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可运行,其它浏览器报错

分享到:
评论

相关推荐

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

    本文主要讨论的是`document.getElementById`这个常用方法在不同浏览器之间的实现区别,以及如何处理这些差异。 `document.getElementById`是一个JavaScript内置方法,用于根据指定的ID从文档中获取元素。在大部分...

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

    在Vue框架下,开发者可能会遇到使用`document.getElementById()`方法时,获取到的是旧页面的DOM元素值的问题。这一现象通常发生在页面通过路由进行切换时,尽管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`这个方法是...

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

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

    浏览器兼容总结.txt

    尽管如此,为了保持代码的一致性和跨浏览器兼容性,推荐始终使用`document.getElementById("idName")`。 #### 三、常量声明 在常量声明方面,Firefox 支持`const`关键字用于定义常量,而IE则不支持`const`,只支持...

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

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

    Document和Document.all区别分析

    `Document` 对象提供了访问和操作页面内容的方法和属性,例如获取元素、创建新元素、处理事件等。例如,通过 `document.getElementById` 或 `document.querySelector` 方法,我们可以找到文档中具有特定ID或满足CSS...

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

    总结来说,`document.body.scrollTop`在某些情况下可能返回零,主要是由于DOCTYPE声明导致的浏览器渲染模式差异。通过使用兼容性的方法获取滚动位置,如上面的`getScrollTop`函数,可以确保代码在不同环境下的稳定...

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

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

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

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

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

    不同的浏览器可能对某些API、方法或特性有不同的实现,导致代码在某些环境下无法正常工作。以下是一些在处理浏览器兼容性时需要注意的关键点: 1. **document.form.item** 问题:在早期版本的IE中,可以通过`...

    js弹出层可拖动兼容各大浏览器.pdf

    【JavaScript 弹出层实现与浏览器兼容性】 在网页开发中,JavaScript 弹出层(通常称为对话框或模态窗口)是一种常见的交互设计元素,用于显示临时信息、用户确认或进行复杂操作。本文将详细讲解如何创建一个可拖动...

    再谈ie和firefox下的document.all属性

    随着浏览器标准的统一和DOM操作接口的发展,推荐使用`document.getElementById`,`document.getElementsByTagName`等更标准的方法来获取和操作DOM元素。这样不仅提高了代码的可移植性,也更利于维护和性能优化。对于...

    前段JS开发和DOM兼容问题大全

    标准的访问方式是使用`document.getElementById`、`document.getElementsByName`和`document.getElementsByTagName`等方法。例如,使用`document.getElementById('id')`来替代`document.all.id`。 2. 集合类对象...

    javascript 获取iframe里页面中元素值的方法

    下面介绍两种主要方法,分别适用于Internet Explorer(IE)和非IE浏览器(如Firefox、Chrome等): 1. **IE方法**: IE浏览器提供了一个特殊的`frames`对象,它允许我们直接通过`iframe`的ID来访问`iframe`内的`...

Global site tag (gtag.js) - Google Analytics