Keine Sorge, ich möchte hier kein weiteres Tutorial über Ajax und das XMLHttpRequest-Objekt schreiben (es sei denn, es wird danach gefragt). Bestimmt wissen Sie, dass die verschiedenen Browser mit dem XMLHttpRequest-Objekt arbeiten, um Daten zwischen Server und Browser zu übertragen, ohne dass die Seite neu geladen werden muss.
Nur der Internet Explorer arbeitet mit einer MSXML-Komponente, die als ActiveX-Objekt geladen wird. Aus diesem Grund wird in fast allen Ajax-Tutorials eine Browserweiche eingebaut, um an das benötigte Objekt zu gelangen. Hier möchte ich Ihnen einen kürzeren Weg vorstellen.
Zunächst zwei übliche Browserweichen.
try/catch-Block:
function erzXMLHttpRequestObject(){ /* try/catch */ var resObjekt = null; //Object-Variable deklarieren try{ resObjekt = new ActiveXObject("Microsoft.XMLHTTP");//IE alt } catch(Error){ try{ resObjekt = new ActiveXObject("MSXML2.XMLHTTP");//IE neu } catch(Error){ try{ resObjekt = new XMLHttpRequest();//IE7+, Firefox, Chrome, Opera, Safari } catch(Error){ alert("Erzeugung eines XMLHttpRequest-Objekts ist nicht möglich"); } } } return resObjekt;//Rückgabe des Objekts ! }
Oder über eine if/else-Abfrage:
/* if/else */ function erzXMLHttpRequestObject() { var resObjekt = null; if (window.XMLHttpRequest) { // IE7+, Firefox, Chrome, Opera, Safari resObjekt = new XMLHttpRequest(); } else if (window.ActiveXObject) { // IE6, IE5 resObjekt = new ActiveXObject("Microsoft.XMLHTTP"); } else { alert("Erzeugung eines XMLHttpRequest-Objekts ist nicht möglich!"); } return resObjekt; }
Bei Wikipedia finden Sie auch noch eine Möglichkeit, die beides kombiniert.
Bei meinen endlosen Recherchen habe ich eine weitere Lösung gefunden, die ich schon seit längerem ohne Probleme einsetze und die auf Microsofts Conditional Compilation (engl. bedingte Ausführung) basiert. Auf diese Weise lässt sich Javascript-Code vor allen Browsern bis auf den Internet Explorer “verstecken”. Dabei handelt es sich um ein Javascript-Kommentar.
/*@cc_on ... @*/
Während alle anderen Browser dies ignorieren (da Kommentar), erkennt der IE in ‘@cc_on’ (Conditional Compilation –> CC) eine Anweisung und behandelt den Text zwischen öffnendem und schliessendem ‘@’-Zeichen als normalen Javascript-Code.
Durch diesen Sonderfall lässt sich eine schöne XMLHttpRequest-Erkennung basteln.
/*@cc_on @ if (@_win32 && @_jscript_version >= 5) if (!window.XMLHttpRequest) window.XMLHttpRequest = function() { return new ActiveXObject('Microsoft.XMLHTTP') } @end @*/ resObjekt = new XMLHttpRequest();
Durch (!window.XMLHttpRequest) wird dabei getestet, ob der XMLHttpRequest nicht schon existiert, was beim IE bis Version 6 ausgeschlossen ist. Der IE ab Version 7 kennt es dann endlich und lässt die Bedingung aus bzw. nutzt dann ebenfalls den “normalen” XMLHttpRequest.
Eine nette Geschichte, wie ich finde. Gefunden habe ich es hier: design-noir.de. Vielen Dank!
Übrigens lassen sich so auch noch weitere Konstrukte bauen.
if (/*@cc_on ! @*/ false) { alert("Dies würde nur im IE ausgeführt werden, da bei allen anderen Browsern die Negation durch '!' nicht greift!"); }
Bei den ständigen Problemen mit den IEs für Webworker bestimmt ein interessanter Ansatzpunkt.