2009-04-20 17 views
18

Sto provando a utilizzare la funzione getJSON in jQuery per importare alcuni dati e attivare una funzione di callback. La funzione di callback non funziona. Tuttavia, se provo la stessa cosa con la funzione get, funziona bene. Stranamente, funziona con la funzione get anche quando passo "json" come tipo. Perché sta succedendo? Ho provato il seguente file in Firefox 3 e IE 7:non funziona quando si utilizza la funzione getJSON in jQuery

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html><head> 
<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'> 
<title>ajax test</title> 
<script type="text/javascript" src="/jquery-1.3.2.min.js"></script> 
</head> 
<body> 
<input type="button" id="test1" value="get"> 
<input type="button" id="test2" value="getJSON"> 
<input type="button" id="test3" value="get with json type"> 
<script type="text/javascript"> 
$("#test1").click(function() { 
    $.get("index.html", 
     function(response) { 
      alert('hi'); 
      //works 
     } 
    ) 
}); 

$("#test2").click(function() { 
    $.getJSON("index.html", 
     function(response) { 
      alert('hi'); 
      //doesn't work 
     } 
    ) 
}); 

$("#test3").click(function() { 
    $.get("index.html", 
     function(response) { 
      alert('hi'); 
      //works 
     }, 
     "json" 
    ) 
}); 
</script> 
</body></html> 

Questo sembra accadere qualunque cosa URL accedo, fintanto che è sullo stesso dominio. Ho provato a passare alcuni dati e questo non fa differenza.

Ovviamente posso aggirare il problema utilizzando la funzione get come ho fatto nella mia terza funzione di test, ma sono ancora curioso di sapere perché questo sta accadendo.

So che c'è uno similar question chiesto qui ma non ha risposto alla mia domanda.

+0

Potrebbe essere che il JSON è mal formato? – karim79

+0

Cosa c'è in index.html? – grammar31

+0

Forse avrei dovuto essere più chiaro. index.html è il file che ho postato sopra. Sto solo cercando di accedere al documento stesso, che non è la cosa più utile. L'ho messo lì perché era semplice e conveniente. Di nuovo, non sembra importare cosa ho messo per l'URL. Il documento deve essere valido? –

risposta

24

Il json deve essere valido, altrimenti il ​​callback non scatterà.

+0

Grazie per la risposta veloce. –

+0

È vero, Firefox e IE reagiscono in modo diverso a JSON non valido –

+5

questa è una di quelle cose che sembra incredibile - perché dovrebbe fallire silenziosamente? ma è assolutamente vero. http://www.jsonlint.com/ è un valido validatore. –

0

Sotto la superficie, quando si chiama getJSON, questo è ciò che sta succedendo:

// ~ line 3216 
getJSON: function(url, data, callback) { 
    return jQuery.get(url, data, callback, "json"); 
}, // ... rest of jQuery core 

Quindi ci deve essere qualche altra cosa che impedisce la richiamata di sparare ...

Vorrei iniziare ** alert ** ing diverse cose (non solo 'ciao') su ogni richiamata, in questo modo si sa quale fallisce/succede.

0

Come menzionato da numerosi altri, è necessario JSON valido (cioè conforme alle regole in http://json.org/) per getJSON al lavoro (questo significa che non è possibile ottenere tramite HTML getJSON come nel tuo esempio).

Il motivo per cui l'ultimo test funziona è perché l'ultimo parametro "json" non viene interpretato come "tipo". Poiché il seguente non funziona:

$("#test3").click(function() { 
    $.get("index.html", 
     '', 
     function(response) { 
       alert('hi'); 
       //works 
     }, 
     "json" 
    ) 
}); 
0

Ho avuto lo stesso problema pur avendo ben formato JSON, ecc sono stato in grado di interrogare il mio webservice, e ottenere una risposta, tuttavia, la mia funzione di callback non stava sparando. Dopo aver ripulito la rete, la maggior parte degli interweber mi ha suggerito di usare "jsonp", cosa che ho fatto dal momento che la mia app esegue alcune chiamate interdominio e ha aggiunto anche "callback?" al mio url. Questo non ha funzionato, ma che includendo il callback con il JSON restituito ha risolto il mio problema. Il codice qui sotto spiega cosa intendo:

//server side json formed somewhere up here 
String data = callback + "("+ json +")" ; 

la risposta risultante da questo è qualcosa come "jsonp1280403476086([{"Name":"Jack Sparrow" che jQuery sembrava non avere un problema e così mai morto su di me.

Spero che questo aiuti.

4

$ GetJSON() è JSONP, in modo da modificare in questo modo:

$("#test2").click(function() { 
    $.getJSON("index.html?callback=?", 
     function(response) { 
       alert('hi'); 
     } 
    ) 
}); 

Server riceve param callback riempita con qualcosa di simile: jsonp1291077863309. In una risposta, richiamare la funzione di callback jsonp1291077863309 (PUT_JSON_HERE).

0

Uso $.post invece di $.getJSON(), in MVC2 se si utilizza $.getJSON o $.get assicurarsi di impostare JsonRequestBehavior-AllowGet. Altrimenti questo restituirà un errore HTML che fa sì che il tuo requst non attivi il callback.

3

Giusto! Dopo 2 giorni a impazzire cercando di fare $.getJSON di accettare una stringa JSon ben formata dal server, il problema era davvero sul server! Proprio come dice Carl_Platt, devi anteporre il valore di callback ricevuto come parametro url all'output json ($_GET['callback'] in PHP). Si chiama "uscita JSON-P", nel caso tu voglia google a riguardo.

Hands on, ecco una pagina in cui mostrano la soluzione in PHP:

http://1080d.com/lang/en-us/2009/10/converting-php-to-jsonp-with-json_encode/

E ricorda (molto importante) per aggiungere alla URL si chiama il parametro callback=?! (Necessario solo se l'url che stai chiamando non è nello stesso server che serve lo script jquery in esecuzione) ...

JQuery sostituirà automaticamente '?' con un valore conveniente prima di inviarlo al server. Non è necessario preoccuparsi di quale valore è utilizzato, sarà tutto senza soluzione di continuità per te (se il server fa il lavoro giusto! E questo era il problema nel mio caso!) :-)

Spero che sia d'aiuto!

+0

Grazie mille! fortunatamente per me non ci sto provando da un paio di giorni, ma almeno un paio d'ore, e questo era ESATTAMENTE quello che dovevo fare per sistemarlo! – Tarka

0

Assicurarsi di non avere [HttpPost] elencato sopra il metodo JsonResult nel controller. Ciò non restituirà i dati a una chiamata .getJSON.

Problemi correlati