2011-02-03 9 views
10

Ho appena aggiornato dalla versione 1.4 alla versione 1.5 di jQuery e ora le mie chiamate AJAX falliscono sempre con l'errore "etichetta non valida".jQuery 1.5 La chiamata AJAX fallisce con "etichetta non valida" per le richieste JSON

Un esempio di richiesta è:

jQuery.ajax({ 
    async: false 
    , dataType: "json" 
    , error: function (xhr, status, error) { ... } 
    , success: function (data, status, xhr) { ... } 
    , type: "post" 
    , url: "ajax/request.asp" 
}); 

In rete ho trovato questo errore viene generato quando il JSON restituito non è avvolto con callback jQuery (ad es jQuery1234({ "something": "abcd" })

Il problema è che sto tornando. un JSON, non un JSONP (e lo dichiaro nella richiesta AJAX), quindi perché devo specificare una richiamata nel JSON restituito?

Il 1.5 changelog non dice nulla su questo ... (O sono io che non posso leggi?)

Aggiornamento:

Questo è un esempio di un JSON non funziona:

{ 
    "esito":"Ok", 
    "centriCosto":[ 
     { 
     "id":"1", 
     "descrizione":"Colazione" 
     }, 
     { 
     "id":"2", 
     "descrizione":"Pranzo" 
     }, 
     { 
     "id":"3", 
     "descrizione":"Cena" 
     } 
    ] 
} 

E questo è lo stesso callback avvolto lavoro JSON:

jQuery1502710949228847014_1296739130498({ 
    "esito":"Ok", 
    "centriCosto":[ 
     { 
     "id":"1", 
     "descrizione":"Colazione" 
     }, 
     { 
     "id":"2", 
     "descrizione":"Pranzo" 
     }, 
     { 
     "id":"3", 
     "descrizione":"Cena" 
     } 
    ] 
}) 

proposito, Firebug dice che entrambi sono JSON validi (ed è molto esigente riguardo alla correttezza).

+0

potrebbe essere un problema con il JSON in sé, ho notato che da quando 1.4 JQ è stata molto più stringenti sulla struttura JSON. Il mio primo progetto JSON del 2007 iniziò a mancare quando aggiorno il mio JQ, aprii l'output JSON e fui colpito da quanto male lo strutturassi. Puoi pubblicare il JSON? – picus

+0

@picus: No, convalido il mio JSON contro più validatori ed è ok. Se implemento la callback JSONP, riprende a funzionare, quindi non è un problema con il formato. – Albireo

+0

@picus: ho aggiunto un esempio di JSON non funzionante e funzionante. – Albireo

risposta

28

Ok, ho scoperto che diavolo sta succedendo.

jQuery's Validation plug-in non è compatibile con jQuery 1.5 (vedere one e two), rimuovendo il rendimento del plug-in per il comportamento corretto.

Se qualcun altro ha questo problema, c'è una patch nel repository del plug-in: link

+0

Grazie per aver condiviso il link. Mi hai salvato la giornata! –

+0

Il mio collega ha appena trascorso l'ultima ora cercando di capire un problema simile. Abbiamo aggiornato a 1.6 e non c'è più conflitto con il plug-in di convalida. Grazie. –

1

prova: fatto una rapida ricerca per JSON in jQuery-1.5.js e abbiamo trovato questo nel braccio 6905:

// Rileva, normalizzare le opzioni e installare callback per jsonp chiede

jQuery.ajaxPrefilter("json jsonp", function(s, originalSettings, dataIsString /* internal */) { 

rimozione del "json" dal primo argomento aggiungerà un comportamento corretto quando spec. dataType:"json"

5

realtà ho corse in problema simile, ma sembra essere correlato a questo bug: http://bugs.jquery.com/ticket/8398

non è necessariamente legato alla jQuery-validate e mi c'è voluto un po 'per capire le cose. Si scopre che jQuery 1.5 sta modificando le successive chiamate ajax per json a jsonp che porta a questo errore.

ho fissato seguendo una delle soluzioni suggerite nella cronologia delle modifiche bug e inserendo il seguente codice da qualche parte davanti ai miei chiamate ajax sono fatte:

$.ajaxSetup({ 
    jsonp: null, 
    jsonpCallback: null 
}); 

dovrebbe risolvere gli eventuali problemi per le altre richieste Ajax troppo.

1

Se il codice sul lato server si basa sul nome di callback che inizia con "jsonp", è possibile che si sia verificato un problema. Il prefisso del nome callback è stato modificato in "jQuery" nella versione 1.5.

1

sembra che questo è stato risolto nella v1.6 - ha avuto lo stesso problema dopo l'aggiornamento alla versione 1.5.1 & dopo l'aggiornamento a 1.6 il problema è scomparso.

2

Ecco una possibile soluzione per quelli con il plugin di convalida.

dataType: "json testo"

funziona come un fascino. Non chiedermi il perché. Su Chrome, puoi vedere un errore di sintassi jQuery che analizza ":" sul ritorno di JSON. E non fare errori su di esso, il ritorno è valido JSON. Non l'ho provato, ma sospetto che anche la risposta di Tom sopra funzionerà.

0

Aggiornamento a jQuery 1.7 risolve

0

Ecco la soluzione:

$.post("...", {}, 
     function(data) { 

     // dont forget to add below lines   

     },"json"); 
+0

Dovresti aggiungere del metatesto – keyser

Problemi correlati