Markus: AJAX: Response und Kompatibilität

Hallo auch,

ich habe folgenden Code:

  
var http = createRequestObject();  
  
function createRequestObject() {  
 var ro;  
 var browser = navigator.appName;  
  
 if(browser == "Microsoft Internet Explorer"){  
  ro = new ActiveXObject("Microsoft.XMLHTTP");  
 } else {  
  ro = new XMLHttpRequest();  
 }  
 return ro;  
}  
  
function sndReq(e) {  
 http.open('get', e);  
 http.onreadystatechange = handleResponse;  
 http.send(null);  
}  
  
function handleResponse() {  
 if(http.readyState == 4){  
  var response = http.responseText;  
  
  document.getElementById('content').innerHTML = response;  
 }  
}  

Es funktioniert auch soweit alles bis auf das Folgende:

1. Umlautproblem:
Ich sehe Umlaute als Fragezeichen. Woran könnte das liegen?

2. Adressleistenproblem:
Drücke ich im Browser F5 komme ich wieder zu der Seite, über die ich die Seite selbst das erste mal aufgerufen habe. Ändere ich den Content über einen sndReq zwischendurch, so habe ich aber eigentlich eine andere Seite. Kann ich die Adressleiste eventuell irgendwie ändern?

3. Kompatibilität
Funktioniert das ganze im IE noch wenn man ActiveX deaktiviert hat?

Vielen Dank schon mal im Voraus.

Gruss

Markus

  1. hi,

    1. Umlautproblem:
      Ich sehe Umlaute als Fragezeichen. Woran könnte das liegen?

    URI_escape ist das Stichwort. Du musst Dich also selbst drum kümmern. Mehr dazu hier:
    http://rolfrost.de/cgi-bin/xmlhttpreq.cgi

    --roro

    1. hi,

      URI_escape ist das Stichwort. Du musst Dich also selbst drum kümmern. Mehr dazu hier:
      http://rolfrost.de/cgi-bin/xmlhttpreq.cgi

      --roro

      Ohne mir jetzt diese bestimmt interessante Seite durchzulesen. Was haltet ihr von folgender Lösung?

      echo iconv("ISO-8859-1","UTF-8",$tmp);

      Das ist noch in der php. Der Seiteninhalt steckt in $tmp. Ich konvertiere von ISO-8859-1 nach UTF-8.

      Funktioniert so einwandfrei. Aber isses auch ok so?

      1. Wenns geht, ist es auch okay.

    1. Umlautproblem:
      Ich sehe Umlaute als Fragezeichen. Woran könnte das liegen?
        var response = unescape(http.responseText);

    Wegen den Umlaute habe ich vor kurzem hier auch ein paar Fragen gestellt.

    1. Adressleistenproblem:

    Typisches Problem mit dem IE.Dazu musst du immer noch z.B. die Akutelle Zeit an die Adresse hängen, damit der Browser jeweils eine "neue" Seite holt und nichts altes aus dem Cache.

    1. Kompatibilität
      Funktioniert das ganze im IE noch wenn man ActiveX deaktiviert hat?

    Ich schätze mal nicht. Aber wer interessiert sich schon für den IE ;)

      1. Umlautproblem:
        Ich sehe Umlaute als Fragezeichen. Woran könnte das liegen?
          var response = unescape(http.responseText);

      Wegen den Umlaute habe ich vor kurzem hier auch ein paar Fragen gestellt.

      Das Problem habe ich ja jetzt über php sehr gut lösen können.

      1. Adressleistenproblem:

      Typisches Problem mit dem IE.Dazu musst du immer noch z.B. die Akutelle Zeit an die Adresse hängen, damit der Browser jeweils eine "neue" Seite holt und nichts altes aus dem Cache.

      Du hast mich denke ich nicht verstanden. Wenn sich der Inhalt der Seite ändert möchte ich eigentlich auch die Adresse im Browser ändern. Denn die Seite die sich durch die Änderung erzeugt, kann auch über einen bestimmten Link direkt aufgerufen werden. Und dieser Link soll nach dem Aufruf eben als Adresse gelten.

      1. Kompatibilität
        Funktioniert das ganze im IE noch wenn man ActiveX deaktiviert hat?

      Ich schätze mal nicht. Aber wer interessiert sich schon für den IE ;)

      Du teilst zwar meine Meinung, leider nutzen ihn aber noch zu viele.

  2. Hi,

    if(browser == "Microsoft Internet Explorer"){

    Sollte man so nicht machen. Der IE7 hat z.B. XMLHttpRequest() auch als natives Objekt (wie z.B. der Mozilla ohnehin) und braucht den Zugriff via ActiveX gar nicht mehr.

    Funktioniert das ganze im IE noch wenn man ActiveX deaktiviert hat?

    Nein. Schreibe es so:

      
      var result=null;  
      
      if(window.XMLHttpRequest) {  
       // Standard  
       result=new XMLHttpRequest();  
      } else if(window.ActiveXObject) {  
       // IE<7  
       try { result=new ActiveXObject("Microsoft.XMLHTTP"); } catch(e) { result=false; }  
      } else if(window.createRequest) {  
       // IceBrowser  
       result=window.createRequest();  
      }  
    
    

    Im Ergebnis ist result dann
    1. im Erfolgsfall das Request-Objekt,
    2. null, wenn der Browser XMLHttpRequest gar nicht unterstützt, oder
    3. false, wenn der Browser (sprich: IE<7) XHR zwar prinzipiell unterstützt, aber ActiveX abgeschaltet ist/der User die Aktion nicht erlaubt hat (Du könntest dann den User ggf. bitten, ActiveX zu aktivieren, bzw. den Zugriff zu erlauben).

    Kurz gesagt: if(result) -> OK
                 if(!result) -> KO, was man noch unterteilen kann in:
                 if(result===null) -> chancenlos
                 if(result===false) -> ggf. neuer Versuch

    Beachte: Der IceBrowser beherrscht nur einen Auszug der XHR-Methoden/Eigenschaften. Wenn Du ihn nicht explizit unterstützen möchtest, lösche also diesen If-Zweig ...

    Gruß, Cybaer

    --
    Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
    1. Dank dir, ich habe es entsprechend umgeschrieben.