JavaScript检测插件

检测浏览器中是否安装了特定的插件是一种最常见的检测例程。对于非 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 中可以使用这种方法来检测插件。

检测 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 插件。鉴于检测这两种插件的方法差别太大,因此典型的做法是针对每个插件分别创建检测函数,而不是使用前面介绍的通用检测方法。来看下面的例子。
鉴于检测这两种插件的方法差别太大,因此典型的做法是针对每个插件分别创建检测函数,而不是使用前面介绍的通用检测方法。来看下面的例子。

//检测所有浏览器中的 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());

上面代码中定义了两个函数: hasFlash() 和 hasQuickTime() 。每个函数都是先尝试使用不针对IE 的插件检测方法。如果返回了 false (在 IE 中会这样),那么再使用针对 IE 的插件检测方法。如果IE 的插件检测方法再返回 false ,则整个方法也将返回 false 。只要任何一次检测返回 true ,整个方法都会返回 true 。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值