2012-06-24 8 views
8

Ich habe ein Problem mit Jsonp und Jquery.jQuery JSONP ruft den Rückruf nicht

Dies ist mein Code -

var myCallback = function(data) { 
    console.log(data); 
}; 

$.ajax({ 
    url: my_url, 
    type: 'GET', 
    dataType: 'jsonp', 
    jsonp: 'callback', 
    jsonpCallback: 'myCallback' 
}); 

jQuery fügt etwas wie ?callback=myCallback&_=1340513330866 my_url und die zurückgegebenen Daten von my_url ist myCallback('abcd') - obwohl sie in Wirklichkeit wird es einige HTML-Code anstelle des abcd zurückkehren.

Problem: abcd ist nicht eingeloggt in console durch myCallback. Also, was mache ich falsch? Ich hatte den Eindruck, dass die zurückgegebenen Daten so ausgeführt werden, wie sie innerhalb von Script-Tags sind.

+0

könnten Sie ein Beispiel für die Antwort stellen Sie – matt3141

+1

'myCallback' global sein muss ... ist es? –

Antwort

16

Wenn Sie eine eigene Funktion zu verwenden, dann müssen Sie explizit deklarieren global. Zum Beispiel:

window.myCallback = function(data) { 
    console.log(data); 
}; 

DEMO


Erklärung

Jede Funktion, die in Reaktion auf einen erfolgreichen JSONP Antrag muss global sein genannt werden soll. jQuery macht das auch. Dies liegt daran, dass JSONP nichts anderes ist, als eine (dynamisch generierte (meiste Zeit)) JavaScript-Datei mit einem <script>-Tag aufzunehmen, der nur einen Funktionsaufruf enthält. Da jedes Skript global ausgewertet wird, muss die aufgerufene Funktion ebenfalls global sein.

+0

Du hast meine Zeit gerettet. danke – jasper

+0

@Felix - Danke, das angegebene Beispiel hat mir sehr geholfen. +10; – Aviator

+0

es funktioniert, danke! – shaosh

-1

entfernen Apostroph aus der aufgerufenen Methode dies funktionieren wird, überprüfen Sie den Code hier,

var myCallback = function(data) { 
     console.log(data); 
    }; 

$.ajax({ 
    url: my_url, 
    type: 'GET', 
    dataType: 'jsonp', 
    jsonp: 'callback', 
    jsonpCallback: myCallback 
}); 

Versuchen Sie, diese fiddle

+0

Das wird nicht funktionieren. Aus der Dokumentation: * "Ab jQuery 1.5 können Sie auch eine Funktion für diese Einstellung verwenden. In diesem Fall wird der Wert von jsonpCallback ** auf den Rückgabewert dieser Funktion gesetzt **." *. Deine Geige ist nicht richtig aufgebaut, also frage ich mich, was sie zeigen soll. –

+0

Aber wenn ich es probiert habe, arbeite ich an Probe Ich habe auch eine funktionierende Geige hinzugefügt du kannst die Geige überprüfen, die ich hinzugefügt habe –

+0

Wie gesagt, ich weiß nicht, was deine Demo zeigen soll. Es zeigt nur eine Warnung mit "undefined" ... was nichts beweist. Sie haben nicht einmal die JSONP-URL für die Geige verwendet. Wenn Sie sich die Entwickler-Tools ansehen (Registerkarte "Netzwerk", vorausgesetzt, Chrome), werden Sie feststellen, dass überhaupt keine Anfrage gestellt wird ... der Ajax-Aufruf findet nicht statt. Um es klar zu sagen: Die Warnung wird angezeigt, weil jQuery die Funktion aufruft, die Sie 'jsonpCallback' ** zuweisen, um den Rückrufnamen ** zu erhalten, genau wie in der Dokumentation angegeben. Es wird ** nicht ** als Reaktion auf einen erfolgreichen Ajax-Aufruf aufgerufen. –

0

Warum nicht einfach:

$.getJSON(my_url, myCallback); 

diese Funktion Scoping behandelt und sieht viel einfacher

+0

Dies funktioniert nicht mit Jsonp –