Javascript中的跨浏览器Flash检测


96

是否有人能在IE / Firefox上正常运行的脚本示例能够检测浏览器是否能够显示嵌入式Flash内容。我说可靠是因为我知道不可能100%的时间。


我看到您已经接受了joeri的回答,但是您确实应该认真考虑swfObject。它更加健壮且不那么肿。
matt lohkamp

Answers:


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") ) { }如果未安装闪存,则使用swfobject并使用Throws false 来检查闪存。该数字是所需的最低Flash Player版本。
凯诺克2014年

hitautodestruct当然是SWFObject最快的。它仅在页面加载时执行一次实际检测,然后在每次调用时返回其存储的值。由于这也是您最终会使用其他方法的方式,因此性能比较不是一个公平的比较。
Akrikos

109

我同意马克斯·斯图尔特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
大。我一直在努力寻找一个简单的示例,简单地检测安装的任何闪存。谢谢。
布莱恩·斯科特

2
感谢这个例子!如果用户没有Flash并且已经使用swfobject进行嵌入,则需要运行其他JavaScript。:)
kontur 2012年

出现此问题,您将需要包括对SWFobject的检查,否则将收到错误消息,因为undefined没有名为hasFlashPlayerVersion()的函数。if(SWFobject && SWFobject.hasFlashPlayerVersion("1")) { // code here }
电子通信2015年

显然,我的代码假定您已加载SWFObject。就像使用jQuery或任何其他库作为解决方案一样。如果您不包含它,它将不起作用,而且如果您每次使用该库时都检查该库,则将有很多额外的膨胀/执行逻辑。
Andrew Ensley

@Andrew:我知道这篇文章已经有四年半了,但是对于那些不习惯使用SWFObject的人来说,它并不那么明显。我正在使用Angular插件进行文件上传,如果不支持HTML5,该插件将诉诸于Flash,并希望在未检测到Flash时显示一条消息。对我来说,SWFObject是一个需要加载的库,还是通过在浏览器中安装Flash Player自动加载的库,对我而言并不明显。感谢您在评论中进行澄清,但请考虑将其添加到您的答案中。
Travesty3,2015年

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 2011年

似乎合法-最新版本对我来说效果很好。谢谢,继续努力!
poitroae

谢谢。我喜欢这个库,因为它不需要哨兵swf。我希望你能保持最新!
Nick Van Brunt

这应该是答案... :)
sabinonstack '16

32

您可以使用闭包编译器生成小的跨浏览器闪存检测:

// ==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,但是此解决方案还不使用一个库(特别是goog.userAgent.flash来自Google Closure Compiler 的库)吗?我只是想确保我在这里不会错过一些细微的差别。
Andrew Ensley 2013年

我们没有使用第一个片段。我们正在使用第二。这是“免费的图书馆”。
匿名一人

这是我所见过的最纯粹,最彻底的答案,似乎涵盖了所有浏览器。谢谢。
哈特利·桑(HartleySan),

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从那时起我已经使用了很长时间,它适用于我测试过的版本。但是,如果您也指定了OS版本和IE版本,可能会有所帮助;)
Tom Roggero 2013年

在Win 7下的IE 9.0.17中不起作用,并显示错误消息:“自动化服务器无法创建对象”。这似乎取决于安装。在某些计算机上,它不能在某些计算机上工作。
Zensursula

@Zensursula:我在ActiveXObject周围放置了try {} catch(),并在异常子句中返回false。现在它也为我工作
-Zensursula

1
@mch可以做很多事情。但默认情况下不应设置安全级别。
Tom Roggero 2015年




4

一个线性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

http://whatsmy.browsersize.com上查看源代码(第14-120行)。

这是jsbin上抽象的跨浏览器代码,仅用于Flash检测,适用于:FF / IE / Safari / Opera / Chrome。


您能否提供一些代码或至少一个有关如何在网站上获得答案的链接?
hitautodestruct 2012年

@hitautodestruct如果您查看页面的源代码,那么答案就直接在JS块顶部。
Ates Goral

因此,本质上讲的是这段代码(jsbin链接)?
hitautodestruct

@hitautodestruct是的,再加上detectObject()IE 的对应版本。
Ates Goral 2012年

3

关于什么:

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

3

如果您对纯Javascript解决方案感兴趣,这是我从Brett复制的一个:

function detectflash(){
    if (navigator.plugins != null && navigator.plugins.length > 0){
        return navigator.plugins["Shockwave Flash"] && true;
    }
    if(~navigator.userAgent.toLowerCase().indexOf("webtv")){
        return true;
    }
    if(~navigator.appVersion.indexOf("MSIE") && !~navigator.userAgent.indexOf("Opera")){
        try{
            return new ActiveXObject("ShockwaveFlash.ShockwaveFlash") && true;
        } catch(e){}
    }
    return false;
}

1

如果您只想检查是否启用了闪光灯,那么就足够了。

function testFlash() {

    var support = false;

    //IE only
    if("ActiveXObject" in window) {

        try{
            support = !!(new ActiveXObject("ShockwaveFlash.ShockwaveFlash"));
        }catch(e){
            support = false;
        }

    //W3C, better support in legacy browser
    } else {

        support = !!navigator.mimeTypes['application/x-shockwave-flash'];

    }

    return support;

}

注意:避免选中enabledPlugin,某些移动浏览器具有点击启用Flash插件,并会触发假否定。



0

创建了一个小的.swf重定向。如果浏览器启用了Flash,它将重定向。

package com.play48.modules.standalone.util;

import flash.net.URLRequest;


class Redirect {


static function main() {

    flash.Lib.getURL(new URLRequest("http://play48.com/flash.html"), "_self");

}

}

0

使用Google Closure编译器goog.require('goog.userAgent.flash')库,我创建了这2个函数。

布尔hasFlash()

返回浏览器是否具有Flash。

function hasFlash(){
    var b = !1;
    function c(a) {if (a = a.match(/[\d]+/g)) {a.length = 3;}}
    (function() {
    if (navigator.plugins && navigator.plugins.length) {
        var a = navigator.plugins["Shockwave Flash"];
        if (a && (b = !0, a.description)) {c(a.description);return;}
        if (navigator.plugins["Shockwave Flash 2.0"]) {b = !0;return;}
    }
    if (navigator.mimeTypes && navigator.mimeTypes.length && (a = navigator.mimeTypes["application/x-shockwave-flash"], b = !(!a || !a.enabledPlugin))) {c(a.enabledPlugin.description);return;}
    if ("undefined" != typeof ActiveXObject) {
        try {
            var d = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");b = !0;c(d.GetVariable("$version"));return;
        } catch (e) {}
        try {
            d = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");b = !0;
            return;
        } catch (e) {}
        try {
            d = new ActiveXObject("ShockwaveFlash.ShockwaveFlash"), b = !0, c(d.GetVariable("$version"));
        } catch (e) {}
    }
    })();
    return b;
}

boolean isFlashVersion(version)

如果Flash版本大于提供的版本,则返回

function isFlashVersion(version) {
    var e = String.prototype.trim ? function(a) {return a.trim()} : function(a) {return /^[\s\xa0]*([\s\S]*?)[\s\xa0]*$/.exec(a)[1]};
    function f(a, b) {return a < b ? -1 : a > b ? 1 : 0};
    var h = !1,l = "";
    function m(a) {a = a.match(/[\d]+/g);if (!a) {return ""}a.length = 3;return a.join(".")}
    (function() {
        if (navigator.plugins && navigator.plugins.length) {
            var a = navigator.plugins["Shockwave Flash"];
            if (a && (h = !0, a.description)) {l = m(a.description);return}
            if (navigator.plugins["Shockwave Flash 2.0"]) {h = !0;l = "2.0.0.11";return}
        }
        if (navigator.mimeTypes && navigator.mimeTypes.length && (a = navigator.mimeTypes["application/x-shockwave-flash"], h = !(!a || !a.enabledPlugin))) {l = m(a.enabledPlugin.description);return}
        if ("undefined" != typeof ActiveXObject) {
            try {
                var b = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");h = !0;l = m(b.GetVariable("$version"));return
            } catch (g) {}
            try {
                b = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");h = !0;l = "6.0.21";return
            } catch (g) {}
            try {
                b = new ActiveXObject("ShockwaveFlash.ShockwaveFlash"), h = !0, l = m(b.GetVariable("$version"))
            } catch (g) {}
        }
    })();
    var n = l;
    return (function(a) {
        var b = 0,g = e(String(n)).split(".");
        a = e(String(a)).split(".");
        for (var p = Math.max(g.length, a.length), k = 0; 0 == b && k < p; k++) {
            var c = g[k] || "",d = a[k] || "";
            do {
                c = /(\d*)(\D*)(.*)/.exec(c) || ["", "", "", ""];d = /(\d*)(\D*)(.*)/.exec(d) || ["", "", "", ""];
                if (0 == c[0].length && 0 == d[0].length) {break}
                b = f(0 == c[1].length ? 0 : parseInt(c[1], 10), 0 == d[1].length ? 0 : parseInt(d[1], 10)) || f(0 == c[2].length, 0 == d[2].length) || f(c[2], d[2]);c = c[3];d = d[3]
            } while (0 == b);
        }
        return 0 <= b
    })(version)
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.