Browserübergreifende Flash-Erkennung in Javascript

96

Hat jemand ein Beispiel für ein Skript, das in IE / Firefox zuverlässig funktioniert, um festzustellen, ob der Browser eingebettete Flash-Inhalte anzeigen kann? Ich sage zuverlässig, weil ich weiß, dass es nicht 100% der Zeit möglich ist.

Ta01
quelle
Ich sehe, Sie haben Joeris Antwort bereits akzeptiert, aber Sie sollten wirklich ernsthaft über swfObject nachdenken. Es ist viel robuster und weniger aufgebläht.
Matt Lohkamp

Antworten:

94

SWFObject ist sehr zuverlässig. Ich habe es eine ganze Weile ohne Probleme benutzt.

Max Stewart
quelle
Ebenso funktioniert SWFObject auch für mich hervorragend (früher FlashObject genannt, aber Adobe hatte einen zischenden Anfall)
davr
17
Mit jQuery und swfobject ist dies der Code, mit dem ich HTML-Klassennamen im Modernizr-Stil hinzugefügt habe: $('html').addClass(typeof swfobject !== 'undefined' && swfobject.getFlashPlayerVersion().major !== 0 ? 'flash' : 'no-flash');
Jon z
2
Wenn jemand interessiert ist, habe ich einige dieser Fälle auf jsperf getestet. SWFObject kam am schnellsten heraus.
Hitautodestruct
Suchen Sie mit swfobject mit if( swfobject.hasFlashPlayerVersion("8.0") ) { }Throws false nach Flash, wenn kein Flash installiert ist. Die Nummer ist die erforderliche Mindestversion des Flash Players.
Kai Noack
hitautodestruct, natürlich kam SWFObject am schnellsten heraus. Die eigentliche Erkennung wird nur einmal beim Laden der Seite durchgeführt und gibt dann die Werte zurück, die bei jedem Aufruf gespeichert wurden. Da Sie auf diese Weise auch die anderen Methoden anwenden würden, ist der Leistungsvergleich kein fairer Vergleich.
Akrikos
109

Ich stimme Max Stewart zu . SWFObject ist der richtige Weg. Ich möchte seine Antwort mit einem Codebeispiel ergänzen. Dies sollte Ihnen den Einstieg erleichtern:

Stellen Sie sicher, dass Sie die swfobject.jsDatei aufgenommen haben ( hier herunterladen ):

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

Dann benutze es so:

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

Ersetzen Sie "9.0.115" durch die erforderliche Mindest-Flash-Version. Ich habe 9.0.115 als Beispiel gewählt, weil dies die Version ist, die h.264-Unterstützung hinzugefügt hat.

Wenn der Besucher keinen Flash hat, wird eine Flash-Version von "0.0.0" gemeldet. Wenn Sie also nur wissen möchten, ob er überhaupt Flash hat, verwenden Sie:

if(swfobject.hasFlashPlayerVersion("1"))
{
    alert("You have flash!");
}
else
{
    alert("You do not flash :-(");
}
Andrew Ensley
quelle
9
großartig. Ich hatte Mühe, ein wirklich einfaches Beispiel für die einfache Erkennung eines installierten Flashs zu finden. Vielen Dank.
Brian Scott
2
Danke für dieses Beispiel! Musste ein anderes Javascript ausführen, wenn der Benutzer ohne Flash war und ohnehin bereits swfobject für die Einbettung verwendete. :)
kontur
Es gibt ein Problem damit, Sie müssen eine Prüfung für SWFobject einschließen, oder Sie erhalten eine Fehlermeldung, da undefined keine Funktion namens hasFlashPlayerVersion () hat. if(SWFobject && SWFobject.hasFlashPlayerVersion("1")) { // code here }
E-Comm
Offensichtlich geht mein Code davon aus, dass Sie SWFObject geladen haben. Es ist so, als würde man jQuery oder eine andere Bibliothek für eine Lösung verwenden. Es wird nicht funktionieren, wenn Sie es nicht einschließen, und es wäre eine Menge zusätzlicher Aufblähungs- / Ausführungslogik, wenn Sie jedes Mal, wenn Sie es verwenden, nach der Bibliothek suchen.
Andrew Ensley
@ Andrew: Mir ist klar, dass dieser Beitrag viereinhalb Jahre alt ist, aber für diejenigen, die es nicht gewohnt sind, mit SWFObject zu arbeiten, ist er nicht so offensichtlich. Ich verwende ein Angular-Add-On für Datei-Uploads, das auf Flash zurückgreift, wenn HTML5 nicht unterstützt wird, und wollte eine Meldung anzeigen, wenn Flash nicht erkannt wurde. Mir war nicht klar, dass SWFObject eine Bibliothek war, die geladen werden musste oder ob sie automatisch über die Installation von Flash Player im Browser geladen wurde. Vielen Dank für die Klarstellung in Ihrem Kommentar, aber bitte überlegen Sie, ihn Ihrer Antwort hinzuzufügen.
Travesty3
36

Ich weiß, dass dies ein alter Beitrag ist, aber ich habe eine Weile gesucht und nichts gefunden.
Ich habe die JavaScript Flash Detection Library implementiert . Es funktioniert sehr gut und ist für den schnellen Gebrauch dokumentiert. Es hat buchstäblich 2 Minuten gedauert. Hier ist der Code, den ich in den Header geschrieben habe:

<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>        
Jon Clark
quelle
es schlägt jetzt auf Chrome und Firefox 6+ fehl!
Balint
Scheint echt - die neueste Version funktioniert ziemlich gut oder ich. Danke, macht weiter so!
Poitroae
Vielen Dank. Ich mag diese Bibliothek, weil sie kein Sentinel-SWF benötigt. Ich hoffe du hältst es auf dem Laufenden!
Nick Van Brunt
Dies sollte die Antwort sein ... :)
Sabinonstack
32

Sie können den Closure-Compiler verwenden , um eine kleine browserübergreifende Flash-Erkennung zu generieren:

// ==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');
}

was zu folgendem "kompilierten" Code führt:

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");
Stewe
quelle
3
Diese Lösung ist unserer Meinung nach die sauberste. Wir suchten nach einer swfobject / library-freien Methode, um festzustellen, ob Flash installiert ist. das macht den Trick. Vielen Dank!
anonym-eins
Super Lösung :) .. du hast meinen Tag gerettet.
Arindam Paul
Nicht um sich bei @ anonym-one zu beschweren, aber verwendet diese Lösung nicht auch eine Bibliothek (speziell goog.userAgent.flashvon Googles Closure Compiler)? Ich möchte nur sicherstellen, dass mir hier kein nuancierter Unterschied entgeht.
Andrew Ensley
Wir verwenden nicht das erste Snippet. Wir benutzen die 2 .. Das ist "Bibliothek frei".
anonym-eins
Dies ist die reinste und gründlichste Antwort, die ich gesehen habe und die anscheinend alle Browser abdeckt. Danke dir.
HartleySan
22

Mindestversion, die ich jemals verwendet habe (überprüft nicht die Version, nur das Flash-Plugin):

var hasFlash = function() {
    return (typeof navigator.plugins == "undefined" || navigator.plugins.length == 0) ? !!(new ActiveXObject("ShockwaveFlash.ShockwaveFlash")) : navigator.plugins["Shockwave Flash"];
};
Tom Roggero
quelle
2
Schön kurz, ich mag es!
Mike Nelson
@ greg.kindel Ich benutze es seitdem schon lange und es funktioniert für die Versionen, die ich getestet habe. Könnte aber hilfreich sein, wenn Sie auch die Betriebssystemversion und die IE-Version angeben;)
Tom Roggero
funktioniert nicht in IE 9.0.17 unter Win 7 mit der Fehlermeldung "Automatisierungsserver kann kein Objekt erstellen". Dies scheint von der Installation abzuhängen. Auf einigen Computern funktioniert es auf einigen nicht.
Zensursula
@Zensursula: Ich habe try {} catch () um das ActiveXObject gelegt und in der Ausnahmeklausel false zurückgegeben. Jetzt funktioniert es auch für mich
Zensursula
1
@mch eine Menge Dinge könnten das tun. Die standardmäßigen Sicherheitsstufen sollten dies jedoch nicht tun.
Tom Roggero
5

Das Erkennen und Einbetten von Flash in ein Webdokument ist eine überraschend schwierige Aufgabe.

Ich war sehr enttäuscht von der Qualität und den nicht standardkonformen Markups, die sowohl mit SWFObject- als auch mit Adobe-Lösungen generiert wurden. Außerdem haben meine Tests ergeben, dass der automatische Updater von Adobe inkonsistent und unzuverlässig ist.

Die JavaScript Flash Detection Library (Flash Detect) und die JavaScript Flash HTML Generator Library (Flash TML) sind eine lesbare, wartbare und standardkonforme Markup-Lösung.

- "Luke hat die Quelle gelesen!"


quelle
4

Code für eine Liner- isFlashExistsVariable:

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

Beachten Sie, dass es eine Alternative wie diese gibt: swfobject.getFlashPlayerVersion();

trante
quelle
3

Die Quelle finden Sie unter http://whatsmy.browsersize.com (Zeilen 14-120).

Hier ist der abstrahierte browserübergreifende Code auf jsbin, der nur zur Flash-Erkennung dient und funktioniert unter: FF / IE / Safari / Opera / Chrome.

Ates Goral
quelle
Können Sie einen Code oder zumindest einen Link angeben, wie Sie die Antwort auf Ihrer Website erhalten haben?
Hitautodestruct
@hitautodestruct Wenn Sie die Quelle der Seite anzeigen, befindet sich die Antwort direkt oben im JS-Block.
Ates Goral
Also im Wesentlichen über diesen Code gesprochen (jsbin Link)?
Hitautodestruct
@hitautodestruct Ja, plus das detectObject()Gegenstück für IE.
Ates Goral
3

wie wäre es mit:

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;
};
Martin Bommeli
quelle
3

Wenn Sie an einer reinen Javascript-Lösung interessiert sind, ist hier die, die ich von Brett kopiere :

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;
}
bizi
quelle
1

Wenn Sie nur überprüfen möchten, ob Flash aktiviert ist, sollte dies ausreichen.

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;

}

Hinweis: Vermeiden Sie die Überprüfung von enabledPlugin . Einige mobile Browser verfügen über ein Flash-Plugin zum Aktivieren und aktivieren falsch negative Ergebnisse .

Bitinn
quelle
0

Um ein Flash-Objekt zu erstellen, das dem Standard entspricht (jedoch mit JavaScript), empfehlen wir Ihnen, einen Blick darauf zu werfen

Unauffällige Flash-Objekte (UFO)

http://www.bobbyvandersluis.com/ufo/index.html

Steve K.
quelle
0

Habe ein kleines erstellt, .swfdas umleitet. Wenn der Browser Flash-fähig ist, wird er umgeleitet.

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");

}

}
Mike
quelle
0

Mit der Bibliothek goog.require ('goog.userAgent.flash') des Google Closure-Compilers habe ich diese beiden Funktionen erstellt.

boolean hasFlash ()

Gibt zurück, wenn der Browser Flash hat.

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)

Gibt zurück, wenn die Flash-Version größer als die angegebene Version ist

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)
}
Hühner
quelle