javascript基础学习系列三百九十三:检测插件

文章讲述了如何在不同浏览器中检测Flash和QuickTime等插件,包括使用navigator.plugins数组、ActiveXObject在IE中的应用,以及针对不同浏览器编写hasPlugin和hasIEPlugin函数的示例。同时提到了screen对象和history对象的相关属性和用途。
摘要由CSDN通过智能技术生成

检测浏览器是否安装了某个插件是开发中常见的需求。除 IE10 及更低版本外的浏览器,都可以通过 plugins 数组来确定。这个数组中的每一项都包含如下属性。
name:插件名称。
description:插件介绍。
filename:插件的文件名。
length:由当前插件处理的 MIME 类型数量。
通常,name 属性包含识别插件所需的必要信息,尽管不是特别准确。检测插件就是遍历浏览器中可用的插件,并逐个比较插件的名称,如下所示:

let hasPlugin = function(name) { 
 name = name.toLowerCase();
 for (let plugin of window.navigator.plugins){ 
 if (plugin.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 中检测插件。
IE11 的 window.navigator 对象开始支持 plugins 和 mimeTypes 属性。这意味着前面定义的函
数可以适用于所有较新版本的浏览器。而且,IE11 中的 ActiveXObject 也从 DOM 中隐身了,意味着不能再用它来作为检测特性的手段。
旧版本 IE 中的插件检测IE10 及更低版本中检测插件的问题比较多,因为这些浏览器不支持 Netscape 式的插件。在这些 IE
中检测插件要使用专有的 ActiveXObject,并尝试实例化特定的插件。IE 中的插件是实现为 COM 对象的,由唯一的字符串标识。因此,要检测某个插件就必须知道其 COM 标识符。例如,Flash 的标识符是"ShockwaveFlash.ShockwaveFlash”。知道了这个信息后,就可以像这样检测 IE中是否安装了 Flash:

function hasIEPlugin(name) { 
 try { 
 new ActiveXObject(name); 
 return true; 
 } catch (ex) { 
 return false; 
 } 
} 
// 检测 Flash 
alert(hasIEPlugin("ShockwaveFlash.ShockwaveFlash")); 
// 检测 QuickTime 
alert(hasIEPlugin("QuickTime.QuickTime"));

在这个例子中,hasIEPlugin()函数接收一个 DOM 标识符参数。为检测插件,这个函数会使用传入的标识符创建一个新 ActiveXObject 实例。相应代码封装在一个 try/catch 语句中,因此如果创建的插件不存在则会抛出错误。如果创建成功则返回 true,如果失败则在 catch 块中返回 false。上面的例子还演示了如何检测 Flash 和 QuickTime 插件。
因为检测插件涉及两种方式,所以一般要针对特定插件写一个函数,而不是使用通常的检测函数。
比如下面的例子:

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。
注册处理程序
window 的另一个属性 screen 对象,是为数不多的几个在编程中很少用的 JavaScript 对象。这个对象中保存的纯粹是客户端能力信息,也就是浏览器窗口外面的客户端显示器的信息,比如像素宽度和像素高度。每个浏览器都会在 screen 对象上暴露不同的属性。下表总结了这些属性。

availHeight 屏幕像素高度减去系统组件高度(只读)
availLeft 没有被系统组件占用的屏幕的最左侧像素(只读)
availTop 没有被系统组件占用的屏幕的最顶端像素(只读)
availWidth 屏幕像素宽度减去系统组件宽度(只读)
colorDepth 表示屏幕颜色的位数;多数系统是 32(只读)
height 屏幕像素高度
left 当前屏幕左边的像素距离
pixelDepth 屏幕的位深(只读)
top 当前屏幕顶端的像素距离
width 屏幕像素宽度
orientation 返回 Screen Orientation API 中屏幕的朝向

history 对象
history 对象表示当前窗口首次使用以来用户的导航历史记录。因为 history 是 window 的属性,所以每个 window 都有自己的 history 对象。出于安全考虑,这个对象不会暴露用户访问过的 URL,但可以通过它在不知道实际 URL 的情况下前进和后退。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值