通过JavaScript检测插件是否已激活,这是否可能?

3

我通常会检测插件,例如Flash Player

for (var el in navigator.plugins) {
    if (navigator.plugins[el].name &&
        navigator.plugins[el].name.toLowerCase().indexOf('shockwave') !== -1) {
        console.log(navigator.plugins[el]);
    }
}

我不需要跨浏览器的解决方案,也不想测试它是否正确。如何测试此插件是否已激活?

3个回答

6

其他两种解决方案都可以用于查找插件是否已安装并启用。

目前没有办法找出已安装但被禁用的插件。Navigator.plugins不包含仍已安装但已禁用的插件。


1

navigator.plugins 是一个数组,所以您可以在现代浏览器中使用 for each ,否则您需要使用索引进行迭代:

function pluginActive(pname) {
    for (var i = 0;i < navigator.plugins.length;i++) {
        if (navigator.plugins[i].name.indexOf(pname) != -1) {
            return true;
        }
    }
    return false;
}

console.log("Flash plugin " +
            (pluginsActive("Shockwave Flash") ? "active" : "not present"));

您无法区分已禁用和未安装的插件。请记住,在激活/停用插件生效之前,您可能需要重新启动浏览器。


这不是我的问题。我知道什么是数组。实际上,与普通的for循环相比,foreach有一些性能问题。如果性能在我的问题中很重要,我会将您的代码更改为以下内容:function pluginActive(pname) { var i=0, len=navigator.plugins.length; for ( ;i < len; ) { if (navigator.plugins[i++].name.indexOf(pname) != -1) { return true; } } return false; } console.log("Flash插件 " + (pluginsActive("Shockwave Flash") ? "已启用" : "未安装")); - orustammanapov
@orustam 当你检测插件时,性能几乎肯定不是问题。这整个代码将在每台机器和浏览器上运行不到一毫秒。您能详细说明为什么这个答案没有解决您的问题吗?此外,使用 for .. in 迭代数组只是偶然的,并且可能会产生奇怪的副作用。例如,浏览器可能会将方法名存储在方法的 name 属性中,从而混淆您的插件检测。 - phihag

0
如果相关插件被禁用,它将不会出现在navigator.plugins中,也不会对页面进行其他暴露。

我已经通过插件选项卡在Firefox中进行了测试。我已经停用了除Shockwave Flash和QuickTime之外的所有已安装插件。通过navigator.plugins迭代,在控制台中显示所有插件。它实际上不应该这样,或者说不应该吗??这是我的问题,我做错了什么,或者为什么包括已停用的插件在内的所有插件都出现在控制台中??我该如何测试它?? - orustammanapov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接