如何检测Flash是否已安装,如果未安装,则显示一个隐藏的DIV通知用户?

88

如何使用javascript/jQuery等技术检测是否已安装Flash,如果未安装,则显示包含信息的div,告知用户需要安装flash?

8个回答

159
如果 swfobject 不适用,或者您需要创建更加定制化的内容,请尝试以下方法:
var hasFlash = false;
try {
    hasFlash = Boolean(new ActiveXObject('ShockwaveFlash.ShockwaveFlash'));
} catch(exception) {
    hasFlash = ('undefined' != typeof navigator.mimeTypes['application/x-shockwave-flash']);
}

它可以与7和8一起使用。


2
如果您只想检测它是否已安装而不必显示swf,则此方法非常有效。 - ctrlShiftBryan
10
不得不修改为:var hasFlash = false; try { var fo = (navigator.mimeTypes && navigator.mimeTypes['application/x-shockwave-flash']) ? navigator.mimeTypes['application/x-shockwave-flash'].enabledPlugin : 0; if(fo) hasFlash = true; }catch(e){ if(navigator.mimeTypes ['application/x-shockwave-flash'] != undefined) hasFlash = true; } - invertedSpear
1
这在IE7上不起作用,因为您没有测试activexobject部分。 - Kevin
1
点赞使用5行JavaScript代码而不是整个库。 - Alex W
不错的解决方案,但在catch情况下,我更喜欢检查:(typeof navigator.mimeTypes['application/x-shockwave-flash'] !== 'undefined') - zooblin
显示剩余4条评论

105

如果Flash插件被禁用但已安装,则@Drewid的答案在我的Firefox 25中无效。

@invertedSpear在那个答案中的评论可在Firefox中使用,但在任何IE版本中都不行。

所以结合了他们两人的代码,并得到了这个。在Google Chrome 31、Firefox 25和IE 8-10中测试通过。感谢Drewid和invertedSpear :)

var hasFlash = false;
try {
  var fo = new ActiveXObject('ShockwaveFlash.ShockwaveFlash');
  if (fo) {
    hasFlash = true;
  }
} catch (e) {
  if (navigator.mimeTypes
        && navigator.mimeTypes['application/x-shockwave-flash'] != undefined
        && navigator.mimeTypes['application/x-shockwave-flash'].enabledPlugin) {
    hasFlash = true;
  }
}

1
适用于Firefox 39(2015年8月3日)。 - Vladimir Vukanac
1
如果允许插件但明确阻止了Flash,则无法正常工作,我们正在检查的网站。 Safari 8.0.8。在这种情况下,hasFlash仍为true(应为false)。 - Eugenio
在Firefox 50+中不再起作用,已经测试过2017年,当我“阻止”Flash在网站上运行时仍然显示“true”。 - tmarois
我们之后如何处理对象的释放? - 1Mayur
似乎每次运行此代码时都会占用内存而不释放。特别是在 Windows 7 上的 IE11。 - 1Mayur

26

18
你可以使用navigator.mimeTypes。
if (navigator.mimeTypes ["application/x-shockwave-flash"] == undefined)
    $("#someDiv").show ();

10

4
你还应该能够使用...
swfobject.getFlashPlayerVersion().major === 0

使用swfobject插件

swfobject 未定义。 - mikemaccana

2
我使用了Adobe的检测工具,这个工具最初由justpassinby建议。他们的系统很好,因为它可以检测版本号并与你的“所需版本”进行比较。
不好的一点是它会弹出一个警告,显示检测到的Flash版本,这并不是非常用户友好的。突然间,一个带有一些看似随机数字的框弹了出来。
以下是一些你可能想要考虑的修改:
- 移除警告 - 更改它以返回一个对象(或数组) --- 第一个元素是布尔值true/false,表示“用户机器上是否找到所需版本” --- 第二个元素是找到的实际版本号。

1
非常非常精简版的 http://www.featureblend.com/javascript-flash-detection-library.html(仅限布尔型Flash检测)。
var isFlashInstalled = (function(){
var b=new function(){var n=this;n.c=!1;var a="ShockwaveFlash.ShockwaveFlash",r=[{name:a+".7",version:function(n){return e(n)}},{name:a+".6",version:function(n){var a="6,0,21";try{n.AllowScriptAccess="always",a=e(n)}catch(r){}return a}},{name:a,version:function(n){return e(n)}}],e=function(n){var a=-1;try{a=n.GetVariable("$version")}catch(r){}return a},i=function(n){var a=-1;try{a=new ActiveXObject(n)}catch(r){a={activeXError:!0}}return a};n.b=function(){if(navigator.plugins&&navigator.plugins.length>0){var a="application/x-shockwave-flash",e=navigator.mimeTypes;e&&e[a]&&e[a].enabledPlugin&&e[a].enabledPlugin.description&&(n.c=!0)}else if(-1==navigator.appVersion.indexOf("Mac")&&window.execScript)for(var t=-1,c=0;c<r.length&&-1==t;c++){var o=i(r[c].name);o.activeXError||(n.c=!0)}}()};  
return b.c;
    })();

if(isFlashInstalled){
    // Do something with flash
    }else{
    // Don't use flash  
        }

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