Кроссбраузерное определение Flash в Javascript

97

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

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

Ответы:

94

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

Макс Стюарт
источник
То же самое и здесь, SWFObject отлично работает и для меня (раньше назывался FlashObject, но Adobe шипела)
davr 01
17
С jQuery и swfobject это код, который я использовал для добавления имен html-классов в стиле Modernizr: $('html').addClass(typeof swfobject !== 'undefined' && swfobject.getFlashPlayerVersion().major !== 0 ? 'flash' : 'no-flash');
Jon z
2
Если кому-то интересно, я тестировал некоторые из этих случаев на jsperf. SWFObject вышел быстрее всех.
hitautodestruct
Проверьте наличие флэш-памяти с помощью swfobject со значением " if( swfobject.hasFlashPlayerVersion("8.0") ) { }Выдает false", если флэш-память не установлена. Это минимальная требуемая версия флеш-плеера.
Кай Ноак
Hitautodestruct, конечно, SWFObject вышел быстрее всех. Фактическое обнаружение выполняется только один раз при загрузке страницы, а затем возвращаются сохраненные значения при каждом вызове. Так как в конечном итоге вы будете использовать и другие методы, сравнение производительности не является справедливым.
Акрикос
109

Я согласен с Максом Стюартом . 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.

Если у посетителя нет flash, он сообщит о версии flash "0.0.0", поэтому, если вы просто хотите узнать, есть ли у него flash вообще, используйте:

if(swfobject.hasFlashPlayerVersion("1"))
{
    alert("You have flash!");
}
else
{
    alert("You do not flash :-(");
}
Эндрю Энсли
источник
9
здорово. Я изо всех сил пытался найти действительно простой пример простого обнаружения любой установленной вспышки. Спасибо.
Брайан Скотт,
2
Спасибо за этот пример! Требуется запустить какой-то другой javascript, если у пользователя не было флэш-памяти и в любом случае он уже использовал swfobject для встраивания. :)
kontur
существует проблема, вам нужно будет включить проверку SWFobject, иначе вы получите сообщение об ошибке, потому что undefined не имеет функции с именем hasFlashPlayerVersion (). if(SWFobject && SWFobject.hasFlashPlayerVersion("1")) { // code here }
E-comm
Очевидно, мой код предполагает, что у вас загружен SWFObject. Это похоже на использование jQuery или любой другой библиотеки для решения. Это не сработает, если вы не включите его, и было бы много дополнительной логики раздувания / выполнения, если бы вы проверяли наличие библиотеки каждый раз, когда вы ее использовали.
Эндрю Энсли
@Andrew: Я понимаю, что этому посту четыре с половиной года, но он не так очевиден для тех, кто не привык работать с SWFObject. Я использую надстройку Angular для загрузки файлов, которая использует Flash, если HTML5 не поддерживается, и хотел отображать сообщение, если Flash не обнаружен. Для меня не было очевидно, что SWFObject - это библиотека, которую нужно загрузить, или что она загружалась автоматически при установке Flash Player в браузере. Спасибо за пояснение в вашем комментарии, но, пожалуйста, подумайте о добавлении этого в свой ответ.
Travesty3
36

Я знаю, что это старый пост, но я долго искал и ничего не нашел.
Я реализовал библиотеку обнаружения 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+!
Балинт
Кажется законным - последняя версия работает неплохо или я. Спасибо, продолжайте в том же духе!
poitroae 05
Спасибо. Мне нравится эта библиотека, потому что она не требует swf часового механизма. Надеюсь, вы будете обновлять его!
Ник Ван Брант,
Это должен быть ответ ... :)
sabinonstack
32

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

// ==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");
Stewe
источник
3
это решение, на наш взгляд, самое чистое. мы искали метод, свободный от swfobject / library, чтобы определить, установлена ​​ли флеш-память. это трюк. Спасибо!
anonymous-one
Отличное решение :) .. вы спасли мне день.
Ариндам Пол
Не жаловаться на @ anonymous-one, но разве это решение также не использует библиотеку (в частности, goog.userAgent.flashиз компилятора Google Closure)? Я просто хочу убедиться, что не упускаю здесь каких-то нюансов.
Эндрю Энсли
мы не используем первый фрагмент. мы используем второй. который "свободен от библиотеки".
anonymous-one
Это самый чистый и исчерпывающий ответ, который я когда-либо видел, который, кажется, охватывает все браузеры. Спасибо.
HartleySan, 03
22

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

var hasFlash = function() {
    return (typeof navigator.plugins == "undefined" || navigator.plugins.length == 0) ? !!(new ActiveXObject("ShockwaveFlash.ShockwaveFlash")) : navigator.plugins["Shockwave Flash"];
};
Том Роггеро
источник
2
Красиво и коротко, мне это нравится!
Майк Нельсон
@ greg.kindel Я использую его уже давно, и он работает для тех версий, которые я тестировал. Хотя может быть полезно, если вы укажете версию ОС и версию IE;)
Tom Roggero
не работает в IE 9.0.17 под Win 7 с сообщением об ошибке: «Сервер автоматизации не может создать объект». Похоже, это зависит от установки. На некоторых компьютерах это работает, на некоторых нет.
Zensursula
@Zensursula: я использовал try {} catch () вокруг ActiveXObject и вернул false в предложении исключения. Теперь это работает и для меня
Zensursula
1
@mch многое может сделать. но уровни безопасности по умолчанию не должны.
Том Роггеро
7

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

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

Йери Себрехтс
источник
6
Хотел бы просто отметить: SWFObject является преемником комплекта обнаружения Adobe, ссылка на который приведена здесь.
Эндрю Энсли
5

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

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

Библиотека JavaScript Flash Detection (Flash Detect) и JavaScript Flash HTML Generator Library (Flash TML) представляют собой удобочитаемое, удобное в обслуживании и соответствующее стандартам решение для разметки.

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


источник
4

Код для одной линейной 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();

транте
источник
3

См. Исходный код на http://whatsmy.browsersize.com (строки 14–120).

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

Атес Горал
источник
Можете ли вы предоставить код или хотя бы ссылку на то, как вы получили ответ на своем сайте?
hitautodestruct
@hitautodestruct Если вы просматриваете исходный код страницы, ответ находится прямо там, в верхней части блока JS.
Атес Горал
Так по существу говорили об этом коде (ссылка jsbin)?
hitautodestruct
@hitautodestruct Да, плюс detectObject()аналог для IE.
Атес Горал
3

что о:

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;
};
Мартин Боммели
источник
3

Если вас интересует решение на чистом 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;
}
бизи
источник
1

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

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, активируемый касанием, и это вызывает ложноотрицательный результат.

Bitinn
источник
0

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

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

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

Стив К
источник
0

Создал небольшую .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");

}

}
Майк
источник
0

Используя компилятор 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)
}
куры
источник