Rilevamento Flash Cross Browser in Javascript


96

Qualcuno ha un esempio di script che può funzionare bene in modo affidabile su IE / Firefox per rilevare se il browser è in grado di visualizzare contenuto flash incorporato. Dico in modo affidabile perché so che non è possibile il 100% delle volte.


Vedo che hai già accettato la risposta di joeri, ma dovresti davvero prendere seriamente in considerazione swfObject. È molto più robusto e meno gonfio.
matt lohkamp

Risposte:


94

SWFObject è molto affidabile. L'ho usato senza problemi per un bel po '.


Lo stesso qui, SWFObject funziona alla grande anche per me (si chiamava FlashObject, ma Adobe ha lanciato un
sibilo

17
Con jQuery e swfobject, questo è il codice che ho usato per aggiungere i nomi delle classi html in stile Modernizr: $('html').addClass(typeof swfobject !== 'undefined' && swfobject.getFlashPlayerVersion().major !== 0 ? 'flash' : 'no-flash');
Jon z

2
Se qualcuno è interessato ho provato alcuni di questi casi su jsperf. SWFObject è uscito più velocemente.
hitautodestruct

Verificare la presenza di flash utilizzando swfobject con if( swfobject.hasFlashPlayerVersion("8.0") ) { }Throws false se non è installato flash. Il numero è la versione minima di Flash Player richiesta.
Kai Noack

hitautodestruct, ovviamente SWFObject è uscito più velocemente. Esegue il rilevamento effettivo solo una volta al caricamento della pagina e quindi restituisce i valori memorizzati ogni volta che viene chiamato. Poiché è così che finiresti per utilizzare anche gli altri metodi, il confronto delle prestazioni non è un confronto equo.
Akrikos

109

Sono d'accordo con Max Stewart . SWFObject è la strada da percorrere. Vorrei integrare la sua risposta con un esempio di codice. Questo dovrebbe aiutarti a iniziare:

Assicurati di aver incluso il swfobject.jsfile (scaricalo qui ):

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

Quindi usalo in questo modo:

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

Sostituisci "9.0.115" con qualsiasi versione flash minima di cui hai bisogno. Ho scelto 9.0.115 come esempio perché è la versione che ha aggiunto il supporto h.264.

Se il visitatore non ha flash, segnalerà una versione flash di "0.0.0", quindi se vuoi solo sapere se ha flash, usa:

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

9
grande. Stavo lottando per trovare un esempio davvero semplice di rilevamento semplice di qualsiasi flash installato. Grazie.
Brian Scott

2
Grazie per questo esempio! Necessario eseguire qualche altro javascript se l'utente era senza flash e utilizzava comunque swfobject per l'incorporamento. :)
kontur

c'è un problema con questo, dovrai includere un controllo per SWFobject o otterrai un errore perché undefined non ha una funzione chiamata hasFlashPlayerVersion (). if(SWFobject && SWFobject.hasFlashPlayerVersion("1")) { // code here }
E-comm

Ovviamente, il mio codice presuppone che tu abbia SWFObject caricato. È proprio come usare jQuery o qualsiasi altra libreria per una soluzione. Non funzionerà se non lo includi, e sarebbe un sacco di logica di esecuzione / gonfiaggio extra se controllassi la libreria ogni volta che la usi.
Andrew Ensley,

@ Andrew: Mi rendo conto che questo post ha quattro anni e mezzo, ma non è così ovvio per coloro che non sono abituati a lavorare con SWFObject. Sto utilizzando un componente aggiuntivo Angular per il caricamento di file che ricorre a Flash se HTML5 non è supportato e volevo visualizzare un messaggio se Flash non è stato rilevato. Non era ovvio per me che SWFObject fosse una libreria che doveva essere caricata o se fosse caricata automaticamente tramite l'installazione di Flash Player nel browser. Grazie per aver chiarito nel tuo commento, ma per favore considera di aggiungerlo alla tua risposta.
Travesty3

36

So che questo è un vecchio post, ma ho cercato per un po 'e non ho trovato nulla.
Ho implementato la libreria di rilevamento Flash JavaScript . Funziona molto bene ed è documentato per un utilizzo rapido. Mi ci sono voluti letteralmente 2 minuti. Ecco il codice che ho scritto nell'intestazione:

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

ora non funziona su Chrome e Firefox 6+!
balint

Sembra legittimo: l'ultima versione funziona abbastanza bene o me. Grazie, continuate così!
poitroae

Grazie. Mi piace questa libreria perché non necessita di swf sentinel. Spero che tu lo tenga aggiornato!
Nick Van Brunt

Questa dovrebbe essere la risposta ... :)
sabinonstack

32

È possibile utilizzare il compilatore di chiusura per generare un piccolo rilevamento flash cross-browser:

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

che risulta nel seguente codice "compilato":

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
questa soluzione è la più pulita secondo noi. stavamo cercando un metodo libero da swfobject / library per rilevare se Flash è installato. questo fa il trucco. Grazie!
anonimo - uno

Soluzione fantastica :) .. mi hai salvato la giornata.
Arindam Paul

Non lamentarsi di @ anonymous-one, ma questa soluzione non utilizza anche una libreria (in particolare goog.userAgent.flashdal Closure Compiler di Google)? Voglio solo assicurarmi di non perdere qualche sfumata differenza qui.
Andrew Ensley

non stiamo usando il primo snippet. stiamo usando il 2 °. che è "senza libreria".
anonimo: un

Questa è la risposta più pura e completa che ho visto che sembra coprire tutti i browser. Grazie.
HartleySan

22

Versione minima che abbia mai usato (non controlla la versione, solo Flash Plugin):

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

2
Bello e breve, mi piace!
mike nelson

@ greg.kindel Lo uso da molto tempo da allora e funziona per le versioni che ho testato. Potrebbe essere utile, tuttavia, se specifichi la versione del sistema operativo e anche la versione di IE;)
Tom Roggero,

non funziona in IE 9.0.17 sotto Win 7 con messaggio di errore: "Il server di automazione non può creare l'oggetto". Questo sembra dipendere dall'installazione. Su alcuni computer funziona su altri no.
Zensursula

@ Zensursula: ho messo un try {} catch () attorno ad ActiveXObject e ho restituito false nella clausola di eccezione. Ora sta funzionando anche per
me

1
@mch un sacco di cose potrebbero farlo. ma i livelli di sicurezza predefiniti non dovrebbero.
Tom Roggero



5

Rilevare e incorporare Flash in un documento Web è un'attività sorprendentemente difficile.

Sono rimasto molto deluso dalla qualità e dal markup non conforme agli standard generato sia da SWFObject che dalle soluzioni Adobe. Inoltre, i miei test hanno rilevato che l'aggiornamento automatico di Adobe è incoerente e inaffidabile.

La libreria JavaScript Flash Detection (Flash Detect) e la libreria JavaScript Flash HTML Generator (Flash TML) sono una soluzione di markup leggibile, gestibile e conforme agli standard.

- "Luca ha letto la fonte!"


4

Codice per una isFlashExistsvariabile di linea :

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

Nota che esiste un'alternativa come questa: swfobject.getFlashPlayerVersion();


3

Visualizza la fonte su http://whatsmy.browsersize.com (righe 14-120).

Ecco il codice cross browser astratto su jsbin solo per il rilevamento flash , funziona su: FF / IE / Safari / Opera / Chrome.


Puoi fornire del codice o almeno un link su come hai ottenuto la risposta sul tuo sito?
hitautodestruct

@hitautodestruct Se visualizzi l'origine della pagina, la risposta è direttamente lì, nella parte superiore del blocco JS.
Ates Goral

Quindi essenzialmente stavamo parlando di questo codice (collegamento jsbin)?
hitautodestruct

@hitautodestruct Sì, più la detectObject()controparte per IE.
Ates Goral

3

che dire:

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

Se sei interessato a una soluzione Javascript pura, ecco quella che copio da 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

Se vuoi solo controllare se il flash è abilitato, dovrebbe essere sufficiente.

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;

}

Nota: evitare di selezionare enabledPlugin , alcuni browser mobili hanno un plug-in flash abilitato al tocco e attiveranno un falso negativo.



0

Hanno creato un piccolo .swfche reindirizza. Se il browser è abilitato per Flash, reindirizzerà.

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

Utilizzando la libreria goog.require ('goog.userAgent.flash') del compilatore Google Closure ho creato queste 2 funzioni.

booleano hasFlash ()

Restituisce se il browser ha 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;
}

booleano isFlashVersion (versione)

Restituisce se la versione flash è maggiore della versione fornita

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)
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.