Detección de Flash en varios navegadores en Javascript

96

¿Alguien tiene un ejemplo de script que pueda funcionar bien de manera confiable en IE / Firefox para detectar si el navegador es capaz de mostrar contenido flash incrustado? Digo de manera confiable porque sé que no es posible el 100% del tiempo.

Ta01
fuente
Veo que ya ha aceptado la respuesta de joeri, pero realmente debería considerar seriamente swfObject. Es mucho más robusto y menos hinchado.
Matt Lohkamp

Respuestas:

94

SWFObject es muy confiable. Lo he usado sin problemas durante bastante tiempo.

Max Stewart
fuente
Lo mismo aquí, SWFObject funciona muy bien para mí también (solía llamarse FlashObject, pero Adobe lanzó un ataque de
hissy
17
Con jQuery y swfobject, este es el código que usé para agregar nombres de clases html al estilo Modernizr: $('html').addClass(typeof swfobject !== 'undefined' && swfobject.getFlashPlayerVersion().major !== 0 ? 'flash' : 'no-flash');
Jon z
2
Si alguien está interesado, probé algunos de estos casos en jsperf. SWFObject fue el más rápido.
hitautodestruct
Compruebe if( swfobject.hasFlashPlayerVersion("8.0") ) { }si hay flash usando swfobject con Throws false si no hay flash instalado. El número es la versión mínima de Flash Player requerida.
Kai Noack
hitautodestruct, por supuesto que SWFObject salió más rápido. Solo realiza la detección real una vez en la carga de la página y luego devuelve los valores que almacenó cada vez que se llama. Dado que esa es la forma en que terminaría utilizando los otros métodos también, la comparación de rendimiento no es una comparación justa.
Akrikos
109

Estoy de acuerdo con Max Stewart . SWFObject es el camino a seguir. Me gustaría complementar su respuesta con un ejemplo de código. Esto debería ayudarlo a comenzar:

Asegúrese de haber incluido el swfobject.jsarchivo (consígalo aquí ):

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

Entonces úsalo así:

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

Reemplace "9.0.115" con la versión mínima de flash que necesite. Elegí 9.0.115 como ejemplo porque esa es la versión que agregó soporte para h.264.

Si el visitante no tiene flash, informará una versión flash de "0.0.0", por lo que si solo desea saber si tiene flash, use:

if(swfobject.hasFlashPlayerVersion("1"))
{
    alert("You have flash!");
}
else
{
    alert("You do not flash :-(");
}
Andrew Ensley
fuente
9
Excelente. Estaba luchando por encontrar un ejemplo realmente simple de simplemente detectar cualquier flash instalado. Gracias.
Brian Scott
2
¡Gracias por este ejemplo! Se necesitaba ejecutar algún otro javascript si el usuario no tenía flash y ya estaba usando swfobject para la incrustación de todos modos. :)
kontur
hay un problema con esto, deberá incluir una verificación para SWFobject o obtendrá un error porque undefined no tiene una función llamada hasFlashPlayerVersion (). if(SWFobject && SWFobject.hasFlashPlayerVersion("1")) { // code here }
E-comm
Obviamente, mi código asume que tiene SWFObject cargado. Es como usar jQuery o cualquier otra biblioteca para una solución. No funcionará si no lo incluye, y sería una gran cantidad de lógica de ejecución / hinchazón adicional si buscara la biblioteca cada vez que la use.
Andrew Ensley
@Andrew: Me doy cuenta de que esta publicación tiene cuatro años y medio, pero no es tan obvio para aquellos que no están acostumbrados a trabajar con SWFObject. Estoy usando un complemento angular para la carga de archivos que recurre a Flash si HTML5 no es compatible y quería mostrar un mensaje si no se detecta Flash. No era obvio para mí que SWFObject era una biblioteca que necesitaba cargarse, o si se cargaba automáticamente mediante la instalación de Flash Player en el navegador. Gracias por aclarar tu comentario, pero considera agregarlo a tu respuesta.
Travesty3
36

Sé que esta es una publicación antigua, pero he estado buscando por un tiempo y no encontré nada.
Implementé la biblioteca de detección de Flash de JavaScript . Funciona muy bien y está documentado para un uso rápido. Literalmente me tomó 2 minutos. Aquí está el código que escribí en el encabezado:

<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
fuente
ahora falla en Chrome y Firefox 6+.
balint
Parece legítimo: la última versión funciona bastante bien para mí. ¡Gracias, sigan con el buen trabajo!
poitroae
Gracias. Me gusta esta biblioteca porque no requiere un swf centinela. ¡Espero que lo mantengas actualizado!
Nick Van Brunt
Esta debería ser la respuesta ... :)
sabinonstack
32

Puede usar el compilador de cierre para generar una pequeña detección de flash entre navegadores:

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

que da como resultado el siguiente código "compilado":

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
fuente
3
esta solución es la más limpia en nuestra opinión. Estábamos buscando un método gratuito de swfobject / library para detectar si flash está instalado. esto hace el truco. ¡Gracias!
anónimo-uno
Solución impresionante :) .. me salvaste el día.
Arindam Paul
No me quejo @ anonymous-one, pero ¿esta solución no usa también una biblioteca (específicamente goog.userAgent.flashdel compilador de cierre de Google)? Solo quiero asegurarme de que no me estoy perdiendo alguna diferencia de matices aquí.
Andrew Ensley
no estamos usando el primer fragmento. estamos usando el 2do. que es "biblioteca gratuita".
anónimo-uno
Esta es la respuesta más pura y completa que he visto que parece abarcar todos los navegadores. Gracias.
HartleySan
22

Versión mínima que he usado (no verifica la versión, solo el complemento Flash):

var hasFlash = function() {
    return (typeof navigator.plugins == "undefined" || navigator.plugins.length == 0) ? !!(new ActiveXObject("ShockwaveFlash.ShockwaveFlash")) : navigator.plugins["Shockwave Flash"];
};
Tom Roggero
fuente
2
Bonito y corto, ¡me gusta!
Mike Nelson
@ greg.kindel Lo he estado usando durante mucho tiempo desde entonces, y funciona para las versiones que probé. Sin embargo, podría ser útil si especifica la versión del sistema operativo y la versión de IE;)
Tom Roggero
no funciona en IE 9.0.17 en Win 7 con el mensaje de error: "El servidor de automatización no puede crear el objeto". Esto parece depender de la instalación. En algunas computadoras funciona en otras no.
Zensursula
@Zensursula: Puse un try {} catch () alrededor del ActiveXObject y devolví falso en la cláusula de excepción. Ahora también funciona para mí
Zensursula
1
@mch un montón de cosas podrían hacer eso. pero los niveles de seguridad predeterminados no deberían hacerlo.
Tom Roggero
5

Detectar e incrustar Flash en un documento web es una tarea sorprendentemente difícil.

Me decepcionó mucho la calidad y el marcado que no cumple con los estándares generados tanto por SWFObject como por las soluciones de Adobe. Además, mis pruebas encontraron que el actualizador automático de Adobe era inconsistente y poco confiable.

La biblioteca JavaScript Flash Detection Library (Flash Detect) y la biblioteca JavaScript Flash HTML Generator Library (Flash TML) son una solución de marcado legible, mantenible y compatible con los estándares.

- "¡Luke leyó la fuente!"


fuente
4

Código para una isFlashExistsvariable de revestimiento :

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

Tenga en cuenta que hay una alternativa como esta: swfobject.getFlashPlayerVersion();

trante
fuente
3

Vea la fuente en http://whatsmy.browsersize.com (líneas 14-120).

Aquí está el código de navegador cruzado resumido en jsbin solo para detección de flash , funciona en: FF / IE / Safari / Opera / Chrome.

Ates Goral
fuente
¿Puede proporcionar algún código o al menos un enlace sobre cómo logró la respuesta en su sitio?
hitautodestruct
@hitautodestruct Si ve la fuente de la página, la respuesta está directamente allí, en la parte superior del bloque JS.
Ates Goral
Entonces, ¿esencialmente estábamos hablando de este código (enlace jsbin)?
hitautodestruct
@hitautodestruct Sí, más la detectObject()contraparte de IE.
Ates Goral
3

qué pasa:

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

Si está interesado en una solución pura de Javascript, aquí está la que copio de 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;
}
bizi
fuente
1

Si solo desea verificar si el flash está habilitado, esto debería ser suficiente.

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: evite marcar el plugin habilitado , algunos navegadores móviles tienen un plugin flash que se puede pulsar para habilitar y activará un falso negativo.

bitinn
fuente
0

Han creado un pequeño .swfque redirecciona. Si el navegador está habilitado para flash, redirigirá.

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

}

}
Miguel
fuente
0

Usando la biblioteca goog.require ('goog.userAgent.flash') del compilador de cierre de Google, creé estas 2 funciones.

booleano hasFlash ()

Devuelve si el navegador tiene 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 (versión)

Devuelve si la versión flash es mayor que la versión proporcionada

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)
}
pollos
fuente