出了存在于所有浏览器中的属性和方法,以及支持它们的浏览器版本。
8.3.1
检测插件
检测浏览器中是否安装了特定的插件是一种最常见的检测例程。对于非IE 浏览器,可以使用
plugins 数组来达到这个目的。该数组中的每一项都包含下列属性。
name:插件的名字。
description:插件的描述。
filename:插件的文件名。
length:插件所处理的MIME 类型数量。
一般来说,name 属性中会包含检测插件必需的所有信息,但有时候也不完全如此。在检测插件时,
需要像下面这样循环迭代每个插件并将插件的name 与给定的名字进行比较。
//检测插件(在IE 中无效) function hasPlugin(name){ name = name.toLowerCase(); for (var i=0; i < navigator.plugins.length; i++){ if (navigator. plugins [i].name.toLowerCase().indexOf(name) > -1){ return true; } } return false; } //检测Flash alert(hasPlugin("Flash")); //检测QuickTime alert(hasPlugin("QuickTime"));
这个hasPlugin()函数接受一个参数:要检测的插件名。第一步是将传入的名称转换为小写形式,
以便于比较。然后,迭代plugins 数组,通过indexOf()检测每个name 属性,以确定传入的名称是
否出现在字符串的某个地方。比较的字符串都使用小写形式可以避免因大小写不一致导致的错误。而传
入的参数应该尽可能具体,以避免混淆。应该说,像Flash 和QuickTime 这样的字符串就比较具体了,
不容易导致混淆。在Firefox、Safari、Opera 和Chrome 中可以使用这种方法来检测插件。
每个插件对象本身也是一个MimeType 对象的数组,这些对象可以通过方括号语
法来访问。每个MimeType 对象有4 个属性:包含MIME 类型描述的description、
回指插件对象的enabledPlugin、表示与MIME 类型对应的文件扩展名的字符串
suffixes(以逗号分隔)和表示完整MIME 类型字符串的type。
检测IE 中的插件比较麻烦,因为IE 不支持Netscape 式的插件。在IE 中检测插件的唯一方式就是
使用专有的ActiveXObject 类型,并尝试创建一个特定插件的实例。IE 是以COM 对象的方式实现插
件的,而COM 对象使用唯一标识符来标识。因此,要想检查特定的插件,就必须知道其COM 标识符。
例如,Flash 的标识符是ShockwaveFlash.ShockwaveFlash。知道唯一标识符之后,就可以编写类似
下面的函数来检测IE 中是否安装相应插件了。
//检测IE 中的插件 function hasIEPlugin(name){ try { new ActiveXObject(name); return true; } catch (ex){ return false; } } //检测Flash alert(hasIEPlugin("ShockwaveFlash.ShockwaveFlash")); //检测QuickTime alert(hasIEPlugin("QuickTime.QuickTime"));
//检测所有浏览器中的Flash function hasFlash(){ var result = hasPlugin("Flash"); if (!result){ result = hasIEPlugin("ShockwaveFlash.ShockwaveFlash"); }
return result; } //检测所有浏览器中的QuickTime function hasQuickTime(){ var result = hasPlugin("QuickTime"); if (!result){ result = hasIEPlugin("QuickTime.QuickTime"); } return result; } //检测Flash alert(hasFlash()); //检测QuickTime alert(hasQuickTime());
8.3.2
注册处理程序
Firefox 2 为navigator 对象新增了registerContentHandler()和registerProtocolHandler()方
法(这两个方法是在HTML5 中定义的,相关内容将在第22 章讨论)。这两个方法可以让一个站点指明
它可以处理特定类型的信息。随着RSS 阅读器和在线电子邮件程序的兴起,注册处理程序就为像使用桌
面应用程序一样默认使用这些在线应用程序提供了一种方式。
其中,registerContentHandler()方法接收三个参数:要处理的MIME 类型、可以处理该MIME
类型的页面的URL 以及应用程序的名称。举个例子,要将一个站点注册为处理RSS 源的处理程序,可
以使用如下代码。
navigator.registerContentHandler("application/rss+xml", "http://www.somereader.com?feed=%s", "Some Reader");第一个参数是RSS 源的MIME 类型。第二个参数是应该接收RSS 源URL 的URL,其中的%s 表示
Firefox 4 及之前版本只允许在registerContentHandler()方法中使用三个
MIME 类型:application/rss+xml、application/atom+xml 和application/
vnd.mozilla.maybe. feed。这三个MIME 类型的作用都一样,即为RSS 或ATOM
新闻源(feed)注册处理程序。
类似的调用方式也适用于registerProtocolHandler()方法,它也接收三个参数:要处理的协
议(例如,mailto 或ftp)、处理该协议的页面的URL 和应用程序的名称。例如,要想将一个应用程
序注册为默认的邮件客户端,可以使用如下代码。
navigator.registerProtocolHandler("mailto", "http://www.somemailclient.com?cmd=%s", "Some Mail Client");这个例子注册了一个mailto 协议的处理程序,该程序指向一个基于Web 的电子邮件客户端。同样,