Как я могу определить, установлен ли Flash, и если нет, отобразить скрытый div, который информирует пользователя?

Как я могу использовать javascript/jQuery/etc, чтобы определить, установлен ли Flash, и если это не так, отобразить div, содержащий информацию, информирующую пользователя о том, что ему необходимо установить flash?


person KingNestor    schedule 15.06.2009    source источник


Ответы (8)


Используйте swfobject. он заменяет div на flash, если он установлен. см.: http://code.google.com/p/swfobject/.

person Josh    schedule 15.06.2009

Если swfobject недостаточно или вам нужно создать что-то более индивидуальное, попробуйте следующее:

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

Работает с 7 и 8.

person Drewid    schedule 26.07.2010
comment
это хорошо работает, если вы просто хотите определить, установлен ли он, и не обязательно отображать swf в любом случае. - person ctrlShiftBryan; 14.10.2010
comment
Пришлось изменить это на: 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; } - person invertedSpear; 06.05.2011
comment
это не будет работать в IE7, так как вы не тестируете часть activexobject - person Kevin; 27.05.2011
comment
проголосуйте за использование 5 строк JavaScript вместо использования всей библиотеки - person Alex W; 17.06.2014
comment
Это будет работать для мобильного браузера Android, такого как Firefox и Chrome? - person Maniprakash Chinnasamy; 18.10.2014
comment
хорошее решение, но в случае улова я предпочитаю проверять: (typeof navigator.mimeTypes['application/x-shockwave-flash'] !== 'undefined') - person zooblin; 17.01.2016
comment
решение не работало для ubuntu14.04 firefox (44.0), но @inverrtedSpear с вашим решением для изменений работало нормально. - person Aameer; 08.02.2016
comment
Это работает только в том случае, если пользователь не установил Flash Player, но не работает, если он установлен, но деактивирован. - person Jose Ignacio Hita; 22.07.2016
comment
Что делать, если вспышка устарела? Safari иногда говорит, что он устарел и не будет работать, пока вы не обновите его. Как бы я это проверил? - person trainoasis; 02.09.2016

Ответ @Drewid не работал в моем Firefox 25, если флэш-плагин просто отключен, но установлен.

Комментарий @invertedSpear в этом ответе работал в Firefox, но не в любой версии IE.

Итак, объединили оба их кода и получили это. Протестировано в Google Chrome 31, Firefox 25, IE 8-10. Спасибо Drewid и 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;
  }
}
person Vigneshwaran    schedule 20.11.2013
comment
солидный ответ. Спасибо за спаситель :) - person Gogol; 19.07.2014
comment
Работает в Firefox 39 (03.08.2015). - person Vladimir Vukanac; 03.08.2015
comment
Это не работает, если плагин разрешен, но Flash явно заблокирован для проверяемого веб-сайта. Сафари 8.0.8. В этом случае hasFlash остается истинным (должно быть ложным). - person Eugenio; 07.09.2016
comment
Очень хорошо. Спасибо ! - person Koby Douek; 28.12.2016
comment
Больше не работает в Firefox 50+, протестированном в 2017 году, по-прежнему говорит «истина», когда я блокирую запуск флэш-памяти на веб-сайте. - person tmarois; 18.02.2017
comment
как мы потом избавляемся от объекта? - person 1Mayur; 02.04.2019
comment
похоже, что он занимает память и не освобождается каждый раз, когда этот код запускается. IE11 на win 7 конкретно - person 1Mayur; 02.04.2019
comment
коротко и мило - person Sohail Faruqui; 21.05.2020

Вы можете использовать navigator.mimeTypes.

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

jqplugin: http://code.google.com/p/jqplugin/

$.browser.flash == true
person mhenry1384    schedule 27.06.2012

Вы также должны быть в состоянии использовать..

swfobject.getFlashPlayerVersion().major === 0

с помощью плагина swfobject.

person user3502163    schedule 05.04.2014
comment
swfobject не определено. - person mikemaccana; 13.01.2015

Я использовал набор обнаружения Adobe, первоначально предложенный justpassinby. Их система удобна, потому что она определяет номер версии и сравнивает его для вас с вашей «требуемой версией».

Плохо то, что он делает предупреждение, показывающее обнаруженную версию flash, что не очень удобно для пользователя. Внезапно появляется окно с какими-то, казалось бы, случайными числами.

Некоторые модификации, которые вы, возможно, захотите рассмотреть:

  • удалить оповещение
  • измените его, чтобы он возвращал объект (или массив) --- первый элемент является логическим значением true/false для "была ли требуемая версия найдена на компьютере пользователя" --- второй элемент является фактическим номером версии, найденным на компьютере пользователя
person Mike    schedule 29.03.2011

Очень-очень уменьшенная версия http://www.featureblend.com/javascript-flash-detection-library.html (обнаружение только логических флэш-памяти)

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  
        }
person lucasgabmoreno    schedule 07.10.2015