判断JavaScript对象是否可用的正确方法

原文:http://www.quirksmode.org/js/support.html

原文作者:Peter-Paul Koch

以下为对原文的翻译:

判断对象存在的方法

很快你就会注意到,JavaScript的部分功能在部分浏览器中无效。如果你要使用一些脚本的高级特性,你首先要检查浏览器是否支持要使用的对象,本文具体说明判断的正确方法。

通过判断浏览器的版本:不!

如果你想知道浏览器是否 支持代码中使用的那些对象,记住,永远都不要通过浏览器的版本来判断。我确定你知道,有些浏览器支持你的代码,而有些浏览器不支持你的代码,可是你考虑过其他的浏览器么?那些不知名的小浏览器 ?

就算你可以检测出90%的用户所使用的浏览器及版本,还是有一些不出名的浏览器不能正确运 行你的代码,结果要么是一大堆异常信息,要么是某些脚本没有被正确的执行。不管是哪种情况,你都 是在使用漏洞百出的代码欺骗最终浏览网站的用户。

个案研究:mouseovers

一个古老的 个案可以证实上述的说法。虽然这种情况现在已经不存在,但是同样原理的例子还是存在的。

一 个公认的事实就是IE 3不支持document.images这个数组,但这个数组对mouseover脚本又是极为重要。 所以我们就应该禁止mouseover脚本在IE 3浏览器中执行。解决方案之一就是对浏览器进行判断,当判断 出用户使用的浏览器是IE 3的时候,就不执行这个函数。

但是,在大多数操作系统中,Netscape 2浏览器同样不支持document.images数组。如果你仅仅判断浏览器是不是IE 3,那么使用Netscape 2的 用户就会看到一大堆异常信息。

那为什么不连同Netscape 2一起检测呢?因为就算这样做也是无 事于补。

运行在OS/2上的Netscape 2是和Netscape 3完全兼容的,而且可以很好的处理 mouseover效果。尽管如此,大家为什么还会经常看不到这个效果呢?因为web开发者使用了浏览器检测 的手段,在 mouseover脚本中屏蔽了Netscape 2浏览器。因此开发者们,在没有充足理由的情况下,剥 夺了用户拥有良好互动体验的权利。合适的对象检测方法可以避免这种情况的发生。

最后,越来 越多的浏览器允许用户把浏览器的认证字符串修改为自己喜欢的内容,这样就存在很大的可能性,检测 不出用户真实使用的浏览器以及版本,自然就不能保证无故障的运行代码了。由此,web开发者再次剥夺 了用户额外互动效果的权利。更糟的是,这样的代码通常写的很烂。

既然浏览器的版本不可靠, 那么是否JavaScript的版本更加可信一些呢?

通过判断JavaScript的版本:不!

在最初 规划的时候,Netscape完全意识到未来的浏览器会支持比现在多得多的对象,而web开发者必须能够把新 老浏览器区分开来。

起初的计划是让开发者对浏览器的版本进行判断。比如某某浏览器只能支持 JavaScript 1.x等。在script标签中增加version属性,这样如果浏览器不支持相应版本的JavaScript, 自然就不会执行这段脚本。

但是,当Microsoft涉足浏览器市场后,这个想法就无法进行下去了 。尽管早在Netscape 4和IE 4的时候就都支持JavaScript 1.2,可是就算再有想象力的人也不会相信他 们支持的是相同的JavaScript 1.2。因为这个版本号已经过时了,而且肯定和对象检测不相干。

所以不要使用JavaScript的版本号来做什么,他们没什么实际的作用。

正确的方法:对象判断

相反,我们只需通过简单的方法来判断浏览器是否支持要使用的对象(或者是方法、数组或者属 性)。我们还是使用mouseover这个例子。这段脚本依赖于document.images这个数组,所以最重要的事 情当然是判断浏览器是否支持他,下面是具体的做法:

if (document.images)

{

do something with the images array

}

现在你有了一个完全的保障,运行这段 代码的浏览器肯定支持这段脚本。条件语句判断document.image这个数组是否存在,如果返回true,那 么这段脚本将会被执行,反之如果这个数组不存在,将会返回false,而且这段脚本肯定不会被执行。

还有一个常用的检测是针对window.focus的。这是一个方法(一条你告诉JavaScript要去做什么 的命令)。如果我们要使用这个方法,我们必须首先检测浏览器是否支持这个方法。

检测函数是 否存在的正确方法如下,牢记千万不要在函数后面加括号:

if (window.focus)

上面这段 代码的含义是:“浏览器是否支持window.focus这个函数”,而下面这段代码的含义不同:

if (window.focus())

这段代码是对focus的结果进行判断,而且已经假设浏览器是支持 focus方法的,而如果不支持,这时候就会报异常了。加了括号以后实际上执行了函数,而这并不是我们 想要的状况。所以检测的时候不要加括号,而只有在检测通过后才加上括号执行这个函数。比如下面这 个例子:

if (window.focus) window.focus()

重点

以上讨论的所有重点就是:在 JavaScript中,如果你要使用document.images,首先判断是否支持document.images。如果你要使用 window.focus方法,首先判断是否浏览器是否支持这个方法。

如果你总是在使用对象前进行检测 ,你的脚本将不会产生类似问题的异常,付出的代码只是有些功能在部分浏览器中被屏蔽掉了而已。

译者注:

任何战争都是会带来很多副作用的,本文所介绍的情况主要是发生在浏览器大 战的时候的,就像冷战一样,造成了很多遗留的问题。但是后来ecma- 262标准的实施,让这种情况得到 些许缓和,可是在ecma-262第三版中明确规定,允许各家自己对其进行扩展,扩展的结果自然就是不兼 容,自然要使用 本文的方法进行判断。索性,我们现在只是不用判断所有的对象,如果一个浏览器宣布 支持ecma-262标准,至少我们知道哪些对象不用判断,也算是一种慰 藉吧。

时间: 2024-11-18 06:54:09

判断JavaScript对象是否可用的正确方法的相关文章

判断JavaScript对象是否可用的最正确方法分析_javascript技巧

原文:http://www.quirksmode.org/js/support.html原文作者:Peter-Paul Koch 以下为对原文的翻译: 判断对象存在的方法 很快你就会注意到,JavaScript的部分功能在部分浏览器中无效.如果你要使用一些脚本的高级特性,你首先要检查浏览器是否支持要使用的对象,本文具体说明判断的正确方法. 通过判断浏览器的版本:不! 如果你想知道浏览器是否支持代码中使用的那些对象,记住,永远都不要通过浏览器的版本来判断.我确定你知道,有些浏览器支持你的代码,而有

多种方法判断Javascript对象是否存在_javascript技巧

Javascript语言的设计不够严谨,很多地方一不小心就会出错. 举例来说,请考虑以下情况. 现在,我们要判断一个全局对象myObj是否存在,如果不存在,就对它进行声明.用自然语言描述的算法如下: 复制代码 代码如下: if (myObj不存在){ 声明myObj; } 你可能会觉得,写出这段代码很容易.但是实际上,它涉及的语法问题,远比我们想象的复杂.Juriy Zaytsev指出,判断一个Javascript对象是否存在,有超过50种写法.只有对Javascript语言的实现细节非常清楚,

如何判断Javascript对象是否存在的简单实例_javascript技巧

Javascript语言的设计不够严谨,很多地方一不小心就会出错. 举例来说,请考虑以下情况. 现在,我们要判断一个全局对象myObj是否存在,如果不存在,就对它进行声明.用自然语言描述的算法如下: if (myObj不存在){ 声明myObj; } 你可能会觉得,写出这段代码很容易.但是实际上,它涉及的语法问题,远比我们想象的复杂.Juriy Zaytsev指出,判断一个Javascript对象是否存在,有超过50种写法.只有对Javascript语言的实现细节非常清楚,才可能分得清它们的区别

JavaScript对象数组的排序处理方法_javascript技巧

本文实例讲述了JavaScript对象数组的排序处理方法.分享给大家供大家参考,具体如下: javascript的数组排序函数 sort方法,默认是按照ASCII 字符顺序进行升序排列.arrayobj.sort(sortfunction); 参数:sortFunction 可选项.是用来确定元素顺序的函数的名称.如果这个参数被省略,那么元素将按照 ASCII 字符顺序进行升序排列. sort 方法将 Array 对象进行适当的排序:在执行过程中并不会创建新的 Array 对象. 如果为 sor

如何判断Javascript对象是否存在

Javascript语言的设计不够严谨,很多地方一不小心就会出错. 举例来说,请考虑以下情况. 现在,我们要判断一个全局对象myObj是否存在,如果不存在,就对它进行声明.用自然语言描述的算法如下: if (myObj不存在){ 声明myObj; } 你可能会觉得,写出这段代码很容易.但是实际上,它涉及的语法问题,远比我们想象的复杂.Juriy Zaytsev指出,判断一个Javascript对象是否存在,有超过50种写法.只有对Javascript语言的实现细节非常清楚,才可能分得清它们的区别

简单方法判断JavaScript对象为null或者属性为空_javascript技巧

首先说下null与undefined区别: 对已声明但未初始化的和未声明的变量执行typeof,都返回"undefined". null表示一个空对象指针,typeof操作会返回"object". 一般不显式的把变量的值设置为undefined,但null相反,对于将要保存对象的变量,应明确的让该变量保存null值. var bj; alert(bj); //"undefined" bj = null; alert(typeof bj); //&

简单方法判断JavaScript对象为null或者属性为空

 首先说下null与undefined区别: 对已声明但未初始化的和未声明的变量执行typeof,都返回"undefined". null表示一个空对象指针,typeof操作会返回"object". 一般不显式的把变量的值设置为undefined,但null相反,对于将要保存对象的变量,应明确的让该变量保存null值.   1 2 3 4 5 6 7 var bj; alert(bj); //"undefined" bj = null; aler

javaScript对象和属性的创建方法_基础知识

复制代码 代码如下: 1.创建一个空对象:var o =new object(); 2.创建对象直接量:    var cricle={x:0,y:0,radius:2}    var homer={                         name:"Homer Simpson",                         age:34,                         married:true,                         emai

JavaScript判断undefined类型的正确方法

  这篇文章主要介绍了JavaScript判断undefined类型的正确方法,相信很多同学在遇到这问题时都会用到错误的方法,正确方法也很简单,需要的朋友可以参考下 代码如下: if (reValue== undefined){ alert("undefined"); } 发现判断不出来,最后查了下资料要用typeof 方法: 代码如下: if (typeof(reValue) == "undefined") { alert("undefined"