¿Cómo puedo detectar si Flash está instalado y si no, mostrar un div oculto que informa al usuario?

88

¿Cómo puedo usar javascript / jQuery / etc para detectar si Flash está instalado y si no lo está, mostrar un div que contiene información que informa al usuario que necesita instalar flash?

ReyNestor
fuente

Respuestas:

159

Si swfobjectno es suficiente o si necesita crear algo un poco más personalizado, intente esto:

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

Funciona con 7 y 8.

Drewid
fuente
2
esto funciona bien si solo desea detectar si está instalado y no necesariamente mostrar un swf de ninguna manera.
ctrlShiftBryan
10
Tuve que modificar esto a: var hasFlash = false; intente {var fo = (navigator.mimeTypes && navigator.mimeTypes ['aplicación / x-shockwave-flash'])? navigator.mimeTypes ['aplicación / x-shockwave-flash']. enabledPlugin: 0; if (fo) hasFlash = true; } catch (e) {if (navigator.mimeTypes ['application / x-shockwave-flash']! = undefined) hasFlash = true; } "
invertedSpear
1
que no funcionará en IE7, ya que no está probando la parte activexobject
Kevin
1
voto positivo por usar 5 líneas de JavaScript en lugar de usar una biblioteca completa
Alex W
¿Esto funcionará para el navegador móvil Android como Firefox y Chrome?
Maniprakash Chinnasamy
105

La respuesta de @ Drewid no funcionó en mi Firefox 25 si el complemento flash está deshabilitado pero instalado.

El comentario de @ invertedSpear en esa respuesta funcionó en Firefox pero no en ninguna versión de IE.

Así que combinó ambos códigos y obtuve esto. Probado en Google Chrome 31, Firefox 25, IE 8-10. Gracias Drewid y 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
fuente
1
respuesta sólida. Gracias por el salvavidas :)
Gogol
1
Funciona en Firefox 39 (2015-08-03).
Vladimir Vukanac
1
No funciona si se permiten complementos, pero Flash está bloqueado explícitamente para el sitio web que estamos revisando. Safari 8.0.8. En este caso hasFlash sigue siendo verdadero (debería ser falso).
Eugenio
Muy agradable. Gracias !
Koby Douek
1
corto y dulce
Sohail Faruqui
18

Puede utilizar navigator.mimeTypes.

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

También debería poder utilizar ..

swfobject.getFlashPlayerVersion().major === 0

con el complemento swfobject .

usuario3502163
fuente
swfobjectes indefinido.
mikemaccana
2

Usé el kit de detección de Adobe, originalmente sugerido por justpassinby. Su sistema es bueno porque detecta el número de versión y lo compara con su 'versión requerida'

Una cosa mala es que genera una alerta que muestra la versión detectada de flash, lo que no es muy fácil de usar. De repente, aparece un cuadro con algunos números aparentemente aleatorios.

Algunas modificaciones que quizás desee considerar:

  • eliminar la alerta
  • cámbielo para que devuelva un objeto (o matriz) --- el primer elemento es booleano verdadero / falso para "se encontró la versión requerida en la máquina del usuario" --- el segundo elemento es el número de versión real que se encuentra en la máquina del usuario
Miguel
fuente
1

Versión muy muy reducida de http://www.featureblend.com/javascript-flash-detection-library.html (solo detección de flash booleana)

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
fuente