Detecção de Flash em vários navegadores em Javascript

96

Alguém tem um exemplo de script que pode funcionar bem no IE / Firefox para detectar se o navegador é capaz de exibir conteúdo flash embutido? Digo com segurança porque sei que não é possível 100% das vezes.

Ta01
fonte
Vejo que você já aceitou a resposta de joeri, mas realmente deveria considerar seriamente o swfObject. É muito mais robusto e menos inchado.
matt lohkamp,

Respostas:

94

SWFObject é muito confiável. Eu tenho usado sem problemas por um bom tempo.

Max Stewart
fonte
O mesmo aqui, SWFObject funciona muito bem para mim também (costumava ser chamado de FlashObject, mas a Adobe teve um ajuste
sibilante
17
Com jQuery e swfobject, este é o código que usei para adicionar nomes de classe html no estilo Modernizr: $('html').addClass(typeof swfobject !== 'undefined' && swfobject.getFlashPlayerVersion().major !== 0 ? 'flash' : 'no-flash');
Jon z
2
Se alguém estiver interessado, testei alguns desses casos no jsperf. SWFObject saiu mais rápido.
hitautodestruct de
Verifique se há flash usando swfobject com if( swfobject.hasFlashPlayerVersion("8.0") ) { }Throws false se não houver flash instalado. O número é a versão mínima do flash player necessária.
Kai Noack
hitautodestruct, é claro que o SWFObject saiu mais rápido. Ele faz a detecção real apenas uma vez no carregamento da página e retorna os valores armazenados toda vez que é chamado. Já que essa é a maneira como você acabaria usando os outros métodos também, a comparação de desempenho não é uma comparação justa.
Akrikos
109

Eu concordo com Max Stewart . SWFObject é o caminho a percorrer. Eu gostaria de complementar sua resposta com um exemplo de código. Isso deve ajudá-lo a começar:

Certifique-se de incluir o swfobject.jsarquivo (baixe-o aqui ):

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

Em seguida, use-o assim:

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

Substitua "9.0.115" por qualquer versão mínima de flash necessária. Escolhi 9.0.115 como exemplo porque essa é a versão que adicionou suporte a h.264.

Se o visitante não tiver flash, ele relatará uma versão flash de "0.0.0", então se você quiser apenas saber se eles têm flash, use:

if(swfobject.hasFlashPlayerVersion("1"))
{
    alert("You have flash!");
}
else
{
    alert("You do not flash :-(");
}
Andrew Ensley
fonte
9
ótimo. Eu estava lutando para encontrar um exemplo realmente simples de simplesmente detectar qualquer flash instalado. Obrigado.
Brian Scott
2
Obrigado por este exemplo! É necessário executar algum outro javascript se o usuário não tiver flash e já estiver usando swfobject para a incorporação. :)
kontur
há um problema com isso, você precisará incluir uma verificação para SWFobject ou obterá um erro porque undefined não tem uma função chamada hasFlashPlayerVersion (). if(SWFobject && SWFobject.hasFlashPlayerVersion("1")) { // code here }
E-Comm
Obviamente, meu código assume que você carregou o SWFObject. É como usar jQuery ou qualquer outra biblioteca para uma solução. Não funcionará se você não incluí-lo, e seria um monte de lógica extra de inchaço / execução se você checasse a biblioteca toda vez que a usasse.
Andrew Ensley
@Andrew: Eu sei que este post tem quatro anos e meio, mas não é tão óbvio para aqueles que não estão acostumados a trabalhar com SWFObject. Estou usando um complemento Angular para uploads de arquivos que recorre ao Flash se o HTML5 não for compatível e queria exibir uma mensagem se o Flash não fosse detectado. Não era óbvio para mim que o SWFObject era uma biblioteca que precisava ser carregada, ou se era carregada automaticamente através da instalação do Flash Player no navegador. Obrigado por esclarecer em seu comentário, mas considere adicioná-lo à sua resposta.
Travesty 3 de
36

Sei que este é um post antigo, mas estou procurando há um tempo e não encontrei nada.
Implementei a Biblioteca de detecção de Flash JavaScript . Funciona muito bem e está documentado para uso rápido. Levei literalmente 2 minutos. Aqui está o código que escrevi no cabeçalho:

<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
fonte
agora falha no Chrome e Firefox 6+!
balint de
Parece legítimo - a versão mais recente funciona muito bem para mim. Obrigado, continue com o bom trabalho!
poitroae
Obrigado. Gosto desta biblioteca porque não requer um SWF sentinela. Espero que você o mantenha atualizado!
Nick Van Brunt
Esta deve ser a resposta ... :)
sabinonstack
32

Você pode usar o compilador de encerramento para gerar uma pequena detecção de flash em vários 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 resulta no seguinte 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");
ensopado
fonte
3
esta solução é a mais limpa em nossa opinião. procurávamos um método gratuito de swfobject / biblioteca para detectar se o flash está instalado. isso faz o truque. obrigado!
anônimo, um de
Solução incrível :) .. você salvou meu dia.
Arindam Paul,
Sem querer reclamar @ anonymous-one, mas esta solução também não usa uma biblioteca (especificamente goog.userAgent.flashdo Closure Compiler do Google)? Eu só quero ter certeza de que não estou perdendo nenhuma diferença de nuances aqui.
Andrew Ensley
não estamos usando o primeiro snippet. estamos usando o segundo. que é 'biblioteca gratuita'.
anônimo, um de
Esta é a resposta mais pura e completa que já vi e que parece abranger todos os navegadores. Obrigado.
HartleySan
22

Versão mínima que eu já usei (não verifica a versão, apenas Flash Plugin):

var hasFlash = function() {
    return (typeof navigator.plugins == "undefined" || navigator.plugins.length == 0) ? !!(new ActiveXObject("ShockwaveFlash.ShockwaveFlash")) : navigator.plugins["Shockwave Flash"];
};
Tom Roggero
fonte
2
Legal e curto, eu gosto!
mike nelson
@ greg.kindel Eu uso há muito tempo desde então e funciona para as versões que testei. Pode ser útil, porém, se você especificar a versão do sistema operacional e a versão do IE também;)
Tom Roggero
não funciona no IE 9.0.17 no Win 7 com a mensagem de erro: "O servidor de automação não pode criar o objeto". Isso parece depender da instalação. Em alguns computadores funciona em outros não.
Zensursula
@Zensursula: Coloquei um try {} catch () em torno do ActiveXObject e retornei false na cláusula de exceção. Agora está funcionando para
mim
1
@mch muitas coisas podem fazer isso. mas os níveis de segurança padrão não.
Tom Roggero
5

Detectar e incorporar Flash em um documento da web é uma tarefa surpreendentemente difícil.

Fiquei muito desapontado com a qualidade e a marcação não compatível com os padrões gerada tanto pelo SWFObject quanto pelas soluções da Adobe. Além disso, meu teste revelou que o atualizador automático da Adobe é inconsistente e não confiável.

A Biblioteca de detecção de Flash JavaScript (Detecção de Flash) e a Biblioteca do gerador de HTML Flash JavaScript (Flash TML) são uma solução de marcação legível, de fácil manutenção e compatível com os padrões.

- "Luke leu a fonte!"


fonte
4

Código para uma isFlashExistsvariável de linha :

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

Observe que existe uma alternativa como esta: swfobject.getFlashPlayerVersion();

trante
fonte
3

Veja a fonte em http://whatsmy.browsersize.com (linhas 14-120).

Aqui está o código do navegador cruzado abstraído em jsbin para detecção de flash apenas , funciona em: FF / IE / Safari / Opera / Chrome.

Ates Goral
fonte
Você pode fornecer algum código ou pelo menos um link de como você obteve a resposta em seu site?
hitautodestruct
@hitautodestruct Se você visualizar o código-fonte da página, a resposta estará diretamente ali, no topo do bloco JS.
Ates Goral
Então, essencialmente, estava falando sobre esse código (link jsbin)?
hitautodestruct
@hitautodestruct Sim, mais a detectObject()contraparte do IE.
Ates Goral
3

A respeito:

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

Se você está interessado em uma solução Javascript puro, aqui está o 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
fonte
1

Se você apenas deseja verificar se o flash está habilitado, isso deve ser o 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 o enabledPlugin , algum navegador móvel tem plug-in flash para ativar e irá acionar falso negativo.

bitinn
fonte
0

Para criar um objeto Flash compatível com o padrão (com JavaScript, no entanto), recomendo que você dê uma olhada em

Objetos Flash discretos (OVNIs)

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

Steve K
fonte
0

Criei um pequeno .swfque redireciona. Se o navegador estiver habilitado para flash, ele redirecionará.

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

Usando a biblioteca goog.require ('goog.userAgent.flash') do compilador Google Closure, criei essas 2 funções.

hasFlash booleano ()

Retorna se o navegador tiver 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 (versão)

Retorna se a versão do flash for maior que a versão fornecida

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)
}
galinhas
fonte