XMLHttpRequest ist mittlerweile zum Quasi-Standard avanciert. Das Objekt ist in aktuellen Versionen aller wichtigen Browser vorhanden – nur nicht im Internet Explorer. Bei Microsoft, das diese Technik ursprünglich einführte, handelt es sich um eine MSXML-Komponente, die als ActiveX-Objekt geladen wird, dessen Instanziierung wiederum je nach installierter MSXML-Version variiert. Oft werden deshalb Fallunterscheidungen gemacht, um auf einem der verschiedenen Wege an das (fast) gleiche Objekt zu kommen.
Wer das Objekt nicht nur an einer Stelle benötigt, wird vielleicht schon auf die Idee gekommen sein, diese Fallunterscheidung in eine Funktion auszulagern. Der Nachteil davon ist, dass sie bei jedem anders heißen kann, wodurch Code schlecht portierbar wird. Nutzt man Skripte verschiedener Autoren, muss man sie angleichen oder damit leben, dass Teile mehrfach implementiert sind.
Mein Ansatz war deshalb ein anderer: Ich wollte in allen Skripten und für alle Browser nichts außer var foo = new XMLHttpRequest; schreiben müssen. Dies ist möglich, indem man für den Internet Explorer einen Konstruktor namens „XMLHttpRequest“ anlegt, der das ActiveX-Objekt zurückgibt.
/*@cc_on @if (@_win32 && @_jscript_version >= 5) if (!window.XMLHttpRequest)
window.XMLHttpRequest = function() { return new ActiveXObject('Microsoft.XMLHTTP') }
@end @*/
Der Code ist auskommentiert, nutzt aber Microsofts „Conditional Compilation“, sodass er für alle Browser außer dem MSIE unsichtbar ist. Mit if (!window.XMLHttpRequest) wird außerdem geprüft, ob XMLHttpRequest nicht doch bereits existiert. Das ist bei IE-Versionen bis 6 ausgeschlossen, doch der IE7 wird es nativ unterstützen. Den üblichen try/catch-Block mit new ActiveXObject('Msxml2.XMLHTTP') spare ich mir, da new ActiveXObject('Microsoft.XMLHTTP') für alle Windows-IE-Versionen ab 5 funktioniert und automatisch Msxml2 nutzen sollte, falls verfügbar.
Der Code funktioniert in meinem IE 7 (Originalinstallation von MS-Webseite, also kein „gepatchter“, Version 7.0.5730.11) nicht wie beschrieben - er fragt mich beim Erstellen eines neuen XMLHttpRequest-Objektes, ob ich ActiveX zulassen möchte.
Durch Erweiterung des Codes um eine Alert-Meldung,
/*@cc_on @if (@_win32 && @_jscript_version >= 5) if (!window.XMLHttpRequest)
function XMLHttpRequest() {
alert(„Ich nutze die ActiveX-Version von XMLHttpRequest!“);
return new ActiveXObject(’Microsoft.XMLHTTP’);
}
@end @*/
zeigt er mir dann auch diese Kontrollausgabe an.
Erst ein Umschreiben der Funktions- bzw. Objekt-Deklaration in
window.XMLHttpRequest = function() { alert(„Ich nutze die ActiveX-Version von XMLHttpRequest!“); return new ActiveXObject(’Microsoft.XMLHTTP’) }
ergibt bei mir das gewünschte Ergebnis - im IE 7 _keine_ Ausgabe des Kontroll-Alerts mehr.
Christoph, ich denke, die Meldung kommt beim zweiten Mal nicht, weil du ActiveX schon beim ersten Mal zugelassen hast. ;-)
Ich sehe nicht, wie und warum deine Änderung das ansonsten umgehen sollte.
Für alle: wahsaga hat sich noch ein mal bei mir gemeldet und mir mit zwei Testseiten das Problem demonstriert. Hier ist meine Antwort:
Vergleich das mal zwischen Firefox und IE:
javascript:if(0) function x(){}; alert(typeof x)
Das scheint irgendeine JScript-Eigenart zu sein. Offensichtlich wird die Funktion auf jeden Fall deklariert, unabhängig von der Bedingung.
Das heißt, dass |if (!window.XMLHttpRequest)| für |function XMLHttpRequest() {...}| keine Rolle spielt und ggf. auch das native XMLHttpRequest-Objekt des IE7 überschrieben wird.
Ich hab den Code nun korrigiert. Danke noch mal an wahsaga.
hi.,
i’m developing in drupal theme., bt nw i had some problem that was IE6/7 browsers aren’t support my web design. then anyone pls tell how to initialize the code in my document.