Attention cette page est ancienne


Accueil > Informatique > Cours Javascript > La détection de Flash

Traduction de la page Flash Detect (lien mort) rédigée par Peter-Paul Koch et traduite par Christophe Bruggeman

La détection de Flash

Flash ne peut pas être détecté dans Netscape 2, Explorer 3 et 4 sur Mac, Konqueror et le navigateur Ice Browser.

La version de Flash ne peut pas être détectée pour Opera 5 sur Mac et Linux et Hotjava.

J'ai entendu dire, mais pas testé, que la détection de la version de flash fonctionne dans iCab 2.7.1.

J'ai entendu dire, mais pas testé, que ce script fonctionne sous Konqueror 3.2

Cette combinaison de Javascript et de VBScript détectera si vos utilisateurs ont installé le plugin Flash et, si oui, qu'elle version. Après avoir détecté la presence/absence du plugin, vous pourrez prendre des mesures adaptées.

Tout d'abord, voyons si vous avez installé flash et, si oui, qu’elle version :

JavaScript et VBScript

La manière théorique de détecter le plugin Flash est de vérifier l'un ou l'autre de ces tableaux navigator.plugins ou navigator.mimeTypes. Ces tableaux sont remplis de tous les plugins et types MIME que le navigateur peut traiter et vous pouvez les vérifier pour voir s'ils peuvent traiter des animations flash.

Netscape 2 et Konqueror ne supportent ces tableaux, vous ne pouvez donc pas détecter Flash dans ces navigateurs.

Le tableau de plugins est de loin le plus intéressant puisqu’il contient également l'information sur la version, alors que le tableau mimeTypes nous indique seulement si le navigateur reconnaît le type MIME application/x-shockwave-flash (= si Flash est installé). Le type MIME n'a pas changé avec les versions Flash, si bien que, vous ne pouvez pas dire quelle version de flash l'utilisateur a.

Depuis Opera sur Mac et Linux, iCab et Hotjava ne reconnaissent que le tableau mimeTypes, détecter quelle version Flash est présente sur ces navigateurs n'est donc pas possible.

Internet Explorer complique le problème en laissant les tableaux vides, bien qu’ils existent tous les deux, de sorte qu’ Internet Explorer (Javascript) n'a jamais aucun plugins et ne reconnaît aucun type MIME. La seule exception à cette règle est Internet Explorer 5 sur Mac, qui supporte les deux tableaux (décision sensible!).

La seule manière de vérifier les plugins dans Internet Explorer c’est d’employer VBScript. Ici aussi nous rencontrons une complication: Les Internet Explorer sur Mac ne supporte pas le VBScript, il est donc fondamentalement impossible de détecter un plugin sur Explorer 3 et 4 pour Mac. Comme je l’ai dit, Explorer 5 sur Mac agit de la même manière que Netscape.

Pour finir, le VBScript est supposé produire des messages d'erreur, ce n'est donc pas exactement un exemple de code propre. Jusqu'ici je n'ai pas trouvé de meilleure façon.

Le script

Maintenant, passons au script :

<SCRIPT LANGUAGE="Javascript">
<!--

var flashinstalled = 0;
var flashversion = 0;
MSDetect = "false";
if (navigator.plugins && navigator.plugins.length)
{
	x = navigator.plugins["Shockwave Flash"];
	if (x)
	{
		flashinstalled = 2;
		if (x.description)
		{
			y = x.description;
			flashversion = y.charAt(y.indexOf('.')-1);
		}
	}
	else
		flashinstalled = 1;
	if (navigator.plugins["Shockwave Flash 2.0"])
	{
		flashinstalled = 2;
		flashversion = 2;
	}
}
else if (navigator.mimeTypes && navigator.mimeTypes.length)
{
	x = navigator.mimeTypes['application/x-shockwave-flash'];
	if (x && x.enabledPlugin)
		flashinstalled = 2;
	else
		flashinstalled = 1;
}
else
	MSDetect = "true";

// -->
</SCRIPT>

<SCRIPT LANGUAGE="VBScript">

on error resume next

If MSDetect = "true" Then
	For i = 2 to 6
		If Not(IsObject(CreateObject("ShockwaveFlash.ShockwaveFlash." & i))) Then

		Else
			flashinstalled = 2
			flashversion = i
		End If
	Next
End If

If flashinstalled = 0 Then
	flashinstalled = 1
End If

</SCRIPT>

Explication

Après le detect, la variable flashinstalled peut avoir trois valeurs :

La variable flashversion contient la version de flash. Si la version est inconnue, elle est à 0.

Sur cette page je document.write un petit message basé sur la valeur de ces deux variables. Vous devrez savoir quoi faire avec l'information obtenue par ce script, et d’autant plus si vous ne savez pas si Flash est installé.

Le JavaScript

Tout d'abord, passez flashdetect et flashversion à 0 (nous ne savons pas encore si Flash est installé et qu’elle est la version) et MSDetect false. Si nous avons besoin du VBScript, il sera placé à true.

var flashinstalled = 0;
var flashversion = 0;
MSDetect = "false";

Nous démarrons la détection par vérifier si navigator.plugins existe et, s'il existe, si sa length est plus grande que zéro. Après tout, le tableau lui-même existe dans Explorer, mais il ne contient aucune donnée donc sa taille est à zéro. Le script de détection pour Netscape ci-dessous devrait seulement être exécuté si le tableau est rempli de données.

if (navigator.plugins && navigator.plugins.length)
{

Puis nous essayons de trouver le plugin Shockwave Flash.

	x = navigator.plugins["Shockwave Flash"];

S'il existe

	if (x)
	{

nous savons que le flash est installé, nous plaçons donc la valeur de flashinstalled à 2.

		flashinstalled = 2;

Puis nous voyons si l'objet plugin a une propriété description. (Pour ce que je sais tous les navigateurs qui supportent navigator.plugins supportent également description, mais restez vigilant)

		if (x.description)
		{

S'il c’est supporté, nous lui extrayons la version de Flash. La description ressemble toujours à quelque chose comme Flash 4.0 r47. Par conséquent nous prenons le numéro situé avant le point et nous le mettons dans la variable flashversion.

			y = x.description;
			flashversion = y.charAt(y.indexOf('.')-1);
		}
	}

Si navigator.plugins["Shockwave Flash"] n'existe pas, Flash n'est probablement pas installé nous plaçons donc flashinstalled à 1.

	else
		flashinstalled = 1;

Pour finir un cas spécial: Flash 2 a un nom de plugin spécial Shockwave Flash 2.0. Si ce plugin est présent, placez les variables à Flash 2 detected:

	if (navigator.plugins["Shockwave Flash 2.0"])
	{
		flashinstalled = 2;
		flashversion = 2;
	}
}

Si le tableau plugins n'est pas supporté, nous regardons si le navigateur supporte navigator.mimeTypes.

else if (navigator.mimeTypes && navigator.mimeTypes.length)
{

Maintenant nous regardons si navigator.mimeTypes['application/x-shockwave-flash'] existe, c’est le cas si ce type MIME peut être utilisé par le navigateur. S'il le peut, nous vérifions alors sa propriété .enabledPlugin, laquelle est vrai si le plugin est actuellement installé (je ne comprend pas vraiment pourquoi il y une propriété enabledPlugin, de mon point de vue tout plugin présent est par définition autorisé).
Si il l’est, nous plaçons la valeur de flashinstalled à 2, s'il ne l’est pas nous la plaçons à 1. Malheureusement , navigator.mimeTypes ne nous dit pas quelle version est installée.

	x = navigator.mimeTypes['application/x-shockwave-flash'];
	if (x && x.enabledPlugin)
		flashinstalled = 2;
	else
		flashinstalled = 1;
}

Netscape et les navigateurs de peu d’importance sont maintenant prêts.

Si ni l'un ni l'autre des tableaux n'est supporté nous plaçons MSDetect à true de sorte que le VBScript soit exécuté. Naturellement ceci n'aide pas plus Netscape 2, Konqueror et Explorer 3 et 4 sur Mac, puisqu'ils ne supportent pas le VBScript. Dommage.

else
	MSDetect = "true";

Le VBScript

Le VBScript n'est pas vraiment un exemple de beau codage. En fait, le script est censé produire des erreurs.

Le problème principal c’est que la détection est réalisée en essayant de créer un object ShockwaveFlash.ShockwaveFlash.[versionNumber]. tous ce passe bien, le navigateur supporte cette version de flash. Par conséquent, si cette version du plugin n'est pas installée, Explorer renvoie un message d'erreur parce qu'il ne peut pas créer l'objet.

C’est pourquoi nous devons employer l’event handler VBScript on errorpour dire à Internet Explorer de continuer le script, peu importe ce qui ce passe.

<SCRIPT LANGUAGE="VBScript">

on error resume next

Alors pour la véritable détection. Nous vérifions d’abord si MSDetect est vrai. S'il l’est, nous exécutons le reste du VBScript.

If MSDetect = "true" Then

Maintenant nous essayons de créer des objets. Flash 2 s'appelle ShockwaveFlash.ShockwaveFlash.2, flash 3 s'appelle ShockwaveFlash.ShockwaveFlash.3 etc... Donc ce que nous devons faire c’est créer tous ces objets et voir lequel d’entre eux ne donne pas d’erreur.

Ainsi nous passons par les versions

	For i = 2 to 6

et nous essayons de créer un objet pour la version i

		If Not(IsObject(CreateObject("ShockwaveFlash.ShockwaveFlash." & i))) Then

Maintenant nous arrivons au passage délicat. Si la version i de Flash n'est pas supportée, le navigateur renvoie une erreur, mais puisque nous lui avons dit de resume next il pourra néanmoins exécuter la prochaine commande. Cependant, si la version Flash n'est pas supportée, nous souhaitons que rien ne se produise. C'est pourquoi nous vérifions si l'objet n'est pas présent (Not(IsObject(etc))) et s'il ne l'est pas (si l'erreur se produit) rien ne devra être fait :

[that's right, nothing]

Si l'objet peut être créé et est présent, nous avons trouvé la version Flash installée. Nous plaçons flashinstalled à 2 et flashversion à i.

		Else
			flashinstalled = 2
			flashversion = i

Enfin pour finir, c’est obligatoire en VBScript, et c’est l'équivalent des accolades fermantes } en JavaScript.

		End If
	Next
End If

Si, après avoir vérifié toutes les versions possibles, flashinstalled est toujours à 0, cela signifie que Flash n'est pas installé. Par conséquent nous lui donnons la valeur 1. Nous aurons essayé de trouver Flash, mais nous ne l'avons pas trouvé.

If flashinstalled = 0 Then
	flashinstalled = 1
End If

Voilà. Maintenant vous n’avez plus qu’à écrire un petit script qui donne lecture à flashinstalled et flashversion et à donner des instructions pour les différentes situations. Pensez soigneusement à ce qui devra se produire si vous ne savez pas si flash est installé.

Détecter flash sans JavaScript

Il y a une manière de détecter flash sans passer par le Javascript. Vous devez créer une petite animation Flash qui redirige l’utilisateur de la page Flash et le place sur une page avec un META refresh qui le réorientera sur une page sans Flash. Si le flash fonctionne, la redirection flash vient en premier, si elle ne fonctionne pas le navigateur exécute le META refresh. Pour plus de détails allez voir le site de Macromedia.

Détecter d'autres plugins

Théoriquement, en utilisant ce script vous devriez pouvoir détecter d'autres plugins. Cependant, il réussit rarement. Vous devez trouver le bon type MIME pour le modèle de détection de Netscape (Netscape style detect) et le bon objet VB pour la détection d'Explorer. Trouvez l'objet en commençant par ouvrir votre base de registre (Démarrer -> Exécuter -> Regedit), puis ouvrez HKEY_CLASSES_ROOT puis ouvrez HKEY_classes_root et sélectionner l’extension de fichier du plugin que vous souhaitez détecter. L'entrée 'Content Type' contient le type MIME, l'entrée 'Default' contient l'objet VB dont nous avons besoin.

Récrivez la fonction pour les nouveaux objets, puis essayez-la. Malheureusement je ne peux rien garantir, quelques plugins fonctionnent différemment.

Real Player

Cependant, un internaute a réussi à mettre en application cette détection pour Real Player :

Acrobat

Il fonctionne aussi pour Adobe Acrobat :

Pour détecter une version spécifique d’Acrobat vous devez employer une boucle semblable à celle utilisé dans le VBScript ci-dessus.

Si vous employez avec succès ce script pour détecter un autre plugin, svp faites le moi savoir.

Pure JavaScript

Un lecteur a proposé le script suivant pour se débarrasser du VBScript :

// IE flash detection.
	for(var i=7; i>0; i--){
		flashVersion = 0;
		try{
			var flash = new ActiveXObject("ShockwaveFlash.ShockwaveFlash." + i);
			flashVersion = i;
			return;
		}
		catch(e){
		}
	}

Je ne l'ai pas encore essayé par moi-même, et il emploie la construction try/catch que je veux éviter d’utiliser dans l'intérêt des anciens navigateurs, mais cette solution est certainement intéressante.