所有的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将获取不了元素。
// 方式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可运行,其它浏览器报错
分享到:
相关推荐
在Web前端开发中,了解不同浏览器对JavaScript API的实现差异是非常重要的。本文主要讨论的是`document.getElementById`这个常用方法在不同浏览器之间的实现区别,以及如何处理这些差异。 `document.getElementById...
总的来说,本篇内容针对在Vue中使用`document.getElementById()`时遇到的问题提供了深入的分析和具体的解决方案,帮助开发者更好地理解Vue的工作原理以及如何在Vue项目中合理使用原生JavaScript 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`这个方法是...
但各个浏览器对某些特定事件属性或方法的支持可能存在差异。例如,`event.preventDefault()`在某些早期浏览器中可能不完全符合标准,或者某些自定义事件的属性和方法可能只有部分浏览器支持。 因此,了解和掌握不同...
在Firefox、Chrome、Safari等现代浏览器以及IE9及以上版本中,`getElementById()` 都能正确地根据ID查找元素。然而,如描述中提到的,IE(尤其是早期版本)在处理`getElementById()`时,如果找不到匹配ID的元素,它...
JavaScript在不同浏览器中的兼容性问题一直是开发者面临的重要挑战,尤其是Internet Explorer (IE) 和 Firefox (FF) 这两个浏览器之间的差异。以下是一些关键的兼容性问题和解决方案: 1. **对象问题** - **Form...
在旧版IE中,可以使用`document.form.item(name)`来访问表单元素,但在其他浏览器如Firefox、Chrome等,推荐使用`document.forms[formName].elements[name]`或者`document.getElementById(formId).elements[name]...
在处理CSS样式时,不同浏览器对某些CSS属性的支持也存在差异。例如,“cursor: hand;”在IE中表示鼠标指针为手形,但在Firefox中却不被识别。此时,可以改为使用“cursor: pointer;”。 ##### 7. 子元素访问差异 ...
例如,在引用框架中的内容时,IE 支持`window.frameId`、`window.frameName`、`frame.frameId`和`frameName`等方法,而 Firefox 仅支持`window.frameName`和`frame`。此外,在获取框架元素时,两种浏览器都支持`...
例如,`document.getElementById()`在所有浏览器中都可用,但`document.all`是IE特有的,而其他浏览器可能需要使用`document.querySelector()`或`document.getElementsByTagName()`。 3. **const声明问题**:`const...
### JavaScript 中各浏览器鼠标按键值差异详解 #### 一、引言 在Web开发中,处理用户交互是一项基本而重要的任务。其中,鼠标事件是非常常见的一类交互方式。不同的浏览器对于鼠标事件的处理存在一定的差异性,...
例如,通过 `document.getElementById` 或 `document.querySelector` 方法,我们可以找到文档中具有特定ID或满足CSS选择器的元素。 然而,`Document.all` 是一个过时的属性,它返回一个HTMLAllCollection对象,这个...
在JavaScript中,`document.body.scrollTop` 是一个常用于获取网页滚动条顶部到页面内容顶部的距离的属性。然而,有时候你会发现这个属性的值始终为零,即使页面已经进行了滚动。这通常与文档类型声明(DOCTYPE)...
JavaScript是Web开发中不可或缺的一部分,但在不同的浏览器之间,其实现可能存在差异,这导致了兼容性问题。本手册主要关注JavaScript在Internet Explorer(IE)和Firefox(FF)中的兼容性问题及解决方案。 1. `...
然而,由于不同浏览器对JS的支持程度和解析方式存在差异,开发者在实际项目中经常会遇到兼容性问题。本文将详细探讨在Internet Explorer(IE)和Mozilla Firefox(FF)两大主流浏览器中常见的JS兼容问题及其解决方案...