Перехресне виявлення Flash браузера в Javascript


96

Хтось має приклад сценарію, який може надійно працювати в IE / Firefox, щоб виявити, чи може браузер відображати вбудований флеш-вміст. Кажу надійно, бо знаю, що це неможливо 100% часу.


Я бачу, що ви вже прийняли відповідь joeri, але вам справді слід серйозно розглянути SWFObject. Він набагато міцніший і менш пухкий.
матовий lohkamp

Відповіді:


94

SWFObject дуже надійний. Я використовую його без проблем досить давно.


Тут же SWFObject чудово працює і для мене (раніше його називали FlashObject, але Adobe кинув
шипучу форму

17
З допомогою JQuery і SWFObject, це код , який я використовував для додавання імен HTML класу Modernizr стилю: $('html').addClass(typeof swfobject !== 'undefined' && swfobject.getFlashPlayerVersion().major !== 0 ? 'flash' : 'no-flash');
Джон г

2
Якщо когось цікавить, я перевірив деякі з цих випадків на jsperf. SWFObject вийшов найшвидшим.
hitautodestruct

Перевірте наявність спалаху за допомогою swfobject з Throw 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.

Якщо відвідувач не має спалаху, він повідомить про флеш-версію "0.0.0", тож якщо ви просто хочете дізнатися, чи є у них спалах взагалі, використовуйте:

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

9
чудовий. Я намагався знайти дійсно простий приклад просто виявити встановлений спалах. Дякую.
Брайан Скотт

2
Дякуємо за цей приклад! Потрібно запустити інший javascript, якщо користувач був без флеша і вже використовував swfobject для вбудування. :)
kontur

з цим виникає проблема, вам потрібно буде включити чек на SWFobject або ви отримаєте помилку, оскільки у невизначеному немає функції, яка називається hasFlashPlayerVersion (). if(SWFobject && SWFobject.hasFlashPlayerVersion("1")) { // code here }
E-com

Очевидно, мій код передбачає, що у вас завантажений SWFObject. Це так само, як використовувати jQuery або будь-яку іншу бібліотеку для рішення. Це не спрацює, якщо ви не включите його, і було б багато додаткової логіки роздуття / виконання, якщо ви перевіряли наявність бібліотеки кожного разу, коли користувались нею.
Ендрю Енслі

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

36

Я знаю, що це стара публікація, але я деякий час шукав і нічого не знайшов.
Я реалізував бібліотеку виявлення Flash Flash . Він працює дуже добре і документально підтверджений для швидкого використання. Це буквально зайняло у мене 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

Здається законним - остання версія працює досить добре чи я. Дякую, продовжуйте хорошу роботу!
poitroae

Дякую. Мені подобається ця бібліотека, оскільки для неї не потрібен дозорний 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, але хіба це рішення також не використовує бібліотеку (зокрема, goog.userAgent.flashвід закриття компілятора Google)? Я просто хочу переконатися, що тут я не пропускаю певної нюансованої різниці.
Ендрю Енслі

ми не використовуємо перший фрагмент. ми використовуємо 2-у. що "бібліотека безкоштовна".
анонімний-один

Це найчистіша і найгрунтовніша відповідь, яку я бачив, яка охоплює всі браузери. Дякую.
HartleySan

22

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

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

2
Приємно і коротко, мені це подобається!
Майк Нельсон

@ greg.kindel Я давно його використовую, і він працює для тестованих версій. Може бути корисним, якщо ви також вкажете версію ОС та IE;)
Том Роггеро,

не працює в IE 9.0.17 під Win 7 з повідомленням про помилку: "Сервер автоматизації не може створити об'єкт". Здається, це залежить від установки. На деяких комп’ютерах він працює, а на деяких - ні.
Zensursula

@Zensursula: Я поставив спробу {} catch () навколо ActiveXObject і повернув значення false у пункті виключення. Зараз це працює і на мене
Зенсурсула

1
@mch тонна речей могла це зробити. але рівень безпеки за замовчуванням не повинен.
Том Роджеро



5

Виявлення та вбудовування Flash у веб-документ - це напрочуд складне завдання.

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

Бібліотека виявлення Flash Flash (Flash Detect) та бібліотека генераторів Flash Flash HTML (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.
Ates Goral

Так по суті говорили про цей код (посилання jsbin)?
hitautodestruct

@hitautodestruct Так, плюс detectObject()аналог IE.
Ates Goral

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-рішенні, ось таке, яке я копіюю з Brett :

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;

}

Примітка. Уникайте перевірки увімкненого плагіна , у деяких браузерах мобільних пристроїв є плагін, який увімкнено, і він спричинить помилковий негатив.



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 функції.

boolean hasFlash ()

Повертається, якщо у браузері спалах.

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

boolean isFlashVersion (версія)

Повертається, якщо версія flash більше, ніж надана версія

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.