在Javascript中进行跨浏览器Flash检测

97

有没有可靠的跨IE/Firefox浏览器工作的脚本示例,可以检测浏览器是否能够显示嵌入式Flash内容。我说可靠是因为我知道这不是始终可能实现的100%。


我看到你已经接受了Joeri的答案,但你真的应该认真考虑swfObject。它更加强大且不那么臃肿。 - matt lohkamp
16个回答

110

我同意Max Stewart的观点。 SWFObject是最佳选择。我想通过一个示例代码来补充他的答案。以下代码可以帮助您入门:

确保您已经包含了swfobject.js文件(从这里获取):

<script type="text/javascript" src="swfobject.js"></script>

然后像这样使用它:

if(swfobject.hasFlashPlayerVersion("9.0.115"))
{
    alert("You have the minimum required flash version (or newer)");
}
else
{
    alert("You do not have the minimum required flash version");
}

将“9.0.115”替换为您需要的最低Flash版本。我选择9.0.115作为示例,因为该版本添加了h.264支持。

如果访问者没有安装Flash,则会报告Flash版本为“0.0.0”,因此,如果您只想知道他们是否安装了Flash,请使用:

if(swfobject.hasFlashPlayerVersion("1"))
{
    alert("You have flash!");
}
else
{
    alert("You do not flash :-(");
}

9
太好了。我一直在努力寻找一个非常简单的例子,只需检测任何已安装的Flash。谢谢。 - Brian Scott
2
谢谢这个例子!如果用户没有Flash并且已经在嵌入中使用swfobject,那么需要运行一些其他的JavaScript。 :) - kontur
这段代码存在问题,你需要包含一个检查SWFobject的语句,否则会出现错误,因为undefined没有名为hasFlashPlayerVersion()的函数。 if(SWFobject && SWFobject.hasFlashPlayerVersion("1")) { // 在此处添加代码 } - E-comm
显然,我的代码假定您已经加载了SWFObject。这就像使用jQuery或任何其他库来解决问题一样。如果您不包含它,它将无法工作,并且如果每次使用它时都检查库,那么会有很多额外的膨胀/执行逻辑。 - Andrew Ensley
@Andrew:我知道这篇帖子已经有四年半了,但对于那些不习惯使用SWFObject的人来说,并不是那么明显。我正在使用一个用于文件上传的Angular附加组件,如果不支持HTML5,则转而使用Flash,并且希望在未检测到Flash时显示一条消息。对我来说,SWFObject并不明显是一个需要加载的库,或者是否通过浏览器中安装Flash Player来自动加载。感谢您在评论中进行了澄清,但请考虑将此添加到您的答案中。 - Travesty3
@Travesty3 说得好。我没有考虑到那一点。回答已更新。 - Andrew Ensley

94

SWFObject非常可靠。 我已经使用它相当长的时间,而且没遇到过问题。


同样的情况,SWFObject 对我也很有效(以前叫做 FlashObject,但 Adobe 抱怨了)。 - davr
17
使用 jQuery 和 swfobject,这是我用来添加类似于 Modernizr 的 HTML 类名的代码:$('html').addClass(typeof swfobject !== 'undefined' && swfobject.getFlashPlayerVersion().major !== 0 ? 'flash' : 'no-flash'); - Jon z
2
如果有人感兴趣,我在jsperf上测试了一些案例。SWFObject是最快的。 - hitautodestruct
使用 if( swfobject.hasFlashPlayerVersion("8.0") ) { } 检查 Flash 是否存在。如果没有安装 Flash,则会返回 false。数字表示所需的最低 Flash 版本。 - Avatar
当然,SWFObject是最快的。它只在页面加载时进行一次实际检测,然后每次调用时返回存储的值。由于您最终也会使用其他方法,因此性能比较并不公平。 hitautodestruct - Akrikos
我想指出Adobe在http://www.adobe.com/software/flash/about/上使用SWFObject来报告用户的Flash版本。 - Michael Thompson

36
我知道这是一个旧帖子,但我已经寻找了一段时间,没有找到任何东西。
我已经实现了JavaScript Flash Detection Library。 它非常好用,并且有文档进行快速使用。只需2分钟即可完成。这是我在头部编写的代码:
<script src="Scripts/flash_detect.js"></script>
<script type="text/javascript"> 
 if (!FlashDetect.installed) {
    alert("Flash is required to enjoy this site.");         
 } else {
    alert("Flash is installed on your Web browser.");
 }
</script>        

它现在在Chrome和Firefox 6+上失败了! - balint
看起来不错 - 最新版本对我来说运行得非常好。谢谢,继续保持好工作! - poitroae
谢谢。我喜欢这个库,因为它不需要哨兵SWF文件。希望您能保持更新! - Nick Van Brunt
这应该是答案... :) - Sabin Chacko

32

你可以使用Closure Compiler生成一个小型、跨浏览器的Flash检测:

// ==ClosureCompiler==
// @compilation_level ADVANCED_OPTIMIZATIONS
// @output_file_name default.js
// @formatting pretty_print
// @use_closure_library true
// ==/ClosureCompiler==

// ADD YOUR CODE HERE
goog.require('goog.userAgent.flash');
if (goog.userAgent.flash.HAS_FLASH) {
    alert('flash version: '+goog.userAgent.flash.VERSION);
}else{
    alert('no flash found');
}

这将生成以下“编译”代码:

var a = !1,
    b = "";

function c(d) {
    d = d.match(/[\d]+/g);
    d.length = 3;
    return d.join(".")
}
if (navigator.plugins && navigator.plugins.length) {
    var e = navigator.plugins["Shockwave Flash"];
    e && (a = !0, e.description && (b = c(e.description)));
    navigator.plugins["Shockwave Flash 2.0"] && (a = !0, b = "2.0.0.11")
} else {
    if (navigator.mimeTypes && navigator.mimeTypes.length) {
        var f = navigator.mimeTypes["application/x-shockwave-flash"];
        (a = f && f.enabledPlugin) && (b = c(f.enabledPlugin.description))
    } else {
        try {
            var g = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7"),
                a = !0,
                b = c(g.GetVariable("$version"))
        } catch (h) {
            try {
                g = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6"), a = !0, b = "6.0.21"
            } catch (i) {
                try {
                    g = new ActiveXObject("ShockwaveFlash.ShockwaveFlash"), a = !0, b = c(g.GetVariable("$version"))
                } catch (j) {}
            }
        }
    }
}
var k = b;
a ? alert("flash version: " + k) : alert("no flash found");

3
我们认为这是最干净的解决方案。我们正在寻找一种无需使用swfobject/库的方法来检测Flash是否已安装,而这个方法正好可以胜任。谢谢! - anonymous-one
不是抱怨@anonymous-one,但是这个解决方案是否也使用了一个库(具体来说是Google的Closure Compiler中的goog.userAgent.flash)?我只想确认我没有错过细微的差别。 - Andrew Ensley
我们不使用第一个片段,而是使用第二个“无库”片段。 - anonymous-one
这是我看到的最纯净、最全面的答案,似乎覆盖了所有浏览器。谢谢你。 - HartleySan
您还可以查看此编译代码的未压缩版本,包括一些有用的注释,链接在这里:https://code.google.com/p/doctype-mirror/wiki/ArticleDetectFlash - James M. Greene

22

我使用过的最低版本(不检查版本,只是 Flash 插件):

var hasFlash = function() {
    return (typeof navigator.plugins == "undefined" || navigator.plugins.length == 0) ? !!(new ActiveXObject("ShockwaveFlash.ShockwaveFlash")) : navigator.plugins["Shockwave Flash"];
};

2
简短而精美,我喜欢它! - mike nelson
@greg.kindel 我从那时起就一直在使用它,对我测试的版本有效。不过,如果您也指定操作系统版本和IE版本的话,可能会更有帮助 ;) - Tom Roggero
在Win 7下,IE 9.0.17中无法工作,出现错误消息:“自动化服务器无法创建对象”。这似乎取决于安装情况。在某些计算机上可以工作,在某些计算机上则不行。 - Zensursula
@Zensursula:我在ActiveXObject周围加了一个try{}catch(),并在异常子句中返回false。现在它对我也起作用了。 - Zensursula
1
@mch 有很多事情可能会导致这种情况发生。但默认的安全级别不应该如此。 - Tom Roggero
显示剩余2条评论

8

7

6
想要指出一点:SWFObject 是 Adobe 检测工具的继承者,该工具在此处链接。 - Andrew Ensley

5

5

一行代码中的isFlashExists变量:

<script type='text/javascript'
    src='//ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject.js'> </script>

<script type='text/javascript'>
   var isFlashExists = swfobject.hasFlashPlayerVersion('1') ? true : false ;
   if (isFlashExists) {
    alert ('flash exists');
   } else {
    alert ('NO flash');
   }
</script>

请注意,还有另一种选择: swfobject.getFlashPlayerVersion();。该方法与上述方法功能相同。

3

你能提供一些代码或者至少一个链接,说明你是如何在你的网站上得出答案的吗? - hitautodestruct
@hitautodestruct 如果您查看页面源代码,答案直接在JS块的顶部。 - Ates Goral
所以基本上我们在谈论这段代码(jsbin链接)? - hitautodestruct
@hitautodestruct 是的,还有针对IE的detectObject()对应函数。 - Ates Goral

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