2011-01-07 8 views
2

UPDATE 1: Ich habe nicht herausgefunden, was vor sich geht, aber das scheint definitiv ein Problem mit meinem Projekt zu sein. Nachdem ich eine einfache Testseite erstellt hatte, konnte ich feststellen, dass getJSON tatsächlich ein XHR-Objekt zurückgibt, wie es sein sollte.jQuery Ajax-Methoden, die kein XHR-Objekt zurückgeben

UPDATE 2: Wow, das ist seltsam. Nachdem ich mehr Tests gemacht habe, habe ich festgestellt, dass wenn ich den "Callback =?" Parameter in der URL-Zeichenfolge das XHR-Objekt wird nicht ordnungsgemäß zurückgegeben. Wenn ich jedoch nicht den "Rückruf =?" Parameter, das XHR-Objekt wird ordnungsgemäß zurückgegeben. Die Sache ist, ich rufe einen JSONP-Dienst an, also der "Rückruf =?" Parameter ist erforderlich.

Irgendwelche Ideen darüber, warum dies der Fall sein würde?

UPDATE 3: Hier sind ein paar eigenständige Codebeispiele zur Veranschaulichung des Problems. Im ersten Beispiel ist console.log (request) nicht definiert. Wenn ich den Callback-Parameter im zweiten Codebeispiel fest codiere, ist console.log (request) das XHR-Objekt.

<html> 
    <head> 
     <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script> 
    </head> 
    <body> 
     <script> 
      $(document).ready(function() { 
       var request = $.getJSON('http://localhost?callback=?', function(data) { 

       }); 
       console.log(request); 
      }); 
     </script> 
    </body> 
</html> 

<html> 
    <head> 
     <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script> 
    </head> 
    <body> 
     <script> 
      $(document).ready(function() { 
       var request = $.getJSON('http://localhost?callback=callback', function(data) { 

       }); 
       console.log(request); 
      }); 
     </script> 
    </body> 
</html> 

UPDATE 4: Per unten regilero Kommentar wechselte ich die $ Schnipsel-Methode unter Verwendung von über und übergeben die Parameter über ein Datenobjekt auf. Hier ist der vollständige Code für die Anfrage:

var request = $.ajax({ 
    data: { 
     f: 'json', 
     geometry: '{x:44.203642291681845,y:-95.79085806500001}', 
     geometryType: 'esriGeometryPoint', 
     imageDisplay: '727,500,96', 
     layers: 'all', 
     mapExtent: '-179.462733065,16.116769346042226,-51.669764315000016,71.57609342040729', 
     returnGeometry: false, 
     tolerance: 10 
    }, 
    dataType: 'jsonp', 
    success: function(data) { 
     console.log(data); 
    }, 
    url: 'http://server.arcgisonline.com/ArcGIS/rest/services/Specialty/Soil_Survey_Map/MapServer/identify' 
}); 
console.log(request); 

Wenn ich "datatype: 'JSONP'" angeben, in dem Config-Objekt, console.log (Anfrage) ist wieder nicht definiert. Wenn ich jedoch "dataType: 'json'" festlege, ist console.log (request) das XHR-Objekt.

Dieses Verhalten ist konsistent mit dem, was ich mit der Verknüpfung $ .getJSON erlebt habe.


ORIGINAL FRAGE

Pro die Stackoverflow Frage/Antwort hier: Abort Ajax requests using jQuery und eine Reihe anderer Fragen/Antworten auf dieser Seite und andere sollten die jQuery Ajax Methoden, um das XHR-Objekt zurück.

Wenn ich jedoch den folgenden Code ausführen, ist Anfrage "undefiniert".

var request = $.getJSON(url, function(data) { 
    console.log(data); 
}); 

console.log(request); 

Habe ich eine Änderung in jQuery übersehen? Ich benutze 1.4.4.

+0

Laut Handbuch soll es noch ein XHR-Objekt zurück. http://api.jquery.com/jQuery.getJSON/ Vielleicht schlägt die Anfrage fehl? –

+0

@Pekka: Nein, die Anfrage scheitert definitiv nicht. –

+0

Ja, tut mir leid. Ich habe die Frage falsch gelesen. – Anders

Antwort

4

jsonp verwendet nicht XMLHTTPRequest. Dies ist ein Workaround für dieselbe Richtlinie, die für alle XMLHTTPRequests gilt. Es funktioniert durch Einfügen von <script> Tags in das DOM, und fordert den Server auf, ein JSON-Objekt zurückzugeben, das in eine mit dem Parameter callback=? gekennzeichnete JS-Funktion eingebettet ist.

Da XMLHTTPRequest nicht verwendet wird, wird kein Objekt dieses Typs zurückgegeben.

+0

Das wurde langsam offensichtlich! Danke für die Bestätigung. Also ich denke, es gibt keine Möglichkeit, eine JSONP-Anfrage abzubrechen, oder? Ich denke, das Beste, was ich tun kann, ist die Rückkehr von "veralteten" JSONP-Anfragen zu ignorieren. –

+0

@Nate Nein, es gibt keine Möglichkeit, eine JSONP-Anfrage abzubrechen. – lonesomeday

+0

Wenn Sie sich fragen, können Sie Script-Anfragen (JSONP) abbrechen, indem Sie window.stop() aufrufen. Dies bricht jedoch alle ausstehenden Bild- und Skriptanforderungen ab, so dass es in den meisten Fällen keine großartige Lösung ist. –

0

Falsche Antwort. Ignoriere diesen Beitrag.

$ .getJSON gibt keinen Wert zurück. Stattdessen erhält es die Antwort der übermittelten URL und konvertiert sie in das JSON-Objekt und übergibt es an Callback, wenn es übergeben wird. Überprüfen Sie die URL: [Link-Text] [1] [1]: http://api.jquery.com/jQuery.getJSON/ getJSON Methode Skelett (per jQuery Site): > jQuery. getJSON (URL, [Daten], [ > Rückruf (Daten, TextStatus, Xhr)]) > > URL Zeichenfolge mit der URL zu > die die Anfrage gesendet wird. > > dataA Karte oder Zeichenfolge, die an > der Server mit der Anforderung gesendet wird. > > Rückruf (data, textStatus, xhr) A > Rückruffunktion, die ausgeführt wird, wenn > die Anfrage erfolgreich ist.
+0

Gemäß der Dokumentation, die Sie verknüpft haben, gibt getJSON die XmlHttpRequest zurück. Sehen Sie sich die Kopfzeile auf der rechten Seite an. –

+0

Thx Nate. Der Post wurde mit gelöschten Zeilen aktualisiert. – Chandu

0

$ .getJSON ist eine Abkürzung für $ .ajax(), wie die meisten Kürzel von $ .ajax() gibt es keinen Standardfehlerhandler. Versuchen Sie, $ .ajax zu verwenden, und setzen Sie Fehlerhandler entsprechend. Maye etwas ist falsch in Ihrer Json-Syntax. Und du bist im Problem "stumm scheitern".

Doc-Extrakt:

Wichtig: Ab jQuery 1.4, wenn die JSON-Datei einen Syntaxfehler enthält, wird die Anfrage in der Regel unbemerkt fehlschlagen. Vermeiden Sie häufige manuelle Bearbeitung von JSON Daten aus diesem Grunde. JSON ist ein Datenaustauschformat mit Syntax Regeln, die als die wörtlichen Notation Objekt JavaScript strenger sind. Zum Beispiel müssen alle Zeichenfolgen in JSON, ob sie Eigenschaften oder Werte sind, in doppelte Anführungszeichen eingeschlossen werden. Einzelheiten zum Format JSON finden Sie unter http://json.org/.

+0

Nein, ich bekomme definitiv eine richtige Antwort zurück. Siehe "Update 2" in meinem ursprünglichen Post. Dort gibt es einige neue Informationen. –

+0

@Nate über den Parameter, müssen Sie Ihre URL urlencode oder den Datenparameter von $ .ajax() verwenden, um die Parameter der URL festzulegen. Und wenn Sie "richtige Antwort" sagen, sind Sie sicher, dass es wirklich gut in Bezug auf die Syntax ist? – regilero

+0

Ich habe es gerade versucht. Check out "Update 4" oben. –

0

Die $.getJSON Funktion ist asynchron Bedeutung, dass es hinter dem Skript läuft weiter, auch wenn die JSON-Anforderung noch nicht fertig. Es ist möglich, dass Ihr console.log(request); ausgeführt wird, bevor die Anfrage zurückkehrt, und vielleicht hat es nicht das xhr-Objekt.

Ich weiß, das es nicht sicher, aber es ist ein Gedanke.

EDIT: war Im Folgenden meine ursprüngliche Antwort, die ich war falsch erkennen
Das XHR Objekt als drittes Argument an die Callback-Funktion übergeben wird. Wenn Sie es wollen, müssen Sie dies verwenden: function(data, statusText, xhr) { anstelle von diesem function(data) {.

Jetzt, wenn Ihr Erfolg Rückruf überhaupt nicht aufgerufen wird, ist das eine andere Geschichte. Versuchen Sie, beim Rückruf einen alert(statusText); hinzuzufügen, um sicherzustellen, dass er aufgerufen wird. Wenn es nicht aufgerufen wird, tun Sie dies als @regilero erwähnt und verwenden Sie $.ajax mit einem Fehler-Handler übergeben, um zu sehen, ob irgendwelche Fehlermeldungen auftauchen.

+0

$ .getJSON gibt das XHR-Objekt zurück, daher sollte die Tatsache, dass es sich um eine asynchrone Anfrage handelt, nichts damit zu tun haben. –

0

die erste Antwort falsch ist eigentlich können Sie die Ajax-Anforderung abbrechen;)

$.ajax({ 
    url: "/event/search/list-event.html", 
    data:{ 
     page: 1 
    }, 
    beforeSend: function(xhr) 
    {  
     if(window.eventListXhr != null){ 
      window.eventListXhr.abort(); 
     } 
     window.eventListXhr = xhr; 
    }, 
    success: function(data) { 
     // .... 
    } 
}); 
+0

Ja, ich glaube, das war nicht verfügbar, wenn ich die Frage zum ersten Mal gestellt, aber seit jQuery hinzugefügt wurde. –