本文来自:http://www.cnblogs.com/snandy/archive/2011/03/24/1993380.html
所有Web前端同仁对 document.getElementById 都非常熟悉了。开发过程中经常需要用其获取页面id为xx的元素,自从元老级JS库Prototype流行后,都喜欢这么简写它
1
2
|
function $(id){ return document.getElementById(id); }
|
有没有人想过为什么要这么写,而不用下面的方式写呢?
1
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
|
function show(){alert( this .name);}
var p = {name: 'Jack' };
show.call(p);
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,则可以正常的使用$了。如下
1
2
3
4
5
6
7
8
9
|
document.getElementById = ( function (fn){
return function (){
return fn.apply(document,arguments);
};
})(document.getElementById);
var $ = document.getElementById;
|
再次,ECMAScript5 中为function新增的 bind 方法可以实现同样的效果
1
2
|
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>' );
var prinfln = document.writeln;
prinfln( '<h3>Test prinfln</h3>' );
var reload = location.reload;
reload();
var go = history.go;
go(-2);
|
分享到:
相关推荐
本文主要讨论的是`document.getElementById`这个常用方法在不同浏览器之间的实现区别,以及如何处理这些差异。 `document.getElementById`是一个JavaScript内置方法,用于根据指定的ID从文档中获取元素。在大部分...
在Vue框架下,开发者可能会遇到使用`document.getElementById()`方法时,获取到的是旧页面的DOM元素值的问题。这一现象通常发生在页面通过路由进行切换时,尽管DOM结构已经发生了变化,但是通过该方法仍然获取到了...
`document.getElementById`是一个常见的DOM操作方法,用于根据指定的ID获取HTML元素,但在不同的浏览器中,其行为可能略有差异。本文将详细讨论`document.getElementById`在Firefox和IE中的不同之处。 首先,`...
IE8中JavaScript报错document.getElementById(...)为空或不是对象的解决方法知识点: 1. 针对IE8浏览器的兼容性问题,主要是由于IE8对文档类型的声明(DTD)变得更为严格。这导致在不正确的文档类型声明下,...
在探讨JavaScript中`document.URL`与`window.location.href`之间的差异之前,我们首先需要了解`document`和`window`这两个核心对象的基本概念及其作用。这不仅有助于理解它们各自属性的具体含义,还能帮助开发者在...
在本文中,我们将深入探讨 `document.getElementById` 的工作原理,以及在不同浏览器环境下可能出现的行为差异。 首先,`document.getElementById` 返回的是一个对 HTML 元素的引用,这个引用可以用来操作对应的 ...
本文将探讨`document.getElementsByName`和`document.getElementById`这两个DOM操作方法在Internet Explorer(IE)与Firefox(FF)中的不同实现,以及这对开发者的影响。 `document.getElementsByName`这个方法是...
在Firefox、Chrome、Safari等现代浏览器以及IE9及以上版本中,`getElementById()` 都能正确地根据ID查找元素。然而,如描述中提到的,IE(尤其是早期版本)在处理`getElementById()`时,如果找不到匹配ID的元素,它...
尽管如此,为了保持代码的一致性和跨浏览器兼容性,推荐始终使用`document.getElementById("idName")`。 #### 三、常量声明 在常量声明方面,Firefox 支持`const`关键字用于定义常量,而IE则不支持`const`,只支持...
但各个浏览器对某些特定事件属性或方法的支持可能存在差异。例如,`event.preventDefault()`在某些早期浏览器中可能不完全符合标准,或者某些自定义事件的属性和方法可能只有部分浏览器支持。 因此,了解和掌握不同...
`Document` 对象提供了访问和操作页面内容的方法和属性,例如获取元素、创建新元素、处理事件等。例如,通过 `document.getElementById` 或 `document.querySelector` 方法,我们可以找到文档中具有特定ID或满足CSS...
总结来说,`document.body.scrollTop`在某些情况下可能返回零,主要是由于DOCTYPE声明导致的浏览器渲染模式差异。通过使用兼容性的方法获取滚动位置,如上面的`getScrollTop`函数,可以确保代码在不同环境下的稳定...
在旧版IE中,可以使用`document.form.item(name)`来访问表单元素,但在其他浏览器如Firefox、Chrome等,推荐使用`document.forms[formName].elements[name]`或者`document.getElementById(formId).elements[name]...
JavaScript在不同浏览器中的兼容性问题一直是开发者面临的重要挑战,尤其是Internet Explorer (IE) 和 Firefox (FF) 这两个浏览器之间的差异。以下是一些关键的兼容性问题和解决方案: 1. **对象问题** - **Form...
不同的浏览器可能对某些API、方法或特性有不同的实现,导致代码在某些环境下无法正常工作。以下是一些在处理浏览器兼容性时需要注意的关键点: 1. **document.form.item** 问题:在早期版本的IE中,可以通过`...
【JavaScript 弹出层实现与浏览器兼容性】 在网页开发中,JavaScript 弹出层(通常称为对话框或模态窗口)是一种常见的交互设计元素,用于显示临时信息、用户确认或进行复杂操作。本文将详细讲解如何创建一个可拖动...
随着浏览器标准的统一和DOM操作接口的发展,推荐使用`document.getElementById`,`document.getElementsByTagName`等更标准的方法来获取和操作DOM元素。这样不仅提高了代码的可移植性,也更利于维护和性能优化。对于...
标准的访问方式是使用`document.getElementById`、`document.getElementsByName`和`document.getElementsByTagName`等方法。例如,使用`document.getElementById('id')`来替代`document.all.id`。 2. 集合类对象...
下面介绍两种主要方法,分别适用于Internet Explorer(IE)和非IE浏览器(如Firefox、Chrome等): 1. **IE方法**: IE浏览器提供了一个特殊的`frames`对象,它允许我们直接通过`iframe`的ID来访问`iframe`内的`...