Microsoft hatte die tolle Idee eine eigene JavaScript Implementierung zu schreiben und ihr den vielsagenden Namen JScript zu geben.
JScript basiert wie auch JavaScript auf dem Standard ECMAScript was eigentlich garantieren sollte dass JavaScript in jedem Browser gleich funktioniert.
Wie so oft (man erinnere sich nur an die Ungarische Notation (http://de.wikipedia.org/wiki/Ungarische_Notation) die man bei Microsoft völlig mißverstanden hat) gibt es auch bei JScript diverse Punkte die gar nicht oder nur unvöllständig funktionieren.
1.1 Objektiteration in foreach - Schleifen
Bevor Mißverständnisse aufkommen, natürlich kann der Internet Explorer in for-Schleifen Objekte iterieren!
Bemerkenswert ist dabei aber dass er dabei in den einzelnen Schleifendurchläufen völlig andere Dinge in dem Objekt findet als, jeder andere Browser!
Lösung: Die Lösung ist in diesem Fall denkbar einfach. Nutzt man eine for statt einer foreach schleife bekommt man die gewünschten Elemente.
Das faszinierende dabei muss nocheinmal erwähnt werden: Wenn ich in JScript ein Objekt mit einer foreach-Schleife iteriere, erhalte ich andere Ergebbnisse als mit einer for-Schleife!
P.S. Ich habe dieverse Erklärungen von diversen Microsoft Consultants für dieses Verhalten bekommen, die sich alle irgendie auf den Objekt-Iterator bezogen.
Aber für mich in keinem Fall logisch nachvollziebar waren, denn warum sollte sich der Objekt-Iterator bei unterschiedlichen Schleifen unterschiedlich verhalten?
1.2 XMLHTTPRequest oder Ajax
Alle modernen Browser beherrschen Ajax, alle modernen Browser nutzen dafür das XMLHTTPRequest Objekt. Alle? Nein, nicht alle!
Ein kleiner blauer Browser aus Redmond wehrt sich nach wie vor tapfer gegen das XMLHTTPRequest Objekt.
Der Internet Explorer bzw. JScript kennt kein XMLHTTPRequest Objekt obwohl dieses Bestandteil von ECMAScript (http://www.w3.org/TR/XMLHttpRequest/) ist.
Stattdessen gibt es im Internet Explorer ein ActiveX Plugin über das Ajax Requests realisiert werden. Dieses ActiveX Plugin wird von IE Version zu IE Version immer mal wieder ausgetauscht.
Die Folge davon ist, dass der einzige Grund für Browserweichen heutzutage nicht mehr die unterschiedlichen Browser sondern eigentlich nur noch die unterschiedlichen IE Versionen (weshalb ich Browserweichen im weiteren nur noch IE Versionsweichen nennen werde) sind.
Folgender gruseliger Code ist demnach für das Erstellen eines Ajax Requests notwendig.
Ein weiteres ärgerliches Problem ist das sog. XHR Streaming, auch bekannt unter HTTP Streaming oder Comet Implementierung. Dabei geht es darum einen XMLHTTPRequest dauerhaft offen zu halten und in einem Stream immer wieder Nachrichten an den Client zu schicken.
Ein möglicher Anwendungsfall für solch eine Lösung währen beispielsweise Chatanwendungen. Da es sich im Internet Explorer um eine Microsoft eigene Interpretation von JavaScript handelt funktioniert auch hier natürlich nicht alles wie in der restlichen Browserwelt.
Microsofts XMLHTTP Request ist nicht in der Lage aus einem laufenden Request (Stream) bereits Daten herauszulesen, er kann dies erst nachdem der Request abgeschlossen ist.
Zugegeben damit setzt Microsoft sogar den Standard korrekt um, allerdings zusammen mit Opera (von deren Mitarbeitern die RFC´s für den Standard stammen) als einzige auf diese Art und Weise.
Alle anderen Browser unterstützen diese Funktionalität trotz des Standars über dessen Sinn sich streiten lässt.
P.S. Also mindestens im IE 9 werden richtige XMLHTTPRequests gemacht statt irgendwelche ActiveX Plugins zu benutzen. Das ändert aber nichts am grundsätzlichen Verhalten und führt dazu dass zusätzlich zu der IE5, IE6, IE7 und IE8 Versionsweiche auch noch eine IE9 Versionsweiche rein muss.
1.3 Der typeof Operator
Dieses Problem ist schnell erklärt. Man erzeuge eine JavaScript Funktion und versuche aus einem vererbten Browserfenster darauf zuzugreifen. Nahezu jeder Browser findet die identifiziert die Funktion im Elternfenster als Funktion.
Nicht so der Internet Explorer, er identifiziert die Funktion als Objekt!
1.4 mehr typeof und instanceof
Haben sie schonmal versucht im Internet Explorer herauszufinden was für einen Typ ein JavaScript Objekt hat.
Nehmen wir mal das XMLHTTPRequest Objekt aus dem Beispiel unter 1.2. in allen Browsern führt folgender Code zu selben Ausgabe:
Möchte man nun wissen um was für ein Objekt es sich handelt kann man folgendes tun:
Was wiederum im allen Browsers gleich funktioniert ist folgender Code:
1.5 document.body, document.documentElement und window
Der Versuch die Abmesungen eines Browserfensters zu ermitteln ist mal wieder ein klassischer Grund für eine IE Versionsweiche:
... more to come ...
Ideen für die Zukunft
Warum muss ich ASP installieren um im IIS bestimmte Konfigurationseinstellungen machen zu können. Völlig unabhängig davon ob ich überhaupt ASP Seiten habe?
Warum muss ich ASP installieren um das Microsoft Azure PHP Development Toolkit nutzen zu können?