Homepage de.comp.lang.javascript
Homepage
de.comp.lang.javascript

FAQ de.comp.lang.javascript

FAQ
de.comp.lang.javascript

 

 

Bitte verwenden Sie als Einstiegsadresse in diese FAQ die Homepage der Newsgroup de.comp.lang.javascript. Der Aufenthaltsort dieser Seiten hier kann sich ohne Vorwarnung ändern.
 

 

Wie erkenne ich, ob der Benutzer ein Flash-Plug-in zur Verfügung hat?

Entwurf einer Antwort,
denn Erkennung des gewünschten bzw. zuständigen Plugins mit JavaScript kann nur eine Krücke sein:

Kurz erklärt: Test des Flash-Plugins (>= 4):

Plugin-Tests funktionieren nur in Netscape-Browsern mit Javascript, im IE (ab Version 3) nur mit VBScript, da

  1. der IE kein navigator.plugins- und navigator.mimeTypes-Array hat (Ausnahme: IE 5/Mac)
  2. sich in VBScript eventuelle Fehlermeldungen ausschalten lassen.

Zuverlässige Abfragen funktionieren am besten direkt in Flash, siehe www.flashworker.de. Außerdem sollte man den Besucher grundsätzlich selbst entscheiden lassen, ob er Flash sehen möchte oder nicht.

<script type="text/javascript">
flash = false;
if ((navigator.plugins) && (navigator.plugins.length > 0))
{
   for (a = 0; a < navigator.plugins.length; a++) 
      if ((navigator.plugins[a].name.indexOf('Flash') != -1) &&
          (parseInt(navigator.plugins[a].name) >= 4)) 
      {
         flash = true;
         break;
      }
}

// alternativ, testet nur auf beliebige Version (>2?):

if ((navigator.mimeTypes) && (navigator.mimeTypes.length > 0)) 
   for (a = 0; a < navigator.mimeTypes.length; a++) 
      if (navigator.mimeTypes[a].type.indexOf("application/x-shockwave-flash")>= 0) 
         flash = true;
</script>

<script type="text/vbscript">
// mit language="vbscript" klappt es auch im
// IE 3 - der Validator mosert aber
on error resume next
flash = not IsNull(CreateObject("ShockwaveFlash.ShockwaveFlash.4"))
</script>

<script type="text/javascript">
document.write('Flash ist ' + (flash ? "präsent." : "nicht anwesend."));
</script>

Kurz erklärt: Test des RealPlayer-Plugins:

Bei einem Test des RealPlayer-Plugins bietet es sich an, auf Version 6 ("G2") und aufwärts zu testen, da erst bei dieser Version die automatische Update-Möglichkeit dazukam.

<script type="text/javascript">
real = false;
if ((navigator.plugins) && (navigator.plugins.length > 0)) 
   for (a = 0; a < navigator.plugins.length; a++) 
      if ((navigator.plugins[a].name.indexOf('Real') != -1) &&
          (navigator.plugins[a].name.indexOf('G2') != -1)) 
      {
         real = true;
         break;
      }

// alternativ, für beliebige Versionen

if ((navigator.mimeTypes) && (navigator.mimeTypes.length > 0)) 
   for (a = 0; a < navigator.mimeTypes.length; a++) 
     if (navigator.mimeTypes[a].type.indexOf("audio/x-pn-realaudio-plugin") >=0) 
     {
        real = true;
        break;
     }
</script>

<script type="text/vbscript">
 on error resume next
 real = not IsNull(CreateObject("rmocx.RealPlayer G2 Control"))
</script>

<script type="text/javascript">
document.write('RealPlayer ist ' + (real ? "präsent." : "nicht anwesend."));
</script>

Ausführlich: Plugin-Abfragen allgemein:

Bevor man Dateiformate einbindet, die u.U. ein Plugin benötigen, sollte man folgende Punkte abklären:

1. Kann ich Alternativen anbieten?

Bei Filmen, die man auf der Webseite zeigen möchte, kann man z.B. einzelne Bilder herauskopieren und in <object> und <embed> so verschachteln, daß sie nur angezeigt werden, wenn der Browser das Dateiformat nicht unterstützt und kein Plugin dafür vorhanden ist.
Z.B.

<object data="video.mpeg" type="video/mpeg" width="320" height="240">
<embed src="video.mpeg" type="video/mpeg" width="320" height="240">
  <img src="standbild.jpg" width="320" height="240" alt="[Ausschnitt vom Film]"/>
</embed>
</object>

// Soweit ich weiß, zeigt der NN 4 das Bild dann immer an (?)

<p><a href="video.mpeg" title="Das Video downloaden">Download des Videos</a>
(5 MB, MPEG-1)</p>
2. Wie weit verbreitet ist das Dateiformat?

Nicht vergessen werden sollte, daß die Installation eines Plugins für ein bestimmtes Dateiformat vom Besucher verlangt, daß er die entsprechende Seite des Herstellers besucht, das Plugin downloadet (was lange dauern kann) und es anschließend installiert. Bei einem Großteil der Besucher wird dies nicht der Fall sein.

Im Internet gibt es eine Reihe von Instituten, die versuchen, die Verbreitung von Plugins zu ermitteln. Da diese Test i.A. darauf beruhen, daß eine Scriptsprache vorhanden ist - und diese bei einem gewissen Anteil der Besucher ausgeschaltet ist, können sie nur Näherungswerte liefern.

Weit verbreitet (> 75 %) sind z.B. das Macromedia Flash- und das Adobe Acrobat-Plugin. Ein Anbieter von solchen Statistiken ist z.B. http://websnapshot.mycomputer.com/plugins.html

3. Kann ich abklären, ob der Besucher das Plugin hat und Alternativen einbinden?

Manchmal - wenn man Dateien in verschiedenen Formaten einbindet - kann es sinnvoll sein, zu überprüfen, ob der Browser dieses Dateiformat darstellen kann. Wenn er dazu nicht in der Lage ist, könnte man die Datei in einem Format einbinden, das verbreiteter ist.
Z.B.

<script>
WENN Browser RealVideo darstellen kann 
{
   RealVideo einbinden
}
SONST 
{
   MPEG-Video einbinden
}
</script>

<noscript>
eingebettetes MPEG-Video
</noscript>

Auf keinen Fall unterbleiben sollte ein <noscript>-Bereich, da sonst Besucher, bei denen Javascript abgeschaltet ist, nichts zu sehen bekommen.

Das Funktionieren dieser Methode setzt aber voraus, dass

  1. Scriptsprachen aktiviert sind.
  2. die Erkennung zuverlässig funktioniert.
4. Wie zuverlässig sind Abfragen von Browser-Plugins?

Beim Test auf Plugins muß man grob zwei Browsergruppen unterscheiden:

1. Netscape Navigator 3+, Opera (?), InternetExplorer 5/Mac:

Diese Browser stellen für Javascript zwei Arrays bereit, einmal das navigator.plugins- und das navigator.mimeTypes-Array. In diesen Browsern ist auch die Abfrage von Plugins einfach möglich und recht zuverlässig (sofern Javascript angeschaltet ist).
Z.B. Abfrage des RealPlayer  G2-Plugins mit dem navigator.plugins-Array:

real = false;
if ((navigator.plugin) && (navigator.plugin.length > 0)) 
{
   for (a = 0; a < navigator.plugin.length; a++) 
      if ((navigator.plugin[a].name.indexOf('Real') != -1) &&
          (navigator.plugin[a].name.indexOf('G2') != -1) 
      {
         real = true;
         break;
      }
}

Das Problem der Abfrage mit dem navigator.plugin-Array ist, dass der Name des Plugins je nach Version und Betriebssystem durchaus variieren kann.

Z.B. Abfrage des RealPlayer G2-Plugins mit dem navigator.mimeTypes-Array:

real = false;
if ((navigator.mimeTypes) && (navigator.mimeTypes.length > 0))
   for (a = 0; a < navigator.mimeTypes.length; a++)
      if (navigator.mimeTypes[a].type.indexOf("audio/x-pn-realaudio-plugin") >=0) 
      {
         real = true;
         break;
      }
}

Beide Tests können natürlich auch kombiniert werden, aber natürlich bleibt die Abfrage von Javascript abhängig.

2. Microsoft InternetExplorer 3+:

Der Zugriff auf die navigator.plugins- und navigator.mimeTypes-Arrays ist im IE nicht möglich, da sie nicht vorhanden sind. Es gibt nur den Umweg, ein ActiveX-Control (im InternetExplorer sind die Plugins als ActiveX-Controls realisiert, siehe Link zu MS-ActiveX im Inhaltsverzeichnis) zu initialisieren und dabei Fehler abzufangen - wenn es keinen Rückgabewert gibt, trat ein Fehler auf - wobei nicht klar ist, ob das Plugin nicht vorhanden ist oder ob der Benutzer den Zugriff auf Plugins verweigert. Wegen der unübersichtlichen Struktur der Sicherheitseinstellungen der InternetExplorer-Familie sind Plugin-Abfragen in IEs extrem unzuverlässig.

Um zu vermeiden, daß beim Initialisieren eines nicht vorhandenen ActiveX-Controls ein Fehler auftritt, muß eine Programmiersprache benutzt werden, die das Abschalten von Fehlermeldungen zuläßt - VBScript.

Eine grundsätzliche Abfrage in VBScript könnte so aussehen:

<script type="text/vbscript">
on error resume next
real = not IsNull(CreateObject("rmocx.RealPlayer G2 Control"))
</script>

Nach diesem Script steht die Variable real mit den Werten true oder false zur Verfügung.

Ab dem Internet Explorer 5 steht auch try{} und catch{} zur Verfügung, damit ließe sich die Abfrage in Javascript auch so lösen:

<script type="text/javascript">
WENN Browser == IE 5+ 
{
   try 
   {
      rp = new ActiveXObject('rmocx.RealPlayer G2 Control');
   }
   catch(e) 
   {
      if ((!e) && (rp)) 
         alert('RealPlayer installiert!');
      else 
         alert('Fehler: ' + e.description);
   }
}

Da aber auch der IE 4 immer noch einen gewissen Verbreitungsgrad hat, sollte man bei VBScript bleiben.

Dabei handelt man sich aber ein weiteres Problem ein: Auf dem Macintosh wird im IE 4 und im IE 4.5 kein VBScript unterstützt. Das heißt, Plugin-Abfragen sind dort nicht möglich. Das ist aber angesichts der geringen Verbreitung der Browser zu verschmerzen. IE 5/Mac kennt das navigator.plugins-Array, siehe oben.

Kennt man den Namen des ActiveX-Controls nicht, so kann man in der Registry (mit dem Tool regedit) nachsehen. Dazu sucht man zuerst in HKEY_CLASSES_ROOT nach der Dateiendung, die dieses Format benutzt, z.B. .swf für Macromedia Flash. Dort ist unter "Standard" "ShockwaveFlash.ShockwaveFlash" eingetragen. Diesen String kann man in der Abfrage verwenden.

top

Diese Seite ist Teil der de.comp.lang.javascript FAQ. Die Einstiegsadresse lautet http://www.dcljs.de/. Der Text der Seite wurde erstellt von Johann Burkard (©).

 ______ letzte Änderung: 12/2012 ______ 

 
© S. Mintert, Ch. Kühnel