检测浏览器是否安装了某个插件是开发中常见的需求。除 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 的情况下前进和后退。