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


97

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


Я вижу, вы уже приняли ответ Джоэри, но вам действительно следует серьезно подумать о 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");

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 многое может сделать. но уровни безопасности по умолчанию не должны.
Том Роггеро



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



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)
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.