en

designoir

XMLHttpRequest für IE6

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.

XMLHttpRequest-IE.js

/*@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.

Kommentare

  1. Petey meinte am 14. Juni ’06, 20:29 Uhr ():
    Thanks! Saved my a$$
  2. Erich meinte am 22. Juli ’06, 19:32 Uhr ():
    Super Trick! Tnx!
  3. nh2 meinte am 14. August ’06, 16:21 Uhr ():
    Tolles Teil!
  4. Buffalo Bandit meinte am 19. Dezember ’06, 01:44 Uhr ():
    That Rocks my Socks!

    You saved my buttons!
  5. wahsaga meinte am 13. Februar ’07, 20:00 Uhr ():
    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.


    Kannst du/sonst jemand das bestätigen?

    MfG Christoph
  6. Dao meinte am 14. Februar ’07, 00:51 Uhr ():
    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.
  7. Dao meinte am 15. Februar ’07, 00:19 Uhr ():
    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.
  8. Tommy meinte am 20. Februar ’07, 20:22 Uhr ():
    Cooler Treffer von google: Wie ist denn nun die kompatible Version zu allen Browsern?
  9. Rainer meinte am 20. Juni ’07, 10:06 Uhr ():
    Thanks for that trick. Linked you in my short <a href=„www.feike.biz/weblog/2007/06/20/ajax-script-t…hnology-intro/“>ajax intro</a> but found no trackback url here.
    Best regards
  10. james meinte am 22. Februar ’09, 21:23 Uhr ():
    thanks for the trick!!!
  11. christian meinte am 29. Mai ’09, 16:35 Uhr ():
    Hallo,

    lange habe ich nach dieser Lösung gesucht!! Vielen Dank!!!
  12. Al meinte am 19. Dezember ’09, 16:22 Uhr ():
    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.
  13. anonym meinte am 31. März ’10, 15:40 Uhr ():
    Super, danke!!!
  14. JJ meinte am 26. August ’10, 06:12 Uhr ():
    Saved a delivery

Kommentare sind geschlossen.

Geändert am 28. Januar ’07 Kontakt
aggressiv akt andromeda bar beine blue efeu frontal fugaetu industriell komet land noir rost rot sonnenblume splash split winter wolke zeit