Jak mogę sprawdzić, czy Flash jest zainstalowany, a jeśli nie, wyświetlić ukryty element div, który poinformuje użytkownika?

88

Jak mogę użyć javascript / jQuery / etc, aby wykryć, czy Flash jest zainstalowany, a jeśli tak nie jest, wyświetlić div, który zawiera informacje informujące użytkownika, że ​​musi zainstalować Flash?

KingNestor
źródło

Odpowiedzi:

159

Jeśli swfobjectto nie wystarczy lub musisz stworzyć coś bardziej indywidualnego, spróbuj tego:

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

Działa z 7 i 8.

Drewid
źródło
2
działa to dobrze, jeśli chcesz tylko wykryć, czy jest zainstalowany i niekoniecznie wyświetlać plik SWF w obie strony.
ctrlShiftBryan
10
Musiałem to zmodyfikować, aby: var hasFlash = false; try {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
to nie zadziała w IE7, ponieważ nie testujesz części activexobject
Kevin,
1
Głosuj za użyciem 5 wierszy JavaScript zamiast używania całej biblioteki
Alex W
To zadziała w przypadku przeglądarki mobilnej z Androidem, takiej jak Firefox i Chrome?
Maniprakash Chinnasamy
104

Odpowiedź @ Drewid nie działa w moim Firefoksie 25, jeśli wtyczka flash jest właśnie wyłączona, ale zainstalowana.

Komentarz @ invertedSpear w tej odpowiedzi działał w przeglądarce Firefox, ale nie w żadnej wersji IE.

Więc połączyliśmy oba ich kod i otrzymaliśmy to. Przetestowano w Google Chrome 31, Firefox 25, IE 8-10. Dzięki Drewid i odwróconej włóczni :)

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
źródło
1
solidna odpowiedź. Dzięki dla ratownika życia :)
Gogol
1
Działa w przeglądarce Firefox 39 (03.08.2015).
Vladimir Vukanac
1
Nie działa, jeśli wtyczka jest dozwolona, ​​ale Flash jest wyraźnie zablokowany dla strony, którą sprawdzamy. Safari 8.0.8. W tym przypadku hasFlash nadal ma wartość true (powinno być false).
Eugenio,
Bardzo dobrze. Dzięki !
Koby Douek
1
krótkie i słodkie
Sohail Faruqui
18

Możesz użyć navigator.mimeTypes.

if (navigator.mimeTypes ["application/x-shockwave-flash"] == undefined)
    $("#someDiv").show ();
albertein
źródło
4

Powinieneś także móc używać ..

swfobject.getFlashPlayerVersion().major === 0

za pomocą swfobject-Plugin .

user3502163
źródło
swfobjectjest niezdefiniowana.
mikemaccana
2

Użyłem zestawu wykrywającego Adobe, pierwotnie zasugerowanego przez justpassinby. Ich system jest fajny, ponieważ wykrywa numer wersji i porównuje go z twoją „wymaganą wersją”

Jedną z wad jest to, że wyświetla alert pokazujący wykrytą wersję flasha, która nie jest zbyt przyjazna dla użytkownika. Nagle pojawia się okno z pozornie przypadkowymi liczbami.

Niektóre modyfikacje, które warto rozważyć:

  • usunąć alert
  • zmień go tak, aby zwracał obiekt (lub tablicę) --- pierwszy element to wartość logiczna prawda / fałsz dla „czy wymagana wersja została znaleziona na komputerze użytkownika” --- drugi element to rzeczywisty numer wersji znaleziony na komputerze użytkownika
Mikrofon
źródło
1

Bardzo bardzo zminimalizowana wersja http://www.featureblend.com/javascript-flash-detection-library.html (tylko boolowska detekcja flash)

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
źródło