AJAX responseXML errori

Ho avuto alcuni strani problemi quando si tratta di fare una richiesta AJAX e gestisce la risposta.

Sto facendo una chiamata ajax ad un file xml. tuttavia, quando si ottiene la risposta che il xhr.responseText proprietà funziona bene in firefox ma non in IE.
Un’altra cosa è che sto cercando di accedere al xhr.responseXML come XMLDocument, ma mi dice che firefox mi dice che xhr.responseXML è definito in ie non mostrare anche a me l’errore non identificato o visualizza l’output.

Questo è il codice che sto usando per fare la richiesta:

var ajaxReq = function(url, callback) {
    //initialize the xhr object and settings
    var xhr = window.ActiveXObject ?
            new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest(),
    //set the successful connection function
        httpSuccess = function(xhr) {
            try {
                //IE error sometimes returns 1223 when it should be 204
                // so treat it as success, see XMLHTTPRequest #1450
                //this code is taken from the jQuery library with some modification.
                return !xhr.status && xhr.status == 0 ||
                        (xhr.status >= 200 && xhr.status < 300) ||
                        xhr.status == 304 || xhr.status == 1223;
            } catch (e) { }
            return false;
        };

    //making sure the request is created
    if (!xhr) {
        return 404; //Not Found
    }


    //setting the function that is going to be called after the request is made
    xhr.onreadystatechange = function() {
        if (!httpSuccess(xhr)) {
            return 503; //Service Unavailable
        }
        if (xhr.responseXML != null && xhr.responseText != null &&
                xhr.responseXML != undefined && xhr.responseText != undefined) {
            callback(xhr);
        }
    };


    //open request call
    xhr.open('GET', url, true);

    //setup the headers
    try {
        xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        xhr.setRequestHeader("Accept", "text/xml, application/xml, text/plain");
    } catch ( ex ) {
        window.alert('error' + ex.toString());
    }

    //send the request
    try {
        xhr.send('');
    } catch (e) {
        return 400; //bad request
    }

    return xhr;
};

e questo è come mi chiama la funzione per il test di risultati:

window.onload = function() {
    ajaxReq('ConferenceRoomSchedules.xml', function(xhr) {
        //in firefox this line works fine,
        //but in ie it doesnt not even showing an error
        window.document.getElementById('schedule').innerHTML = xhr.responseText;
        //firefox says ''xhr.responseXML is undefined'.
        //and ie doesn't even show error or even alerts it.
        window.alert(xhr.reponseXML.documentElement.nodeName);
    });
}

Questo è anche il mio primo tentativo di lavorare con AJAX quindi ci potrebbe essere qualcosa che non sto guardando a destra.
Ho cercato pazzo per eventuali indicazioni di perché o come risolvere il problema, ma senza fortuna.
tutte le idee sarebbe grande.

EDIT:

So che sarebbe meglio con un quadro, ma il boss non vuole aggiungere un quadro solo per una funzionalità ajax (‘solo’ non è una fiera di word con l’ajax :P). Così sto facendo con puro javascript.

Il file XML è ben formato, la vedo bene nel browser web, ma per il completamento questa è la prova il file che sto utilizzando:

<?xml version="1.0" encoding="utf-8"?>
<rooms>
  <room id="Blue_Room">
    <administrator>[email protected]</administrator>
    <schedule>
      <event>
        <requester>
          <name>Johnny Bravo</name>
          <email>[email protected]</email>
        </requester>
        <date>2009/09/03</date>
        <start_time>11:00:00 GMT-0600</start_time>
        <end_time>12:00:00 GMT-0600</end_time>
      </event>
    </schedule>
  </room>
  <room id="Red_Room">
    <administrator>[email protected]</administrator>
    <schedule>
    </schedule>
  </room>
  <room id="Yellow_Room">
    <administrator>[email protected]</administrator>
    <schedule>
    </schedule>
  </room>
</rooms>

EDIT 2:
Bene, la buona notizia è che ho convinto il mio capo a usare jQuery, la cattiva notizia è che l’AJAX ancora mi lascia perplesso. Cercherò di leggere più su di esso solo per curiosità. Grazie per i suggerimenti e le ho dato la risposta di credito di Calore Avaro, perché era la più vicina punta di lavoro.

OriginaleL’autore Tony L. | 2009-06-18

7 Replies
  1. 4

    Ho avuto lo stesso problema un paio di anni fa, poi ho rinunciato responseXML e iniziato utilizzando sempre responseText. Questa analisi ha sempre lavorato per me:

    function parseXml(xmlText){
        try{
            var text = xmlText;
            //text = replaceAll(text,"&lt;","<");
            //text = replaceAll(text,"&gt;",">");
            //text = replaceAll(text,"&quot;","\"");
            //alert(text);
            //var myWin = window.open('','win','resize=yes,scrollbars=yes');
            //myWin.document.getElementsByTagName('body')[0].innerHTML = text;
            if (typeof DOMParser != "undefined") { 
                //Mozilla, Firefox, and related browsers 
                var parser=new DOMParser();
                var doc=parser.parseFromString(text,"text/xml");
                //alert(text);
                return doc; 
            }else if (typeof ActiveXObject != "undefined") { 
                //Internet Explorer. 
            var doc = new ActiveXObject("Microsoft.XMLDOM");  //Create an empty document 
                doc.loadXML(text);            //Parse text into it 
                return doc;                   //Return it 
            }else{ 
                //As a last resort, try loading the document from a data: URL 
                //This is supposed to work in Safari. Thanks to Manos Batsis and 
                //his Sarissa library (sarissa.sourceforge.net) for this technique. 
                var url = "data:text/xml;charset=utf-8," + encodeURIComponent(text); 
                var request = new XMLHttpRequest(); 
                request.open("GET", url, false); 
                request.send(null); 
                return request.responseXML; 
            }
        }catch(err){
            alert("There was a problem parsing the xml:\n" + err.message);
        }
    }

    Con questo Oggetto XMLHttpRequest:

    //The XMLHttpRequest class object
    
    debug = false;
    
    function Request (url,oFunction,type) {
        this.funct = "";
        //this.req = "";
        this.url = url;
        this.oFunction = oFunction;
        this.type = type;
        this.doXmlhttp = doXmlhttp;
        this.loadXMLDoc = loadXMLDoc;
    }
    
    function doXmlhttp() {
        //var funct = "";
        if (this.type == 'text') {
            this.funct = this.oFunction + '(req.responseText)';
        } else {
            this.funct = this.oFunction + '(req.responseXML)';
        }
        this.loadXMLDoc();
        return false;
    }
    
    function loadXMLDoc() {
        //alert(url);
        var functionA = this.funct;
        var req;
        req = false;
    
        function processReqChange() {
            //alert('reqChange is being called');
            //only if req shows "loaded"
            if (req.readyState == 4) {
                //only if "OK"
                if (req.status == 200) {
                    //...processing statements go here...
                    eval(functionA);
                    if(debug){
                        var debugWin = window.open('','aWindow','width=600,height=600,scrollbars=yes');
                        debugWin.document.body.innerHTML = req.responseText;
                    }
                } else {
                    alert("There was a problem retrieving the data:\n" +
                        req.statusText + '\nstatus: ' + req.status);
                    if(debug){
                        var debugWin = window.open('','aWindow','width=600,height=600,scrollbars=yes');
                        debugWin.document.body.innerHTML = req.responseText;
                    }
                }
                }
        }
    
        //branch for native XMLHttpRequest object
        if(window.XMLHttpRequest) {
            try {
                req = new XMLHttpRequest();
            } catch(e) {
                req = false;
            }
        //branch for IE/Windows ActiveX version
        } else if(window.ActiveXObject) {
            try {
                    req = new ActiveXObject("Msxml2.XMLHTTP");
            } catch(e) {
                    try {
                        req = new ActiveXObject("Microsoft.XMLHTTP");
                    } catch(e) {
                        req = false;
                    }
            }
        }
    
    
    
        if(req) {
            req.onreadystatechange = processReqChange;
            if(this.url.length > 2000){
                var urlSpl = this.url.split('?');
                req.open("POST",urlSpl[0],true);
                req.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
                req.send(urlSpl[1]);
            } else {
                req.open("GET", this.url, true);
                req.send("");
            }
        }
    }
    
    function browserSniffer(){
        if(navigator.userAgent.toLowerCase().indexOf("msie") != -1){
            if(navigator.userAgent.toLowerCase().indexOf("6")){
                return 8;
            }else{
                return 1;
            }
        }
        if(navigator.userAgent.toLowerCase().indexOf("firefox") != -1){
            return 2;
        }
        if(navigator.userAgent.toLowerCase().indexOf("opera") != -1){
            return 3;
        }
        if(navigator.userAgent.toLowerCase().indexOf("safari") != -1){
            return 4;
        }
        return 5;
    }

    Concesso, questo è molto vecchio codice, ma si sta ancora lavorando, per me, su un sito ho costruito un paio di anni fa. Sono d’accordo con tutti gli altri, anche se io in genere uso un quadro oggi quindi non ho bisogno di utilizzare questo codice o qualcosa di simile più.

    Si possono ignorare alcune delle indicazioni con split, ecc… nella Richiesta onreadystate funzione. Doveva convertire la richiesta di un post se è stato più di una certa lunghezza, ma ho appena deciso che era sempre meglio fare un post.

    responseText sembra solido cross-browser in ambiente penso che ho intenzione di utilizzare questo metodo. Grazie per lo script
    Nessun problema, contento di aver potuto aiutare!
    La tua risposta mi ha indicato la giusta direzione per un problema simile e 7 anni dopo 🙂 stavo usando .risposta in IE9 e che non ha funzionato durante il lavoro in tutti gli altri browser. .responseText funziona in tutti i browser. Bene!

    OriginaleL’autore Heat Miser

  2. 3

    Questo problema si verifica soprattutto quando il tipo di contenuto è mis-rilevato dal browser o non inviati correttamente.

    La sua più facile ignorare:

    var request = new XMLHttpRequest(); 
    request.open("GET", url, false); 
    request.overrideMimeType("text/xml");
    request.send(null); 
    return request.responseXML; 

    Non so perché… Questo problema si verifica solo con Safari e Chrome (browser WebKit, il server invia le intestazioni correttamente).

    ciò ha risolto il mio problema. Grazie

    OriginaleL’autore Aron

  3. 1

    Chiama l’URL relativo al documento corrente? Dal momento che IE sarebbe utilizzando la ActiveXObject, potreste aver bisogno di un percorso assoluto, per esempio:

    http://some.url/ConferenceRoomSchedules.xml

    Come per l’XML, siete sicuri che sia ben formato? Non è possibile caricare in un editor XML, per esempio?

    Grazie per la risposta. Ho provato ad usare il percorso assoluto, ma ancora senza fortuna, stessi risultati in IE.

    OriginaleL’autore Andy E

  4. 1

    Quello che ti posso suggerire è di dare un’occhiata a quadri che si nascondono e gestire questi cross-browser (in modo affidabile). Un buon punto qui è jQuery. Facendo queste cose per te può diventare molto difficile e complesso.

    Questo può essere quello che ti serve.

    //Edit:
    Questo è come il w3school mostra:

    function ajaxFunction()
    {
    var xmlhttp;
    if (window.XMLHttpRequest)
      {
      //code for IE7+, Firefox, Chrome, Opera, Safari
      xmlhttp=new XMLHttpRequest();
      }
    else if (window.ActiveXObject)
      {
      //code for IE6, IE5
      xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
      }
    else
      {
      alert("Your browser does not support XMLHTTP!");
      }
    }
    Questo è un buon suggerimento. Lasciate che la biblioteca preoccuparsi di croce problemi di browser.
    Sono d’accordo, ho usato jQuery, ma il mio capo non vuole riempire il sito con un intero quadro, se si sta solo andando a utilizzare ajax. Quindi devo farlo io. Anche se sto ancora cercando di convincerlo a usare un framework.
    L., digli di jQuery è uno script, non un quadro. Quadro suoni pesanti.
    e poi digli che scrivendo a voi, avete bisogno di circa 5 giorni lavorativi tempo di sviluppo + probabilmente bug-fixing a causa di qualche strana browser stranezze e con jQuery è possibile ottenere tutto gratis e molto più sicuro. Date un’occhiata a questo qui: code.google.com/apis/ajaxlibs

    OriginaleL’autore Juri

  5. 0

    Per evitare il cross-browser problemi (e salva te stesso la codifica di un sacco di oggetti che una comunità forte, ha già sviluppato, testato e recensito), è necessario selezionare una libreria javascript. JQuery Dojo sono grandi scelte.

    OriginaleL’autore marr75

  6. 0

    Credo che il server web ha bisogno di servire corrette intestazioni di risposta con ‘ConferenceRoomSchedules.xml per esempio Content-Type: text/xml o qualsiasi altro tipo xml.

    OriginaleL’autore Jozef Briss

Lascia un commento