Como posso detectar se o Flash está instalado e se não, exibir um div oculto que informa o usuário?

88

Como posso usar javascript / jQuery / etc para detectar se o Flash está instalado e, se não estiver, exibir um div que contém informações informando ao usuário que ele precisa instalar o flash?

KingNestor
fonte

Respostas:

159

Se swfobjectnão for suficiente ou se você precisar criar algo um pouco mais personalizado, tente o seguinte:

var hasFlash = false;
try {
    hasFlash = Boolean(new ActiveXObject('ShockwaveFlash.ShockwaveFlash'));
} catch(exception) {
    hasFlash = ('undefined' != typeof navigator.mimeTypes['application/x-shockwave-flash']);
}

Funciona com 7 e 8.

Drewid
fonte
2
isso funciona bem se você deseja apenas detectar se ele está instalado e não necessariamente exibir um swf de qualquer maneira.
ctrlShiftBryan
10
Tive que modificar isso para: var hasFlash = false; tente {var fo = (navigator.mimeTypes && navigator.mimeTypes ['application / x-shockwave-flash'])? navigator.mimeTypes ['application / x-shockwave-flash']. enabledPlugin: 0; if (fo) hasFlash = true; } catch (e) {if (navigator.mimeTypes ['application / x-shockwave-flash']! = undefined) hasFlash = true; } "
invertedSpear
1
isso não funcionará no IE7, já que você não está testando a parte activexobject
Kevin
1
voto positivo para usar 5 linhas de JavaScript em vez de usar uma biblioteca inteira
Alex W
Isso funcionará para o navegador móvel Android, como Firefox e Chrome?
Maniprakash Chinnasamy
105

A resposta de @Drewid não funcionou no meu Firefox 25 se o plug-in do flash acabou de ser desativado, mas instalado.

O comentário de @invertedSpear nessa resposta funcionou no firefox, mas não em qualquer versão do IE.

Então, combinei o código deles e consegui isso. Testado em Google Chrome 31, Firefox 25, IE 8-10. Obrigado, Drewid e invertedSpear :)

var hasFlash = false;
try {
  var fo = new ActiveXObject('ShockwaveFlash.ShockwaveFlash');
  if (fo) {
    hasFlash = true;
  }
} catch (e) {
  if (navigator.mimeTypes
        && navigator.mimeTypes['application/x-shockwave-flash'] != undefined
        && navigator.mimeTypes['application/x-shockwave-flash'].enabledPlugin) {
    hasFlash = true;
  }
}
Vigneshwaran
fonte
1
resposta sólida. Thnx for the life saver :)
Gogol
1
Funciona no Firefox 39 (03/08/2015).
Vladimir Vukanac
1
Não funciona se o plug-in é permitido, mas o Flash está explicitamente bloqueado para o site que estamos verificando. Safari 8.0.8. Nesse caso, hasFlash ainda é verdadeiro (deveria ser falso).
Eugenio
Muito agradável. Obrigado !
Koby Douek
1
curto e doce
Sohail Faruqui
18

Você pode usar navigator.mimeTypes.

if (navigator.mimeTypes ["application/x-shockwave-flash"] == undefined)
    $("#someDiv").show ();
albertein
fonte
4

Você também deve ser capaz de usar ..

swfobject.getFlashPlayerVersion().major === 0

com o plug-in swfobject .

user3502163
fonte
swfobjecté indefinido.
mikemaccana
2

Usei o kit de detecção da Adobe, originalmente sugerido por justpassinby. O sistema deles é bom porque detecta o número da versão e o compara para você com a sua 'versão necessária'

Uma coisa ruim é que ele faz um alerta mostrando a versão do flash detectada, o que não é muito amigável. De repente, uma caixa aparece com alguns números aparentemente aleatórios.

Algumas modificações que você pode querer considerar:

  • remova o alerta
  • altere-o para que retorne um objeto (ou array) --- o primeiro elemento é booleano true / false para "a versão necessária foi encontrada na máquina do usuário" --- o segundo elemento é o número da versão real encontrada na máquina do usuário
Mike
fonte
1

Versão muito reduzida de http://www.featureblend.com/javascript-flash-detection-library.html (somente detecção de flash booleano)

var isFlashInstalled = (function(){
var b=new function(){var n=this;n.c=!1;var a="ShockwaveFlash.ShockwaveFlash",r=[{name:a+".7",version:function(n){return e(n)}},{name:a+".6",version:function(n){var a="6,0,21";try{n.AllowScriptAccess="always",a=e(n)}catch(r){}return a}},{name:a,version:function(n){return e(n)}}],e=function(n){var a=-1;try{a=n.GetVariable("$version")}catch(r){}return a},i=function(n){var a=-1;try{a=new ActiveXObject(n)}catch(r){a={activeXError:!0}}return a};n.b=function(){if(navigator.plugins&&navigator.plugins.length>0){var a="application/x-shockwave-flash",e=navigator.mimeTypes;e&&e[a]&&e[a].enabledPlugin&&e[a].enabledPlugin.description&&(n.c=!0)}else if(-1==navigator.appVersion.indexOf("Mac")&&window.execScript)for(var t=-1,c=0;c<r.length&&-1==t;c++){var o=i(r[c].name);o.activeXError||(n.c=!0)}}()};  
return b.c;
    })();

if(isFlashInstalled){
    // Do something with flash
    }else{
    // Don't use flash  
        }
lucasgabmoreno
fonte