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.


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.


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

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>        

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

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

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


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


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.


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

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

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.



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

}

}

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)
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.