Browserweichen mit Prototype
Es gibt ein undokumentiertes Objekt in Prototype, welches einem beim schreiben von JavaScript-Browserweichen sehr behilflich sein kann. Dieses Objekt ist in der Prototype-API nicht dokumentiert, da ja Crossbrowser-Probleme üblicherweise von Prototype übernommen werden sollen und deswegen dieses Objekt überflüssig sein sollte. Jedoch wird es intern in der Prototype.js verwendet.
An den meisten Stellen sollte es in der Tat überflüssig sein, jedoch fand ich mich schon manchmal in einer Situation, wo ich diese Funktionalitäten doch brauchte. Im folgenden möchte ich auf die Verwendung kurz eingehen.
Bisher hat man in JavaScript den Browser ermittelt, indem man geprüft hat, ob bestimmte Funktionen existieren. Beispiel:
if ( !!(window.attachEvent && !window.opera) )
alert("You're surfing with IE");
else
alert("Well done, you've switched
");
Prototype hat dazu ein Objekt “Browser”, welches entsprechende Abfragen bereits durchgeführt hat. Somit kann man den obigen Code wie folgt umschreiben und “verschönern”:
if ( Prototype.Browser.IE )
alert("You're surfing with IE");
else
alert("Well done, you've switched
");
Die Vorteile liegen auf der Hand:
- der Code ist lesbarer und verständlicher
- man braucht die kryptischen Browserweichen nicht genau zu kennen
- man verwendet immer die selbe Browserweiche. Sollte es bei dieser mal Probleme geben (z.B. neue Browserversion), braucht man sie nur an einer Stelle umzuschreiben und zu testen.
Die folgenden Browserweichen sind in Prototype enthalten:
-
Prototype.Browser.IE
-
Prototype.Browser.Opera
-
Prototype.Browser.Webkit (Safarie, KHTML)
-
Prototype.Browser.Gecko
-
Prototype.Browser.MobileSafari
Leider verwendet Prototype beim erstellen dieses Browserobjekts nicht die von mir favorisierten Abfragen nach den Funktionen sondern fragt teilweise den UserAgent-String ab, welcher ja nicht zwingend bei Browsern der selben Version identisch ist. Plugins und manche internen Browserfunktionen können diesen UserAgent-String modifizieren. Bisher bin ich jedoch noch nicht auf Probleme gestoßen und habe dewegen noch keine alternative Implementierung vorgenommen, welche ich jetzt hier veröffentlichen könnte.
Was mir aber mal gefehlt hat, war die Unterscheidung zwischen IE6 und IE7. Im Zuge dessen habe ich eine kleine Erweiterung um folgende Objekte hinzugefügt:
//Maybe this could be done shorter, but I hope checking IE too makes it more reliable
Object.extend(Prototype.Browser, {
IE6: Prototype.Browser.IE && (typeof window.XMLHttpRequest == "undefined"),
IE7: Prototype.Browser.IE && (typeof window.XMLHttpRequest == "object")
});

Browserweichen mit Prototype…
Browserweichen mit Prototype…
Einfacher >> http://docs.mootools.net/Core/Core.js#window
@Jens
Stimmt, mootools hat das bereits von Hause aus und von der Implementierung her gefällt es mir auch etwas besser. Dennoch, wer auf Prototype gesetzt hat, wird nicht wegen der Browserweiche die Bibliothek wechseln.
Außerdem ist Prototype ja die JavaScript-Library, auf welche im TYPO3-Backend gesetzt wurde.
Naja, vielleicht mache ich dieses Wochenende mal an eine Portierung der Funktionen von Mootools nach Prototype.
[...] meinem letzten Beitrag zu dem Thema “Browserweichen in JavaScript” gab es die Bemerkung, dass es in Mootools einfacher ist, entsprechende Weichen zu verwenden. [...]