Javascript 中的跨浏览器 Flash 检测

IT技术 javascript flash cross-browser
2021-02-02 16:34:45

有没有人有一个脚本示例,它可以在 IE/Firefox 上可靠地工作,以检测浏览器是否能够显示嵌入式 Flash 内容。我说可靠是因为我知道这不可能 100% 的时间。

6个回答

我同意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");
}

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

如果访问者没有flash,它会报告“0.0.0”的flash版本,所以如果你只是想知道他们是否有flash,请使用:

if(swfobject.hasFlashPlayerVersion("1"))
{
    alert("You have flash!");
}
else
{
    alert("You do not flash :-(");
}
感谢这个例子!如果用户没有 Flash 并且已经使用 swfobject 进行嵌入,则需要运行其他一些 javascript。:)
2021-03-15 16:34:45
@Andrew:我意识到这篇文章已经有四年半的历史了,但对于那些不习惯使用 SWFObject 的人来说,它并不是那么明显。如果不支持 HTML5,我正在使用 Angular 加载项进行文件上传,如果未检测到 Flash,则使用 Flash。对我来说,SWFObject 是一个需要加载的库,或者它是否是通过在浏览器中安装 Flash Player 自动加载的,这对我来说并不明显。感谢您在评论中进行澄清,但请考虑将其添加到您的答案中。
2021-03-26 16:34:45
这有问题,您需要检查 SWFobject,否则您将收到错误消息,因为 undefined 没有名为 hasFlashPlayerVersion() 的函数。 if(SWFobject && SWFobject.hasFlashPlayerVersion("1")) { // code here }
2021-04-06 16:34:45
显然,我的代码假定您已加载 SWFObject。这就像使用 jQuery 或任何其他库作为解决方案一样。如果您不包含它,它将无法工作,并且如果您每次使用它时都检查该库,则会产生大量额外的膨胀/执行逻辑。
2021-04-09 16:34:45
伟大的。我一直在努力寻找一个非常简单的例子来简单地检测安装的任何闪存。谢谢。
2021-04-10 16:34:45

SWFObject非常可靠。我已经使用它很长一段时间没有问题了。

同样在这里,SWFObject 对我也很有用(曾经被称为 FlashObject,但 Adob​​e 发出了嘶嘶声)
2021-03-15 16:34:45
hitautodestruct,当然 SWFObject 出来得最快。它只在页面加载时进行一次实际检测,然后在每次调用时返回它存储的值。由于这也是您最终使用其他方法的方式,因此性能比较不是一个公平的比较。
2021-03-24 16:34:45
if( swfobject.hasFlashPlayerVersion("8.0") ) { }如果没有安装闪存,请使用 swfobject 和Throws false检查闪存。该数字是所需的最低 Flash 播放器版本。
2021-03-25 16:34:45
如果有人感兴趣,我在 jsperf 上测试了其中一些案例SWFObject 出来的速度最快。
2021-03-30 16:34:45
使用 jQuery 和 swfobject,这是我用来添加 Modernizr 风格的 html 类名的代码: $('html').addClass(typeof swfobject !== 'undefined' && swfobject.getFlashPlayerVersion().major !== 0 ? 'flash' : 'no-flash');
2021-04-05 16:34:45

我知道这是一个旧帖子,但我一直在寻找一段时间并没有找到任何东西。
我已经实现了JavaScript Flash 检测库它工作得很好,并且记录在案以供快速使用。从字面上看,我花了 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>        
谢谢。我喜欢这个库,因为它不需要哨兵 swf。我希望你能保持最新状态!
2021-03-12 16:34:45
这应该是答案... :)
2021-03-14 16:34:45
它现在在 Chrome 和 Firefox 6+ 上失败了!
2021-03-21 16:34:45
似乎合法 - 最新版本或我的效果很好。谢谢,继续努力!
2021-04-07 16:34:45

你可以使用闭包编译器来生成一个小的、跨浏览器的 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");
这是我见过的最纯粹、最彻底的答案,似乎涵盖了所有浏览器。谢谢你。
2021-03-27 16:34:45
很棒的解决方案:) .. 你救了我的一天。
2021-03-28 16:34:45
不要抱怨@anonymous-one,但是这个解决方案不是也使用了一个库(特别是goog.userAgent.flash来自 Google 的 Closure Compiler)吗?我只是想确保我没有错过这里的一些细微差别。
2021-03-30 16:34:45
我们没有使用第一个片段。我们正在使用第二个。这是'图书馆免费'。
2021-03-30 16:34:45
在我们看来,这个解决方案是最干净的。我们正在寻找一种 swfobject/library free 方法来检测是否安装了 flash。这就是诀窍。谢谢!
2021-04-05 16:34:45

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

var hasFlash = function() {
    return (typeof navigator.plugins == "undefined" || navigator.plugins.length == 0) ? !!(new ActiveXObject("ShockwaveFlash.ShockwaveFlash")) : navigator.plugins["Shockwave Flash"];
};
好看又短,我喜欢!
2021-03-17 16:34:45
@greg.kindel 从那以后我一直在使用它,它适用于我测试过的版本。不过,如果您也指定操作系统版本和 IE 版本,可能会有所帮助;)
2021-03-21 16:34:45
@Zensursula:我在 ActiveXObject 周围放置了一个 try{}catch() 并在异常子句中返回 false。现在它也适用于我
2021-03-21 16:34:45
@mch 很多事情都可以做到这一点。但默认的安全级别不应该。
2021-03-24 16:34:45
在 Win 7 下的 IE 9.0.17 中不起作用,并显示错误消息:“自动化服务器无法创建对象”。这似乎取决于安装。在某些计算机上,它可以在某些计算机上运行。
2021-03-31 16:34:45