2011-07-31 123 views
3

这样,我通常会发现插件,比如Flash Player是否可以通过JavaScript检测插件是否被激活?

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

我不是在寻找一个跨浏览器的解决方案或想测试是否是正道与否。测试这个插件是否激活的方法是什么?

回答

6

这两个其他解决方案的工作,以确定是否安装了插件并启用。

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

+0

感谢您的回答 – orustam

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")); 

不能区分被禁用,并且不存在插件。请记住,在插件激活/取消激活生效之前,您可能必须重新启动浏览器。

+0

这不是我的问题。我知道它是一个数组。与foreach循环相比,foreach实际上有一些性能问题。如果性能在我的问题中很重要,我会将您的代码更改为:'function pluginActive(pname){var i = 0,len = navigator.plugins.length; for(; i orustam

+0

@orustam当您检测到时,性能几乎肯定不是问题插件。这整个代码将在每台机器和浏览器上运行不到一毫秒。你能详细说明为什么这个答案不能解决你的问题吗?另外,使用'for .. in'来遍历一个数组只会偶然发挥作用,并且会产生奇怪的副作用。例如,浏览器可能会在方法的'name'属性中存储方法名称,从而混淆了您的插件检测。 – phihag

0

如果该插件被禁用,它将不会出现在navigator.plugins或以其他方式暴露在页面中。

+0

我已经通过插件选项卡在Firefox中测试过它。我已经停用了我曾经安装过的所有插件,但是shockwave flash和quicktime。通过navigator.plugins进行迭代显示控制台中的所有插件。它不应该实际或不?这是我的问题,我是否做错了什么,或为什么他们都出现在控制台包括停用的插件???我怎么能测试它? – orustam

相关问题