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.