2009-06-09 18 views
8

Sto cercando di imparare JQuery e ho un piccolo problema con ajax. Sto cercando di popolare un array javascript con valori restituiti da una risposta XML da una pagina.
Ecco la mia pagina principale (ajax.html):La funzione di errore JQuery ajax viene eseguita anche se la query ha esito positivo

<html> 
<head> 
<script type="text/javascript" src="jquery/jquery.js"></script> 
<script type="text/javascript" src="jquery/fiber.js"></script> 
</head> 
<body> 
<p>Ajax</p> 
<script> 
var ringType = new Array(); 

</script> 
</body> 
</html> 

fiber.js è questa: (? Senza le barre rovesciate in \)

//process things for fiber map 
jQuery(document).ready(function() { 
// do stuff when DOM is ready 

//populate and display ringType 
$.ajax({ 
    type: "GET", 
    url: "ajaxHelper.pl", 
    data: { 
     getRingTypes: "1", 
     }, 
    dataType: "xml", 
    success: function(xml) { 
     //if the query was successfull, 
     alert("Got an xml object:"+$(xml)); 
     $(xml).find("ringType").each(function(){ 
      alert("Received reply "+$(this).text()); 
      var type = $(this).html(); //save the value 
      //append to ringType array 
      ringType.push(type); 
     }); 
    }, 
    error:function (xhr, ajaxOptions, thrownError){ 
     alert(xhr.status); 
     alert(thrownError); 
    } 
}); 
for(var i=0; i<ringType.length; i++){ 
    document.write("<br>"+ringType[i]); 
} 

}); 

ajaxHelper.pl genera questo XML (come Content tipo text/xml):

<?xml version="1.0" encoding="ISO-8859-1"?> 
    <\?xml version="1.0" encoding="ISO-8859-1"\?> 
    <ringType>IA</ringType> 
    <ringType>IL</ringType> 
    <ringType>IN</ringType> 
    <ringType>IR</ringType> 
    <ringType>RT</ringType> 

il problema è che ogni volta che carico ajax.html, la query Ajax è successo, ma viene eseguita la funzione di errore! xhr.status = 200 (significa che la query era ok) e thrownException non è definito.

+0

Spiacenti, l'XML non incollare correttamente. Qui va di nuovo (con alcuni spazi): < ringType > IA < ringType > IL < ringType > IN < ringType > IR < ringType > RT Adrian

+0

Prova a mettere Nella parte superiore del documento XML di output, se non si è già – karim79

+0

se si apre il file ajaxHelper.pl nel proprio browser (http: //mywebapp/ajaxHelper.pl), il browser riconosce il risposta dal file come XML? –

risposta

4

Accade in tutti i browser?

1) È possibile utilizzare completo anziché il successo e l'errore per gestire lo stato. Utilizzare un se per controllare lo stato di ritorno XHR e il ramo di conseguenza.

http://docs.jquery.com/Ajax/jQuery.ajax#options

+0

Questo comportamento si verifica su tutti i browser. Cercherò di usare completo invece di successo e ti farò sapere. – Adrian

+1

Ho aggiunto la funzione completa e quando controllo lo stato, ricevo "parsererror", ovvero l'xml che invio non è valido. Almeno ora so dove continuare a scavare. Grazie! – Adrian

+0

Apparentemente gli XML devono avere la definizione di xsd per essere validi. Il mio codice non funzionerà senza di loro. Ora (che ho creato la definizione mancante), tutto funziona come previsto. – Adrian

1

AJAX è asincrona. Significa che la funzione $ .ajax avvierà una richiesta ajaxHelper.pl. Nel frattempo continua ad eseguire il tuo codice. La richiesta non ha alcuna possibilità di tornare prima di raggiungere la riga successiva dopo $ .ajax (...)

for(var i=0; i<ringType.length; i++){... 

quindi suppongo che stai ricevendo un'eccezione che TipoSuon non è definito ...? E questo potrebbe essere il motivo per cui la funzione di errore viene attivata.

+0

Abbastanza buono, ma non fa scattare nemmeno gli avvisi dall'avvio della funzione di successo ... – Adrian

+0

Quando viene generato un errore, lo script smetterà di essere eseguito. Non ho considerato gli interni di jQuery come gestiscono le eccezioni, ma proviamo semplicemente a spostare il ciclo for all'interno del callback. – gregers

5

via http://groups.google.com/group/jquery-en/browse_thread/thread/23679594ebe128a9

il server potrebbe restituire un documento XML con un codice di stato 200. Ma se il browser non è in grado di analizzare il documento, si verificherà un parseerror e verrà richiamato il gestore degli errori di jQuery.

Assicurarsi che si sta tornando XML valido :)

+0

Aveva questo problema, ma con risultati JSON. La correzione era la stessa e funzionava: restituisci JSON valido e il browser è felice, chiamando l'evento giusto al tuo ritorno. – dbarros

Problemi correlati