Browser-Fähigkeiten

"native"-Fähigkeiten, MIME-Type und Plugins

Gute Browser bieten für AnwenderInnen (meist im Hilfe-Menü) zumindest einige Information über ihre aktuellen Fähigkeiten. M$IE ist leider eine unangenehme Ausnahme. Auf dieser Seite geht es um die Möglichkeiten, die aktuellen Browser-Fähigkeiten zu analysieren und die Daten für die Entwicklung dynamischer Webseiten zu nutzen.
Javascript ECMAScript für HTML und XML
VBscript Visual Basic für Webseiten
Strategie Native-Fähigkeiten, Plugins und MIME-Types
HTTP-Header Informationen (nur) für den Webserver
Javascript Das navigator-Objekt, MIME-Types und Plugins
VBscript Kompensation für die von M$IE nicht unterstützten Standardfunktionen
Test-Objekt Nachträgliche Analyse eines eingebetteten Test-Objekts

Strategie für die Analyse der Browser-Fähigkeiten

"Native"-Unterstützung:
Alle gängigen Browser verfügen selbst ("native") über grundlegende Fähigkeiten: sie können z.B. Bilder (JPG, PNG, GIF, ...) vom Webserver anfordern und auf einer Webseite anzeigen.
Diese Fähigkeiten sind nicht leicht durch Programme zu erfahren. Da jeder Browser seine "Identität" bekannt gibt, können sie für die "native"-Fähigkeiten Erfahrungswerte einsetzen. Sie müssen jedoch ihre Programme regelmäßig an neue Browser-Versionen anpassen.
Browser-Tarnung Manche Browser (z.B. Opera) bieten Optionen an, ihre Identität zu tarnen, aber wer diese verwendet, ist selbst schuld.

Plugins:
Zusätzliche Fähigkeiten können für die meisten Browser mit Hilfe von Plugins installiert werden. Diese Hilfsprogramme werden vom Browser verwendet, um bestimmte Elemente anzuzeigen, die "native" nicht unterstützt werden.
Leider geben nicht alle Browser freiwillig die Liste der installierten Plugins an, vor allem nicht M$IE.
MIME-Type
Jedes Element einer Webseite hat eine bestimmte → MIME-Type. Je nach Type wird das Element vom Browser selbst (native) oder von einem Hilfsprogramm (Plugin) verarbeitet und angezeigt.
Die Kenntnis einer Liste aller unterstützten MIME-Types ist ideal, denn in diesem Fall brauchen sie gar nicht zu wissen, woher die Unterstützung kommt: vom Browser selbst (native) oder von einem Hilfsprogramm - in manchen Fällen (z.B. → SVG) gibt es für die gleiche MIME-Type Plugins von mehreren Herstellern.
Wenn sie selbst einen → Webserver betreiben, dann können sie über dessen Konfiguration einstellen, welche MIME-Types für die Clients angekündigt werden.
Leider funktioniert auch das nicht immer, vor allem M$IE gibt keine Auskunft.
Browser-Tarnung Noch schlimmer: M$IE ignoriert die MIME-Type auch bei korrekter Angabe und beurteilt Objekte nach den Dateinamen. Das kann man als AnwenderIn zwar in den Browser-Einstellungen ändern, als EntwicklerIn dürfen sie sich darauf jedoch nicht verlassen.
Browser-Tarnung Noch schlimmer: M$IE ignoriert in manchen Fällen auch die Datei-Erweiterung und schnüffelt im Text. Wenn er dabei auf bestimmte Hinweise trifft, dann wird die Datei zwangsweise als Webseite angezeigt - selbst dann wenn sie mit MIME-Type text/plain angekündigt und mit einem Namen *.txt übergeben wurde. Deshalb ist es mit M$IE sehr aufwändig, HTML-Quelltext (z.B. in eine Webseite → eingebettet) anzuzeigen.
Dynamische Webseiten:
Wenn sie bei der Entwicklung dynamischer Webseiten auf unterschiedliche Browser-Fähigkeiten reagieren wollen, dann stehen 3 unterschiedliche Wege zur Verfügung:

Sie verwenden Client-seitige Programmierung. Ein Javascript-Programm stellt live die Browser-Umgebung fest und reagiert darauf. Dann müssen sie jeder Webseite jedoch alle möglichen Varianten als Scripts mitgeben. Das beschränkt die Reaktions-Möglichkeiten auf einfache Fälle.

Sie schaffen vollendete Tatsachen und betten ein (evtl. unsichtbares) Test-Objekt in die Webseite ein. Nach (!) Aufbau der Seite kann Javascript mit DOM-Methoden analysieren, ob das Objekt existiert. Aufwändig und mühsam.
Sie verwenden Server-seitige Programmierung, z.B. PHP oder Perl, um unterschiedliche Webseiten an den Client zu senden, je nach dessen Fähigkeiten. Oft müssen sie dazu eine Analyse-Seite vorschalten, die auf Client-Seite die Browser-Umgebung ermittelt. Sie kommen also um die Live-Analyse der Browser-Plugins nicht herum. Ausserdem zeigen manche Browser Warnungen an, wenn man versucht, ihre Fähigkeiten zu analysieren - Das wird von manchen BenutzerInnen falsch verstanden und verhindert.

'Paranoide' Sicherheits-Einstellungen am BenutzerInnen-PC können jede Auskunft über die Umgebung verweigern. Das wird insbesondere vom IT-Marktführer forciert, denn damit werden die AnwenderInnen weitgehend auf seine Monopol-Software beschränkt.

In der Praxis müssen sie Aufwand und mögliche Wirkung der verschiedenen Methoden gegeneinander abwägen. Meist ist eine Kombination angebracht. Den meisten Aufwand erfordert in jedem Falle das schwächste Produkt M$IE . .

HTTP-Header

Wenn ihr Browser eine Seite von einem Webserver anfordert, dann sendet er im "Header" der Anforderung einige Informationen mit, u.a. seine Kennung als HTTP_USER_AGENT. Diese sind jedoch nur für Server-seitige Programmiersprachen ( → Perl, → PHP, ... ) zugänglich.
Live--PHP:
$_SERVER['HTTP_USER_AGENT'] = CCBot/1.0 (+http://www.commoncrawl.org/bot.html)
Zur Verwertung der Information muss der String zerlegt und verarbeitet werden.
Dazu verwendet man z.B. → Reguläre Ausdrücke (Regular Expressions).
Eine Live-Demonstration für die HTTP-Header beliebiger Webseiten finden sie auf der Seite → HTTP-Header dieses Webs.

Javascript

Javascript Objekt   navigator

bezeichnet das aktuell verwendete Browser-Programm und bietet eine Reihe nützlicher Eigenschaften und Methoden an.

Rechts eine Live-Liste mit den Angaben ihres Browsers. Die wichtigsten Eigenschaften werden von allen Browsern geliefert. Umfang und Art der unterstützten Eigenschaften variieren je nach Produkt und Version.

Zur Verwendung müssen die Ergebnis-Strings zerlegt und analysiert werden. Dazu verwendet man vorzugsweise → Reguläre Ausdrücke (Regular Expressions).
Live--Javascript:

Unter-Objekt   mimeTypes

Hier der vereinfachte Javascript-Code, rechts die Live-Ergebnisse für ihren Browser, nach Type sortiert:
// Anzahl verwendbarer MIME-Typen:
nmt = navigator.mimeTypes.length;
for(i=0; i<nmt; i++) {
mti = navigator.mimeTypes[i];
type = mti.type;
suffixes = mti.suffixes;
description = mti.description;
}
Details zum Thema Javascript-Objekt
Live--Javascript:

Unter-Objekt   plugins

Hier der vereinfachte Javascript-Code, rechts die Live-Ergebnisse für ihren Browser, nach plugin-Name sortiert:
// Anzahl verwendbarer Plugins:
npl = navigator.plugins.length;
for(var i=0; i<npl; i++) {
nse = navigator.plugins[i];
name = nse.name;
filename = nse.filename;
description = nse.description;
}
Live--Javascript:
Mit diesen Angaben wäre es möglich, dynamische Webseiten an die jeweiligen Browser-Fähigkeiten anzupassen.
Keine Daten von M$IE Leider liefert vor allem M$IE nur wenige Daten und verweigert die wichtigsten davon: Die Liste unterstützter MIME-Types.
Daher müssen sie die Analyse für M$IE meist durch VBscript (s.u.) ergänzen.
Links:
SelfHTML: Das navigator-Objekt in Javascript
Mozilla: Objekt-Index 'N'

Javascript Objekt   screen

Javascript kann die Dimensionen des verwendeten Bildschirms erfassen. Die Eigenschaften width, height werden in Pixeln angegeben, die Farbtiefe colorDepth in Bit.
Diese Daten sind für andere Programmiersprachen (z.B. Perl, PHP, ...) nicht direkt zugänglich.
Monitor-Dimensionen
moni="+screen.width; moni+='x'+screen.height; moni+='x'+screen.colorDepth; alert("Monitor:\n"+moni);

Javascript Eigenschaft   document.referrer

Javascript kann die Adresse der verweisenden Webseite (Referrer) erfassen. Der Text (String) kann leer sein, wenn der Referrer unbekannt ist (z.B. bei manueller Eingabe der Browser-Adresse).
Dies ist die einzige Möglichkeit, den Referrer einer statischen Webseite zu ermitteln. Der Referrer von dynamischen Webseiten ist auch mit anderen Programmiersprachen (z.B. Perl, PHP, ...) zugänglich.
Monitor-Dimensionen
ref="+document.referrer; alert("Verweis hierher von\n"+ref);

VBscript

Visual Basic (VB) wird in diesem Web nur in Sonderfällen verwendet, da diese Programmiersprache
kein Offener Standard ist,
von einem einzigen Hersteller abhängig ist,
entgegen allen Normen den Zugriff auf ihr lokales Dateisystem zulässt und
nur auf dem Betriebssystem eines Herstellers funktioniert.
Die Analyse der Browser-Fähigkeiten ist ein Sonderfall, da der Hersteller von M$IE zu wenige der oben gezeigten Standardfunktionen unterstützt.

Details zur Integration von VBscript in Webseiten und über die Zusammenarbeit mit Javascript finden sie auf der Webseite VBscript.
Vor Verwendung von → VBscript muss geklärt werden, ob ihr Browser VBscript "versteht".
Das VBscript muss vor dem rechts gezeigten Javascript-Code definiert werden, da es von diesem bereits verwendet wird.
Der Javascript-Code (Keine Funktion, dieses Javascript wird bereits im HTML-<head> ausgeführt.) legt die globale Variable vb_ok fest.

Live--Javascript: vb_ok =
<script type="text/vbscript">
function vb_test()
vb_test = 1
end function
</script>
<script type="text/javascript">
var vb_ok=0;
try { vb_ok = vb_test(); }
catch(e) {}
</script>
Die Plugin-Analyse ist mühsam:
Sie suchen nach Objekten, deren Namen (nach meinem Wissen) nirgends zuverlässig dokumentiert sind.

Erstellen sie eine Liste (hier das Array obj_names) mit den Win-Objektnamen aller zu testenden Plugins.
Die Win-Registry bietet Hinweise darauf, z.B. für SVG:
HKEY_CLASSES_ROOT | .svg | Standard = Adobe.SVGCtl
Unter den file-extensions anderer Dateitypen finden sie mit etwas Glück deren entsprechende Objektnamen.

Die gezeigte Javascript-Funktion plugin_list_vb bearbeitet der Reihe nach alle Elemente des Arrays obj_names. Nicht ganz zufällig ist auch dieser Teil vorwiegend in Javascript erstellt - Ein entsprechendes VBA-Programm funktioniert zwar einwandfrei (z.B. mit M$Excel), lässt sich jedoch nur mühsam nach VBscript portieren.

Die verbleibende VBscript-Funktion plugin_test_vb ist auf das absolute Minimum reduziert. Darin wird versucht, ein Objekt des angegebenen Namens zu erzeugen. Das logische Ergebnis (True oder False) wird an die aufrufende Javacsript-Funktion übergeben.
<script type="text/javascript">
function plugin_list_vb() {
obj_names = new Array("Adobe.SVGCtl",
"PDF.PdfCtrl", "AcroPDF.Pdf",
"QuickTime.mov",
"ShockwaveFlash.ShockwaveFlash");
t="Test mit VBscript: <br> ";
for(var i=0;i<obj_names.length;i++) {
objname=obj_names[i];
t+="\n"+objname+": ";
// VBscript-Anfrage:
ok=plugin_test_vb(objname);
if(ok) {t+="ja <br> ";}
else {t+="nein <br> ";}
}
document.write(t);
}
</script>
<script type="text/vbscript">
Function plugin_test_vb(objname)
Dim test,ok
ok = False
On Error Resume Next
Set test = CreateObject(objname)
If (Err.Number = 0) Then ok = True
plugin_test_vb = ok
End Function
</script>
Live-Demonstration:
Das rechts oben gezeigte Javascript plugin_list_vb wird jedoch nur dann ausgeführt, wenn ihr Browser VBscript "versteht".

Objekt einbetten und analysieren

Eine elegante Möglichkeit, die Browser-Unterstützung für bestimmte → MIME-Types zu analysieren, bietet das <object>-Tag von HTML. Details zur Verwendung von <object>
So funktioniert der Trick:
Fügen sie ein Test-Objekt der zu analysierenden → MIME-Type (hier: image/svg+xml) in die Webseite ein. (Das Objekt kann auch unsichtbar sein).
Erzeugen sie mit dem Alternativ-Code einen → DOM-Knoten: Der HTML-Code innerhalb eines <object> wird nur dann ausgeführt, wenn der Browser das Test-<object> nicht anzeigen kann. Der alternative DOM-Knoten kann durch jedes beliebige HTML-tag (hier: <div>)erzeugt werden und sollte ein id-Attribut mit einem eindeutigen Namen enthalten. Der DOM-Knoten kann auch leer, d.h. unsichtbar bleiben.
Starten sie nach (!) Aufbau der Webseite ein Javascript, welches nur nachzusehen hat, ob der alternative DOM-Knoten existiert. Dazu verwenden sie z.B. das Ereignis onLoad im <body>-tag.

Vorteil dieser Methode:
Funktioniert mit allen Browsern, allen Versionen, in allen Betriebssystemen. Erfordert keine Informationen über Eigenschaften des Browsers oder allfälliger Plugins. Vergleichsweise eringer Entwicklungs-Aufwand.
Nachteil dieser Methode:
Kann erst nach Aufbau einer Webseite eingesetzt werden.
→ Ist daher gut für eine Analyse-Webseite geeignet, mit deren Ergebnis nachfolgende dynamische Webseiten gesteuert werden, wenn sie Server-seitige Programmierung (→ PHP, → Perl, ...) anwenden.
Beispiel: Test für → SVG-Objektgrafik (vereinfacht - Details im Quelltext dieser Seite)
<html>
<head>
<script type="text/javascript">
function node_check() {
nodeok=1;
try {
n=document.getElementById("nosvg");
x=n.nodeType;
nodeok=0;
}
catch(e) {}
if(nodeok) {alert("SVG ist ok !");}
else {alert("Kein SVG ! ");}
}
</script>
</head>
<body onload="node_check()">
<div>SVG-Test:</div>
<object data="test.svg" type="image/svg+xml">
  <div id="nosvg">Testknoten</div>
</object>
</body>
</html>
Live-Demonstration:
Im Kasten rechts ist ein SVG-Test-<object> eingebettet.
Das Javascript wird jedoch nicht (wie im Programm-Beispiel rechts oben) automatisch gestartet, sondern durch Klick auf diesen  
Testknoten "nosvg"

Letzte Änderung dieser Seite: 2011-11-30 13:01:25