有时,需要用脚本检测浏览器中是否安装了特定的插件,对于非IE浏览器,可以使用plugins数组来达到这个目的。
该数组中的每一项包含下列属性:
一般来说,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"));
//检测Java
alert(hasPlugin("Java"));
这个hasPlugin()函数接受一个参数:要检测的插件名。第一步是将传入的名称转换为小写形式,以便于比较。然后,迭代plugins数组,通过indexOf()检测每个name属性,以确定传入的名称是否出现在字符串的某个地方。比较的字符串都使用小写的形式可以避免因为大小写不一样导致的错误。而传入的参数应该尽快可能具体,以避免混淆。
应该说,像Flash和QuickTime这样的字符串就比较具体了,不容易导致混淆。在Fifefox、Safari、Opear和Chrome中可以使用这种方法来检测。
检测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"));
在这个例子中,函数hasIEPlugin()只接受一个COM标识符作为参数。在函数内部,首先会尝试创建一个COM对象的实例。之所以要在try-catch语句中进行实例化,是因为创建未知COM对象会抛出错误。这样,如果实例化成功,则函数返回true;否则,如果抛出了错误,则执行catch块,结果就会返回false。
例子最后检测IE中是否安装了Flash和QuickTime插件。
鉴于检测这两个插件的方法差别太大,因此典型的做法是每个插件分别创建检测幻术,而不是使用前面介绍的通用检测方法。
例子:
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;
}
function hasIEPlugin(name) {
try {
new ActiveXObject(name);
return true;
} catch (ex) {
return false;
}
}
//检测所有浏览器中的Flash
function hasFlash() {
var result = hasPlugin("Flash");
if (!result) {
result = hasIEPlugin("ShockwaveFlash.ShockwaveFlash");
}
return result;
}
//检测所有浏览器中的QucikTime
function hasQucikTime() {
var result = hasPlugin("QuickTime");
if (!result) {
result = hasIEPlugin("QucikTime.QuickTime");
}
return result;
}
//检测Flash
alert(hasFlash());
//检测QucikTime
alert(hasQucikTime());
以上代码定义了两个函数:hasFlash()和hasQuickTime()。
每个函数都是先尝试使用不针对IE的插件检测方法。如果返回了false(在IE中会这样),那么在使用针对IE的插件检测方法。
如果IE的插件检测方法在返回false,则整个方法也将返回false。至于任何一次检测返回true,整个方法都会返回true。