JavaScriptでのクロスブラウザフラッシュの検出


96

ブラウザが埋め込みフラッシュコンテンツを表示できるかどうかを検出するために、IE / Firefox全体で確実にうまく機能するスクリプトの例を誰かが持っていますか?100%可能ではないことを知っているので、確実に言います。


joeriの答えはすでに受け入れていますが、swfObjectを真剣に検討する必要があります。それははるかに堅牢で膨らみが少ないです。
マットローカンプ2008年

回答:


94

SWFObjectは非常に信頼性が高いです。しばらく問題なく使用してきました。


ここでも同じですが、SWFObjectは私にとってもうまく機能します(以前はFlashObjectと呼ばれていましたが、Adobeはひどい適合を投げました)
davr

17
jQueryとswfobjectでは、これは私がModernizrスタイルのHTMLクラス名を追加するために使用されるコードは次のとおりです。 $('html').addClass(typeof swfobject !== 'undefined' && swfobject.getFlashPlayerVersion().major !== 0 ? 'flash' : 'no-flash');
ジョンzは、

2
興味があれば、jsperf でこれらのケースのいくつかテストしました。SWFObjectが最も速く出てきました。
hitautodestruct

if( swfobject.hasFlashPlayerVersion("8.0") ) { }フラッシュがインストールされていない場合は、false をスローするswfobjectを使用してフラッシュを確認します。番号は、必要な最小のFlash Playerバージョンです。
Kai Noack 14年

hitautodestruct、もちろんSWFObjectが最速で出てきました。実際の検出はページの読み込み時に1回だけ行われ、呼び出されるたびに保存された値が返されます。最終的には他の方法を使用することになるため、パフォーマンスの比較は公平な比較ではありません。
Akrikos 2014

109

私はマックス・スチュワートに同意します。 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」を、必要な最小のフラッシュバージョンに置き換えます。例として9.0.115を選択したのは、それがh.264サポートを追加したバージョンだからです。

ビジターがフラッシュを持っていない場合、フラッシュバージョン「0.0.0」が報告されるので、フラッシュがあるかどうかだけを知りたい場合は、以下を使用します。

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

9
すごい。インストールされているフラッシュを単に検出するという非常に単純な例を見つけるのに苦労していました。ありがとう。
ブライアンスコット

2
この例をありがとう!ユーザーがフラッシュを使用せず、埋め込みにswfobjectを既に使用している場合は、他のJavaScriptを実行する必要がありました。:)
kontur 2012年

これには問題があります。SWFobjectのチェックを含める必要があります。そうしないと、undefinedにhasFlashPlayerVersion()という関数がないため、エラーが発生します。if(SWFobject && SWFobject.hasFlashPlayerVersion("1")) { // code here }
E-comm 2015

明らかに、私のコードは、SWFObjectがロードされていることを前提としています。それは、ソリューションにjQueryまたは他のライブラリを使用するのと同じです。含めない場合は機能しません。また、ライブラリを使用するたびにライブラリをチェックした場合、追加の膨張/実行ロジックが多くなります。
Andrew Ensley

@Andrew:私はこの投稿が4年半前であることを理解していますが、SWFObjectの操作に慣れていない人にはそれほど明白ではありません。HTML5がサポートされていない場合にFlashに頼るファイルアップロードにAngularアドオンを使用しており、Flashが検出されなかった場合にメッセージを表示したいと考えています。SWFObjectがロードする必要のあるライブラリであるか、ブラウザにFlash Playerをインストールして自動ロードするのかは、私にはわかりませんでした。コメントを明確にしていただきありがとうございますが、回答に追加することを検討してください。
Travesty3 2015年

36

これは古い投稿であることは知っていますが、しばらく探していて何も見つかりませんでした。JavaScriptフラッシュ検出ライブラリを
実装しました。それは非常にうまく機能し、すばやく使用できるように文書化されています。文字通り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 2013

ありがとう。センチネルswfを必要としないため、このライブラリが好きです。私はあなたがそれを最新に保つことを望みます!
Nick Van Brunt

これが答えになるはずです... :)
sabinonstack

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 / libraryを使用しない方法を探していました。これでうまくいきます。ありがとう!
anonymous-one

素晴らしいソリューション:) ..あなたは私の日を救った。
Arindam Paul

@ anonymous-oneに文句を言うのではなく、このソリューションは(特にgoog.userAgent.flashGoogleのClosure Compilerからの)ライブラリも使用しないのですか?ここで微妙な違いを見逃さないようにしたいだけです。
Andrew Ensley 2013

最初のスニペットは使用していません。2番目を使用しています。これは「ライブラリフリー」です。
anonymous-one

これは、私が見た中で最も純粋で最も完全な答えであり、すべてのブラウザーをカバーしているようです。ありがとうございました。
HartleySan 2013年

22

私が今まで使用した最小バージョン(バージョンをチェックせず、Flashプラグインのみ):

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

2
素晴らしくて短い、私はそれが好きです!
マイクネルソン2013年

@ greg.kindelそれ以来私はそれを長い間使用しており、テストしたバージョンで動作します。OSのバージョンとIEのバージョンも指定した場合、参考になります;)
Tom Roggero '25

Windows 7のIE 9.0.17では、「自動化サーバーはオブジェクトを作成できません」というエラーメッセージが表示され、機能しません。これはインストールに依存しているようです。一部のコンピューターでは、一部のコンピューターでは機能しません。
Zensursula 2013年

@Zensursula:ActiveXObjectの周りにtry {} catch()を配置し、例外句でfalseを返しました。今それは
私の

1
@mchたくさんのことができます。しかし、デフォルトではセキュリティレベルはそうではありません。
Tom Roggero、2015



5

Flashを検出してWebドキュメントに埋め込むことは、驚くほど難しい作業です。

SWFObjectとAdobeの両方のソリューションから生成された品質と非標準に準拠したマークアップに非常にがっかりしました。さらに、私のテストでは、Adobeの自動アップデーターに一貫性がなく、信頼性がないことがわかりました。

JavaScript Flash検出ライブラリ(Flash検出)JavaScript Flash HTMLジェネレータライブラリ(Flash TML)は、読みやすく、保守可能で、標準に準拠したマークアップソリューションです。

-「ルークはソースを読んでください!」


4

1つのライナー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上のコードのための唯一のフラッシュの検出は、上で動作します:FF / IE /サファリ/オペラ/クローム。


サイトで回答をどのようにして達成したかについて、コードまたは少なくともリンクを提供できますか?
hitautodestruct

@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のチェックは避けてください。一部のモバイルブラウザーには、タップして有効にするフラッシュプラグインがあり、誤検知がトリガーされます。



0

.swfリダイレクトする小さなものを作成しました。ブラウザーがフラッシュ対応の場合、リダイレクトされます。

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()

ブラウザにフラッシュがあるかどうかを返します。

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;
}

ブールisFlashVersion(バージョン)

フラッシュのバージョンが提供されたバージョンより大きいかどうかを返します

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)
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.