Кроссбраузерное обнаружение Flash в Javascript

Есть ли у кого-нибудь пример сценария, который может надежно работать в IE / Firefox, чтобы определить, способен ли браузер отображать встроенный флэш-контент. Я говорю достоверно, потому что знаю, что это невозможно в 100% случаев.

Я вижу, вы уже приняли ответ Джоэри, но вам действительно следует серьезно подумать о swfObject. Он намного прочнее и менее громоздкий.

matt lohkamp 02.10.2008 12:32
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
97
1
104 822
16
Перейти к ответу Данный вопрос помечен как решенный

Ответы 16

Может быть, здесь может помочь комплект обнаружения flash-плеера Adobe?

http://www.adobe.com/products/flashplayer/download/detection_kit/

Хотел бы просто отметить: SWFObject является преемником комплекта обнаружения Adobe, ссылка на который приведена здесь.

Andrew Ensley 30.12.2010 22:34
Ответ принят как подходящий

SWFObject очень надежен. Пользуюсь без проблем довольно давно.

То же самое и у меня, SWFObject тоже отлично работает (раньше назывался FlashObject, но Adobe шипела)

davr 02.10.2008 00:00

С jQuery и swfobject я использовал этот код для добавления имен html-классов в стиле Modernizr: $('html').addClass(typeof swfobject !== 'undefined' && swfobject.getFlashPlayerVersion().major !== 0 ? 'flash' : 'no-flash');

Jon z 24.08.2012 17:50

Если кому интересно я проверил некоторые из этих случаев на jsperf. SWFObject вышел быстрее всех.

hitautodestruct 20.12.2012 12:37

Проверить наличие флэш-памяти с помощью swfobject с if ( swfobject.hasFlashPlayerVersion("8.0") ) { }. Выдает false, если флэш-память не установлена. Номер - это минимальная необходимая версия флеш-плеера.

Avatar 31.03.2014 00:59

Hitautodestruct, конечно, SWFObject вышел быстрее всех. Фактическое обнаружение выполняется только один раз при загрузке страницы, а затем возвращаются сохраненные значения при каждом вызове. Поскольку таким образом вы в конечном итоге использовали бы и другие методы, сравнение производительности не является справедливым.

Akrikos 19.08.2014 18:24

Хочу отметить, что Adobe использует SWFObject для сообщения о пользовательской версии Flash на adobe.com/software/flash/about.

Michael Thompson 20.11.2015 17:44

Просмотрите источник в http://whatsmy.browsersize.com (строки 14-120).

Вот абстрактный кроссбраузер код на jsbin для только обнаружение вспышки, работает на: FF / IE / Safari / Opera / Chrome.

Можете ли вы предоставить код или хотя бы ссылку на то, как вы получили ответ на своем сайте?

hitautodestruct 18.12.2012 19:04

@hitautodestruct Если вы просматриваете исходный код страницы, ответ находится прямо там, в верхней части блока JS.

Ates Goral 18.12.2012 22:14

Так по сути речь шла о этот код (ссылка jsbin)?

hitautodestruct 19.12.2012 13:28

@hitautodestruct Да, плюс аналог detectObject() для IE.

Ates Goral 19.12.2012 19:15

Библиотека обнаружения Flash-памяти JavaScript Карла Йестрау, здесь:

http://www.featureblend.com/javascript-flash-detection-library.html

... может быть то, что вы ищете.

Обнаружение и внедрение Flash в веб-документ - удивительно сложная задача.

Я был очень разочарован качеством и нестандартной разметкой, созданной как из SWFObject, так и из решений Adobe. Кроме того, мое тестирование показало, что автоматическое обновление Adobe непоследовательно и ненадежно.

Библиотека обнаружения Flash-содержимого JavaScript (обнаружение Flash-содержимого) и Библиотека JavaScript Flash HTML Generator (Flash TML) - это удобочитаемые, удобные в обслуживании и соответствующие стандартам решения для разметки.

- «Люк, читай первоисточник!»

Чтобы создать объект Flash, соответствующий стандарту (однако, с помощью JavaScript), я рекомендую вам взглянуть на

Ненавязчивая вспышка объектов (НЛО)

http://www.bobbyvandersluis.com/ufo/index.html

Я согласен с Макс Стюарт. SWFObject - это то, что вам нужно. Я хотел бы дополнить его ответ примером кода. Это должно помочь вам начать:

Убедитесь, что вы включили файл swfobject.js (получите здесь):

<script type = "text/javascript" src = "swfobject.js"></script>

Тогда используйте это так:

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

Замените «9.0.115» любой необходимой минимальной версией флэш-памяти. В качестве примера я выбрал 9.0.115, потому что в этой версии добавлена ​​поддержка h.264.

Если у посетителя нет флэш-памяти, он сообщит о флэш-версии «0.0.0», поэтому, если вы просто хотите узнать, есть ли у них флэш-память вообще, используйте:

if (swfobject.hasFlashPlayerVersion("1"))
{
    alert("You have flash!");
}
else
{
    alert("You do not flash :-(");
}

Отлично. Я изо всех сил пытался найти действительно простой пример простого обнаружения любой установленной вспышки. Спасибо.

Brian Scott 13.03.2011 13:58

Спасибо за этот пример! Требуется запустить какой-то другой javascript, если у пользователя не было флэш-памяти и в любом случае он уже использовал swfobject для встраивания. :)

kontur 09.03.2012 16:15

существует проблема, вам нужно будет включить проверку SWFobject, иначе вы получите сообщение об ошибке, потому что undefined не имеет функции с именем hasFlashPlayerVersion (). if (SWFobject && SWFobject.hasFlashPlayerVersion("1")) { // code here }

E-comm 26.04.2015 20:41

Очевидно, мой код предполагает, что у вас загружен SWFObject. Это похоже на использование jQuery или любой другой библиотеки для решения. Это не сработает, если вы не включите его, и было бы много дополнительной логики раздувания / выполнения, если бы вы проверяли библиотеку каждый раз, когда вы ее использовали.

Andrew Ensley 26.04.2015 21:19

@Andrew: Я понимаю, что этому посту четыре с половиной года, но это не так очевидно для тех, кто не привык работать с SWFObject. Я использую надстройку Angular для загрузки файлов, которая использует Flash, если HTML5 не поддерживается, и хотел отображать сообщение, если Flash не обнаружен. Для меня не было очевидно, что SWFObject - это библиотека, которую нужно загрузить, или что она загружалась автоматически при установке Flash Player в браузере. Спасибо за пояснение в вашем комментарии, но, пожалуйста, подумайте о том, чтобы добавить его в свой ответ.

Travesty3 11.06.2015 06:40

@ Travesty3 честная точка. Я не думал об этом. Ответ обновлен.

Andrew Ensley 12.06.2015 19:25

Я знаю, что это старый пост, но я долго искал и ничего не нашел. Я реализовал Библиотека обнаружения Flash-памяти JavaScript. Он работает очень хорошо и задокументирован для быстрого использования. Это заняло у меня буквально 2 минуты. Вот код, который я написал в шапке:

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

теперь он не работает в Chrome и Firefox 6+!

balint 11.10.2011 02:41

Кажется законным - последняя версия работает неплохо, или я. Спасибо, продолжайте в том же духе!

poitroae 05.02.2013 19:46

Спасибо. Мне нравится эта библиотека, потому что она не требует swf-файла часового типа. Надеюсь, вы будете обновлять его!

Nick Van Brunt 31.12.2013 01:24

Это должен быть ответ ... :)

sabinonstack 09.11.2016 16:49

Вы можете использовать компилятор закрытия для генерации небольшого кроссбраузерного обнаружения флэш-памяти:

// ==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');
}

в результате получается следующий "скомпилированный" код:

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

это решение, на наш взгляд, самое чистое. мы искали метод, свободный от swfobject / library, чтобы определить, установлена ​​ли флеш-память. это трюк. Благодарность!

anonymous-one 10.05.2012 10:53

Замечательное решение :) .. вы спасли мне день.

Arindam Paul 18.10.2012 16:48

Не жаловаться @ anonymous-one, но разве это решение также не использует библиотеку (в частности, goog.userAgent.flash из Google Closure Compiler)? Я просто хочу убедиться, что я не упускаю здесь какую-то нюансную разницу.

Andrew Ensley 07.08.2013 20:13

мы не используем первый фрагмент. мы используем второй. который "свободен от библиотеки".

anonymous-one 08.08.2013 00:59

Это самый чистый и исчерпывающий ответ, который я когда-либо видел, который, кажется, охватывает все браузеры. Спасибо.

HartleySan 03.10.2013 17:07

Вы также можете увидеть унифицированную версию этого скомпилированного кода, включая некоторые полезные комментарии, здесь: code.google.com/p/doctype-mirror/wiki/ArticleDetectFlash

James M. Greene 21.11.2013 00:32

Минимальная версия, которую я когда-либо использовал (не проверяет версию, только плагин Flash):

var hasFlash = function() {
    return (typeof navigator.plugins == "undefined" || navigator.plugins.length == 0) ? !!(new ActiveXObject("ShockwaveFlash.ShockwaveFlash")) : navigator.plugins["Shockwave Flash"];
};

Красиво и коротко, мне это нравится!

mike nelson 16.01.2013 08:27

@ greg.kindel Я использую его уже давно, и он работает для тех версий, которые я тестировал. Может быть полезно, если вы укажете версию ОС и версию IE;)

Tom Roggero 25.02.2013 09:27

не работает в IE 9.0.17 под Win 7 с сообщением об ошибке: «Сервер автоматизации не может создать объект». Похоже, это зависит от установки. На некоторых компьютерах это работает, на некоторых нет.

Zensursula 17.06.2013 20:32

@Zensursula: я использовал try {} catch () вокруг ActiveXObject и возвращал false в предложении исключения. Теперь это работает и для меня

Zensursula 17.06.2013 20:44

Это может вызвать ошибку в IE в зависимости от его настроек безопасности.

mch 13.04.2015 20:23

@mch многое может сделать. но уровни безопасности по умолчанию не должны.

Tom Roggero 14.04.2015 02:25

Нет, не по умолчанию, вы правы. Ошибка появилась в IE8 в Windows 7, когда сеть была настроена как «Рабочая среда» (а не домашняя сеть).

mch 14.04.2015 10:47

Код для переменной isFlashExists с одним вкладышем:

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

Обратите внимание, что есть альтернатива, подобная этой: swfobject.getFlashPlayerVersion();

Если вы просто хотите проверить, включена ли вспышка, этого должно быть достаточно.

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;

}

Примечание: избегайте проверки enabledPlugin, в некоторых мобильных браузерах есть подключаемый модуль flash, активируемый касанием, и он будет вызывать ложноотрицательный результат.

Создали небольшой .swf, который перенаправляет. Если в браузере включен флэш-диск, он выполнит перенаправление.

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

}

}

что о:

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

Если вас интересует решение на чистом Javascript, вот то, что я скопировал из Бретт:

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

Используя компилятор Google Closure goog.require ('goog.userAgent.flash'), я создал эти 2 функции.

логическое hasFlash ()

Возвращает, если в браузере есть 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;
}

логическое isFlashVersion (версия)

Возвращает, если версия флеш-памяти больше указанной.

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

Другие вопросы по теме