2009-04-20 21 views
18

Ich versuche, die Funktion getJSON in jQuery zu verwenden, um einige Daten zu importieren und eine Rückruffunktion auszulösen. Die Rückruffunktion wird nicht ausgeführt. Wenn ich jedoch dasselbe mit der get-Funktion versuche, funktioniert es gut. Seltsamerweise funktioniert es mit der Get-Funktion, selbst wenn ich "json" als Typ übergebe. Warum passiert dies? Getestet habe ich die folgende Datei in Firefox 3 und Internet Explorer 7:Callback-Funktion funktioniert nicht, wenn getJSON-Funktion in jQuery verwenden

<!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> 

Diese egal zu geschehen scheint, was URL ich zugreifen, solange es auf der gleichen Domäne ist. Ich habe versucht, einige Daten zu übergeben, und das macht keinen Unterschied.

Natürlich kann ich das Problem umgehen, indem ich die get-Funktion nutze, wie ich es in meiner 3. Testfunktion getan habe, aber ich bin immer noch neugierig, warum das passiert.

Ich weiß, es ist ein similar question hier gefragt, aber es hat meine Frage nicht beantwortet.

+0

Könnte es sein, dass der JSON schlecht gebildet ist? – karim79

+0

Was ist in index.html? – grammar31

+0

Vielleicht hätte ich klarer sein sollen. index.html ist die Datei, die ich oben gepostet habe. Ich versuche nur, auf das Dokument selbst zuzugreifen, was nicht die nützlichste Sache ist. Ich habe das einfach gesagt, weil es einfach und bequem war. Auch hier scheint es egal zu sein, was ich für die URL angegeben habe. Muss der JSON gültig sein? –

Antwort

24

Der JSON muss gültig sein, sonst wird der Callback nicht ausgelöst.

+0

Vielen Dank für die schnelle Antwort. –

+0

Es stimmt, Firefox und IE reagieren unterschiedlich auf ungültige JSON –

+5

Dies ist eines der Dinge, die unglaublich erscheinen - warum würde es still scheitern? aber es ist absolut wahr. http://www.jsonlint.com/ ist ein guter Validator. –

0

Unter der Oberfläche, wenn Sie getJSON nennen, ist das, was geschieht:

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

Also muss es von Brennen der Rückruf eine andere Sache zu verhindern ...

Ich würde beginnen, indem ** alert ** ing verschiedene Dinge (nicht nur 'hi') bei jedem Rückruf, auf diese Weise wissen Sie, welche man nicht erfolgreich/erfolgreich ist.

0

Wie zahlreiche andere erwähnt, müssen Sie gültige JSON (das heißt mit den Regeln auf http://json.org/ entspricht) für getJSON arbeiten (dies bedeutet, dass Sie nicht HTML über getJSON wie in Ihrem Beispiel bekommen).

Der Grund für den letzten Test ist, dass der letzte Parameter "json" nicht als "Typ" interpretiert wird. Da die folgende nicht funktioniert:

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

hatte ich das gleiche Problem obwohl er gut JSON gebildet usw. konnte ich meine Webservice zur Abfrage und eine Antwort erhalten, jedoch wurde meine Callback-Funktion nicht ausgelöst. Nachdem ich das Netz gehuscht hatte, schlug ich vor, "jsonp" zu verwenden, was ich getan habe, seit meine App einige domänenübergreifende Aufrufe durchgeführt hat, und fügte auch "Rückruf" hinzu. zu meiner URL. Das hat nicht funktioniert, aber das Einbeziehen des Rückrufs mit dem zurückgegebenen JSON hat mein Problem gelöst. Der Code unten erklärt, was ich meine:

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

die Antwort daraus resultierenden ist so etwas wie „jsonp1280403476086([{"Name":"Jack Sparrow“ die jQuery schien kein Problem zu haben, und so starb nie auf mich.

Hoffe, das hilft.

4

$ .getJSON() ist JSONP, so dass es auf diese Weise ändern:

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

Server empfängt param Rückruf mit etwas gefüllt wie: jsonp1291077863309. In einer Antwort zurückschreiben Rückruffunktion jsonp1291077863309 (PUT_JSON_HERE).

0

Verwenden $.post statt $.getJSON(), in MVC2, wenn Sie mit $.getJSON oder $.get sicher sein JsonRequestBehavior-AllowGet einzustellen. Andernfalls wird ein HTML-Fehler zurückgegeben, der dazu führt, dass Ihr Request den Rückruf nicht auslöst.

3

Richtig! Nach 2 Tagen verrückte Versuche, $.getJSON zu machen, um eine wohlgeformte JSON-Zeichenfolge vom Server zu akzeptieren, war das Problem wirklich auf dem Server! Genau wie Carl_Platt sagt, müssen Sie den Callback-Wert, der als URL-Parameter empfangen wurde, dem json-Ausgang ($_GET['callback'] in PHP) voranstellen. Das nennt man "JSON-P output", nur für den Fall, dass Sie darüber googlen wollen.

Hände auf, hier eine Seite, wo sie die Lösung in PHP zeigen:

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

Und denken Sie daran (ganz wichtig) an die URL Sie den callback=? Parameter rufen hinzuzufügen! (Wird nur benötigt, wenn die von Ihnen aufgerufene URL nicht auf demselben Server ist, auf dem das ausführende jquery-Skript ausgeführt wird) ...

JQuery ersetzt automatisch "?" mit einem günstigen Wert vor dem Senden an den Server. Sie müssen sich keine Sorgen darüber machen, welcher Wert verwendet wird, alles wird nahtlos für Sie sein (wenn der Server den richtigen Job macht! Und das war das Problem in meinem Fall!):

Hope it helps!

+0

Vielen Dank! Zum Glück für mich habe ich nicht ein paar Tage versucht, aber mindestens ein paar Stunden, und das war genau das, was ich tun musste, um es zu reparieren! – Tarka

0

Stellen Sie sicher, dass [HttpPost] nicht über Ihrer JsonResult-Methode in Ihrem Controller aufgeführt ist. Dies wird keine Daten an einen .getJSON-Aufruf zurückgeben.

Verwandte Themen