Détection Flash Cross Navigateur en Javascript

97

Quelqu'un a-t-il un exemple de script qui peut fonctionner de manière fiable dans IE / Firefox pour détecter si le navigateur est capable d'afficher du contenu Flash intégré. Je dis de manière fiable parce que je sais que ce n'est pas possible à 100% du temps.

Ta01
la source
Je vois que vous avez déjà accepté la réponse de Joeri, mais vous devriez vraiment envisager sérieusement swfObject. C'est beaucoup plus robuste et moins gonflé.
matt lohkamp

Réponses:

94

SWFObject est très fiable. Je l'ai utilisé sans problème pendant un bon moment.

Max Stewart
la source
Idem ici, SWFObject fonctionne très bien pour moi aussi (anciennement appelé FlashObject, mais Adobe a jeté un coup de sifflet)
davr
17
Avec jQuery et swfobject, voici le code que j'ai utilisé pour ajouter des noms de classe html de style Modernizr: $('html').addClass(typeof swfobject !== 'undefined' && swfobject.getFlashPlayerVersion().major !== 0 ? 'flash' : 'no-flash');
Jon z
2
Si quelqu'un est intéressé, j'ai testé certains de ces cas sur jsperf. SWFObject est sorti le plus rapide.
hitautodestruct
Vérifiez la présence de flash à l'aide de swfobject avec Throws if( swfobject.hasFlashPlayerVersion("8.0") ) { }false si aucun flash n'est installé. Le nombre correspond à la version minimale requise de Flash Player.
Kai Noack
hitautodestruct, bien sûr, SWFObject est sorti le plus rapide. Il n'effectue la détection réelle qu'une seule fois au chargement de la page, puis renvoie les valeurs qu'il a stockées à chaque fois qu'il est appelé. Puisque c'est ainsi que vous utiliserez également les autres méthodes, la comparaison des performances n'est pas une comparaison équitable.
Akrikos
109

Je suis d'accord avec Max Stewart . SWFObject est la voie à suivre. J'aimerais compléter sa réponse par un exemple de code. Cela devrait vous aider à démarrer:

Assurez-vous d'avoir inclus le swfobject.jsfichier (récupérez-le ici ):

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

Ensuite, utilisez-le comme ceci:

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

Remplacez "9.0.115" par la version flash minimale dont vous avez besoin. J'ai choisi la version 9.0.115 comme exemple car c'est la version qui a ajouté la prise en charge de h.264.

Si le visiteur n'a pas de flash, il rapportera une version flash de "0.0.0", donc si vous voulez juste savoir s'il a du flash, utilisez:

if(swfobject.hasFlashPlayerVersion("1"))
{
    alert("You have flash!");
}
else
{
    alert("You do not flash :-(");
}
Andrew Ensley
la source
9
génial. J'avais du mal à trouver un exemple très simple de détection de tout flash installé. Merci.
Brian Scott
2
Merci pour cet exemple! Nécessaire d'exécuter un autre javascript si l'utilisateur était sans flash et utilisait déjà swfobject pour l'incorporation de toute façon. :)
kontur
il y a un problème avec cela, vous devrez inclure une vérification pour SWFobject ou vous obtiendrez une erreur car undefined n'a pas de fonction appelée hasFlashPlayerVersion (). if(SWFobject && SWFobject.hasFlashPlayerVersion("1")) { // code here }
E-comm
Évidemment, mon code suppose que SWFObject est chargé. C'est comme utiliser jQuery ou toute autre bibliothèque pour une solution. Cela ne fonctionnera pas si vous ne l'incluez pas, et ce serait beaucoup plus logique de gonflement / d'exécution si vous vérifiiez la bibliothèque chaque fois que vous l'utilisiez.
Andrew Ensley
@Andrew: Je me rends compte que ce post a quatre ans et demi, mais ce n'est pas si évident pour ceux qui ne sont pas habitués à travailler avec SWFObject. J'utilise un module complémentaire Angular pour les téléchargements de fichiers qui recourt à Flash si HTML5 n'est pas pris en charge et que je souhaite afficher un message si Flash n'est pas détecté. Il n'était pas évident pour moi que SWFObject était une bibliothèque qui devait être chargée, ou si elle était chargée automatiquement via l'installation de Flash Player dans le navigateur. Merci d'avoir clarifié votre commentaire, mais pensez à l'ajouter à votre réponse.
Travesty3
36

Je sais que c'est un ancien post, mais je cherchais depuis un moment et je n'ai rien trouvé.
J'ai implémenté la bibliothèque de détection Flash JavaScript . Cela fonctionne très bien et il est documenté pour une utilisation rapide. Cela m'a littéralement pris 2 minutes. Voici le code que j'ai écrit dans l'en-tête:

<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
la source
il échoue maintenant sur Chrome et Firefox 6+!
balint
Cela semble légitime - la dernière version fonctionne plutôt bien ou moi. Merci, continuez votre bon travail!
poitroae
Merci. J'aime cette bibliothèque car elle ne nécessite pas de swf sentinelle. J'espère que vous le tiendrez à jour!
Nick Van Brunt
Cela devrait être la réponse ... :)
sabinonstack
32

Vous pouvez utiliser le compilateur de fermeture pour générer une petite détection de flash entre navigateurs:

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

ce qui donne le code "compilé" suivant:

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");
ragoût
la source
3
cette solution est à notre avis la plus propre. nous recherchions une méthode gratuite de swfobject / library pour détecter si Flash est installé. cela fait l'affaire. Merci!
anonymous-one
Solution géniale :) .. vous avez sauvé ma journée.
Arindam Paul
Ne pas se plaindre @ anonymous-one, mais cette solution n'utilise-t-elle pas également une bibliothèque (spécifiquement goog.userAgent.flashde Google's Closure Compiler)? Je veux juste m'assurer de ne pas manquer une différence nuancée ici.
Andrew Ensley
nous n'utilisons pas le premier extrait. nous utilisons le 2ème. qui est «sans bibliothèque».
anonymous-one
C'est la réponse la plus pure et la plus complète que j'ai vue et qui semble couvrir tous les navigateurs. Je vous remercie.
HartleySan
22

Version minimale que j'ai jamais utilisée (ne vérifie pas la version, juste Flash Plugin):

var hasFlash = function() {
    return (typeof navigator.plugins == "undefined" || navigator.plugins.length == 0) ? !!(new ActiveXObject("ShockwaveFlash.ShockwaveFlash")) : navigator.plugins["Shockwave Flash"];
};
Tom Roggero
la source
2
Sympa et court, j'aime ça!
mike nelson
@ greg.kindel Je l'utilise depuis longtemps et cela fonctionne pour les versions que j'ai testées. Cela pourrait être utile si vous spécifiez également la version du système d'exploitation et la version IE;)
Tom Roggero
ne fonctionne pas dans IE 9.0.17 sous Win 7 avec le message d'erreur: "Le serveur d'automatisation ne peut pas créer d'objet". Cela semble dépendre de l'installation. Sur certains ordinateurs, cela ne fonctionne pas sur d'autres.
Zensursula
@Zensursula: J'ai mis un try {} catch () autour de l'ActiveXObject et j'ai renvoyé false dans la clause d'exception. Maintenant, ça marche aussi pour moi
Zensursula
1
@mch une tonne de choses pourraient faire ça. mais pas les niveaux de sécurité par défaut.
Tom Roggero
5

Détecter et intégrer Flash dans un document Web est une tâche étonnamment difficile.

J'ai été très déçu de la qualité et du balisage non conforme aux normes généré à la fois par SWFObject et les solutions d'Adobe. De plus, mes tests ont révélé que le programme de mise à jour automatique d'Adobe était incohérent et peu fiable.

La bibliothèque de détection JavaScript Flash (Flash Detect) et la bibliothèque JavaScript Flash HTML Generator (Flash TML) sont une solution de balisage lisible, maintenable et conforme aux normes.

- "Luke a lu la source!"


la source
4

Code pour une isFlashExistsvariable de doublure :

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

Notez qu'il existe une alternative comme celle-ci: swfobject.getFlashPlayerVersion();

trante
la source
3

Consultez la source sur http://whatsmy.browsersize.com (lignes 14-120).

Voici le code abstrait du navigateur croisé sur jsbin pour la détection flash uniquement , fonctionne sur: FF / IE / Safari / Opera / Chrome.

Ates Goral
la source
Pouvez-vous fournir un code ou au moins un lien indiquant comment vous avez obtenu la réponse sur votre site?
hitautodestruct
@hitautodestruct Si vous visualisez la source de la page, la réponse est directement là, en haut du bloc JS.
Ates Goral
Parlait donc essentiellement de ce code (lien jsbin)?
hitautodestruct
@hitautodestruct Oui, plus la detectObject()contrepartie pour IE.
Ates Goral
3

qu'en est-il de:

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
la source
3

Si vous êtes intéressé par une solution Javascript pure, voici celle que je copie de 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
la source
1

Si vous vouliez simplement vérifier si le flash est activé, cela devrait suffire.

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;

}

Remarque: évitez de cocher enabledPlugin , certains navigateurs mobiles ont un plug-in flash tap-to-enable, et déclencheront un faux négatif.

Bitinn
la source
0

Ont créé un petit .swfqui redirige. Si le navigateur est compatible Flash, il sera redirigé.

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

}

}
Mike
la source
0

En utilisant la bibliothèque goog.require ('goog.userAgent.flash') du compilateur Google Closure, j'ai créé ces 2 fonctions.

booléen hasFlash ()

Renvoie si le navigateur a 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;
}

booléen isFlashVersion (version)

Renvoie si la version Flash est supérieure à la version fournie

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)
}
poulets
la source