Wykrywanie Flasha w różnych przeglądarkach w Javascript

97

Czy ktoś ma przykład skryptu, który może działać niezawodnie w przeglądarce IE / Firefox, aby wykryć, czy przeglądarka jest w stanie wyświetlać osadzoną zawartość flash. Mówię rzetelnie, bo wiem, że to niemożliwe w 100% przypadków.

Ta01
źródło
Widzę, że już zaakceptowałeś odpowiedź Joeri, ale naprawdę powinieneś poważnie rozważyć swfObject. Jest dużo bardziej wytrzymały i mniej rozdęty.
Matt Lohkamp

Odpowiedzi:

94

SWFObject jest bardzo niezawodny. Używałem go bez problemu od dłuższego czasu.

Max Stewart
źródło
To samo tutaj, SWFObject działa również dla mnie świetnie (kiedyś nazywał się FlashObject, ale Adobe rzucił hissy fit)
davr
17
W przypadku jQuery i swfobject jest to kod, którego użyłem do dodania nazw klas html w stylu Modernizr: $('html').addClass(typeof swfobject !== 'undefined' && swfobject.getFlashPlayerVersion().major !== 0 ? 'flash' : 'no-flash');
Jon z
2
Jeśli ktoś jest zainteresowany, przetestowałem niektóre z tych przypadków na jsperf. SWFObject wyszedł najszybciej.
hitautodestruct
Sprawdź, czy lampa błyskowa if( swfobject.hasFlashPlayerVersion("8.0") ) { }nie jest zainstalowana, używając swfobject z opcją Zgłasza false. Liczba to minimalna wymagana wersja Flash Playera.
Kai Noack,
hitautodestruct, oczywiście SWFObject wyszedł najszybciej. Faktyczne wykrywanie następuje tylko raz podczas ładowania strony, a następnie zwraca wartości, które przechowuje przy każdym wywołaniu. Ponieważ w ten sposób ostatecznie użyjesz również innych metod, porównanie wydajności nie jest sprawiedliwym porównaniem.
Akrikos,
109

Zgadzam się z Maxem Stewartem . SWFObject to droga do zrobienia. Chciałbym uzupełnić jego odpowiedź przykładem kodu. To powinno Ci pomóc:

Upewnij się, że dołączyłeś swfobject.jsplik (pobierz go tutaj ):

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

Następnie użyj tego w ten sposób:

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

Zastąp „9.0.115” dowolną minimalną wersją Flash, której potrzebujesz. Jako przykład wybrałem 9.0.115, ponieważ jest to wersja, która dodała obsługę h.264.

Jeśli odwiedzający nie ma Flasha, zgłosi wersję flash „0.0.0”, więc jeśli chcesz tylko wiedzieć, czy w ogóle ma flasha, użyj:

if(swfobject.hasFlashPlayerVersion("1"))
{
    alert("You have flash!");
}
else
{
    alert("You do not flash :-(");
}
Andrew Ensley
źródło
9
świetny. Starałem się znaleźć naprawdę prosty przykład prostego wykrywania zainstalowanej pamięci flash. Dzięki.
Brian Scott,
2
Dzięki za ten przykład! Potrzebne do uruchomienia innego javascript, jeśli użytkownik nie miał Flasha i i tak już używał swfobject do osadzania. :)
kontur
jest z tym problem, będziesz musiał dołączyć sprawdzenie SWFobject lub pojawi się błąd, ponieważ undefined nie ma funkcji o nazwie hasFlashPlayerVersion (). if(SWFobject && SWFobject.hasFlashPlayerVersion("1")) { // code here }
Komunikacja elektroniczna
Oczywiście mój kod zakłada, że ​​masz załadowany SWFObject. To tak, jak użycie jQuery lub dowolnej innej biblioteki jako rozwiązania. Nie zadziała, jeśli go nie uwzględnisz, i byłoby dużo dodatkowej logiki wzdęcia / wykonywania, gdybyś sprawdzał bibliotekę za każdym razem, gdy jej używasz.
Andrew Ensley
@Andrew: Zdaję sobie sprawę, że ten post ma cztery i pół roku, ale nie jest to takie oczywiste dla tych, którzy nie są przyzwyczajeni do pracy z SWFObject. Używam dodatku Angular do przesyłania plików, który korzysta z Flasha, jeśli HTML5 nie jest obsługiwany, i chciałem wyświetlić komunikat, jeśli Flash nie został wykryty. Nie było dla mnie oczywiste, że SWFObject jest biblioteką, która musi zostać załadowana, lub że została automatycznie załadowana poprzez instalację Flash Playera w przeglądarce. Dziękujemy za wyjaśnienie w komentarzu, ale rozważ dodanie go do odpowiedzi.
Travesty3,
36

Wiem, że to stary post, ale szukałem przez jakiś czas i nic nie znalazłem.
Zaimplementowałem bibliotekę JavaScript Flash Detection Library . Działa bardzo dobrze i jest udokumentowany do szybkiego użycia. Dosłownie zajęło mi to 2 minuty. Oto kod, który napisałem w nagłówku:

<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>        
Jon Clark
źródło
teraz nie działa w Chrome i Firefox 6+!
balint
Wydaje się słuszne - najnowsza wersja działa całkiem nieźle lub ja. Dziękuję, kontynuujcie dobrą robotę!
poitroae
Dzięki. Podoba mi się ta biblioteka, ponieważ nie wymaga pliku SWF wartownika. Mam nadzieję, że będziesz go aktualizować!
Nick Van Brunt
To powinna być odpowiedź ... :)
sabinonstack
32

Możesz użyć kompilatora zamykania, aby wygenerować małe wykrywanie flashowania w różnych przeglądarkach:

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

co skutkuje następującym „skompilowanym” kodem:

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");
gulasz
źródło
3
to rozwiązanie jest naszym zdaniem najczystsze. szukaliśmy wolnej od swfobject / biblioteki metody wykrywania, czy flash jest zainstalowany. to załatwia sprawę. dzięki!
anonimowy - jeden z
Niesamowite rozwiązanie :) .. uratowałeś mi dzień.
Arindam Paul
Nie narzekać @ anonymous-one, ale czy to rozwiązanie nie korzysta również z biblioteki (konkretnie goog.userAgent.flashz Google's Closure Compiler)? Chcę się tylko upewnić, że nie brakuje mi tutaj jakiejś niuansowej różnicy.
Andrew Ensley,
nie używamy pierwszego fragmentu. używamy 2nd. który jest „wolny od biblioteki”.
anonimowy-jeden
To najczystsza i najdokładniejsza odpowiedź, jaką widziałem, która wydaje się obejmować wszystkie przeglądarki. Dziękuję Ci.
HartleySan
22

Minimalna wersja, z której kiedykolwiek korzystałem (nie sprawdza wersji, tylko wtyczka Flash):

var hasFlash = function() {
    return (typeof navigator.plugins == "undefined" || navigator.plugins.length == 0) ? !!(new ActiveXObject("ShockwaveFlash.ShockwaveFlash")) : navigator.plugins["Shockwave Flash"];
};
Tom Roggero
źródło
2
Ładnie i krótko, podoba mi się!
mike nelson,
@ greg.kindel Od tamtej pory używam go od dawna i działa w testowanych wersjach. Może się jednak
przydać
nie działa w IE 9.0.17 pod Win 7 z komunikatem o błędzie: „Serwer automatyzacji nie może utworzyć obiektu”. Wydaje się, że zależy to od instalacji. Na niektórych komputerach działa, na innych nie.
Zensursula
@Zensursula: Umieściłem try {} catch () wokół obiektu ActiveXObject i zwróciłem false w klauzuli wyjątku. Teraz to też działa dla mnie
Zensursula
1
@mch mnóstwo rzeczy mogłoby to zrobić. ale domyślne poziomy bezpieczeństwa nie powinny.
Tom Roggero
5

Wykrywanie i osadzanie Flasha w dokumencie internetowym jest zaskakująco trudnym zadaniem.

Byłem bardzo rozczarowany jakością i niezgodnymi ze standardami znacznikami wygenerowanymi przez rozwiązania SWFObject i Adobe. Ponadto moje testy wykazały, że automatyczny aktualizator Adobe jest niespójny i zawodny.

Biblioteka wykrywania Flash JavaScript (wykrywanie Flash) i JavaScript Flash HTML Generator Library (Flash TML) to czytelne, łatwe w utrzymaniu i zgodne ze standardami rozwiązanie do tworzenia znaczników.

- "Luke przeczytaj źródło!"


źródło
4

Kod jednej isFlashExistszmiennej liniowej :

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

Zauważ, że istnieje taka alternatywa: swfobject.getFlashPlayerVersion();

trante
źródło
3

Zobacz źródło na http://whatsmy.browsersize.com (linie 14-120).

Oto abstrakcyjny kod dla przeglądarek na jsbin tylko do wykrywania flash , działa na: FF / IE / Safari / Opera / Chrome.

Ates Goral
źródło
Czy możesz podać kod lub przynajmniej link do informacji, w jaki sposób uzyskałeś odpowiedź na swojej stronie?
hitautodestruct
@hitautodestruct Jeśli przeglądasz źródło strony, odpowiedź jest bezpośrednio tam, u góry bloku JS.
Ates Goral
Więc zasadniczo rozmawialiście o tym kodzie (link jsbin)?
hitautodestruct
@hitautodestruct Tak, plus detectObject()odpowiednik dla IE.
Ates Goral
3

co powiesz na:

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;
};
Martin Bommeli
źródło
3

Jeśli jesteś zainteresowany czystym rozwiązaniem Javascript, oto ten, który skopiowałem z 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;
}
bizi
źródło
1

Jeśli chciałeś tylko sprawdzić, czy flash jest włączony, to powinno wystarczyć.

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;

}

Uwaga: unikaj zaznaczania enabledPlugin , niektóre przeglądarki mobilne mają wtyczkę flash z funkcją dotknij, aby włączyć, która wywoła fałszywie negatywny wynik.

bitinn
źródło
0

Stworzyłem mały, .swfktóry przekierowuje. Jeśli przeglądarka ma włączoną obsługę Flash, przekieruje.

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

}

}
mikrofon
źródło
0

Używając kompilatora Google Closure goog.require ('goog.userAgent.flash') utworzyłem te 2 funkcje.

boolean hasFlash ()

Zwraca, jeśli przeglądarka ma 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;
}

boolean isFlashVersion (wersja)

Zwraca, jeśli wersja Flash jest większa niż wersja podana

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)
}
kurczaki
źródło