2012-06-16 18 views
25

Verbrauchte eine geschlagene Stunde, warum auf der Erde zu klären versuchen, diese (Coffee)Welchen Sinn hat jQuery ajax? Macht es tatsächlich etwas?

$.ajax 
    accepts: "application/json; charset=utf-8" 

tat absolut nichts der Header ändern akzeptiert, während diese

$.ajax 
    dataType: "json" 

richtig der Header akzeptiert setzt auf application/json; charset=utf-8

Völlig verwirrt, vermisse ich etwas oder ist das akzeptiert einen ganzjährigen Aprilscherz?

Antwort

24

Wie immer die documentation ist dein Freund:

nimmt

Standard: hängt von Datatype

Der Typ Inhalt im Header Anfrage gesendet, die den Server auf, welche Art von Antwort wird es im Gegenzug akzeptieren. Wenn die Annahme-Einstellung geändert werden muss, wird empfohlen, dies einmal in der $ .ajaxSetup() -Methode zu tun.

datatype

Standard: Intelligente Raten (xml, json, ein Skript oder html)

Die Art der Daten, die Sie vom Server erwartet. Wenn keine angegeben ist, versucht jQuery, basierend auf dem MIME-Typ die Antwort abzuleiten (ein XML-MIME-Typ ergibt XML, in 1.4 JSON ergibt ein JavaScript-Objekt, in 1.4 Skript wird das Skript ausgeführt, und alles andere wird als String zurückgegeben). Die verfügbaren Typen (und das Ergebnis als erstes Argument für Ihren Erfolg Rückruf übergeben) sind:

xml“: Gibt ein XML-Dokument, das über jQuery verarbeitet werden können.

"html": Gibt HTML als Nur-Text zurück; Eingeschlossene Skript-Tags werden ausgewertet, wenn sie in das DOM eingefügt werden.

"Skript": Evaluiert die Antwort als JavaScript und gibt es als Nur-Text zurück. Deaktiviert das Caching, indem der URL ein Abfragezeichenfolgenparameter _=[TIMESTAMP] an die URL angehängt wird, es sei denn, die Option des Caches ist auf "true" gesetzt. Hinweis: Dadurch werden POSTs zu GETs für Remote-Domänenanforderungen.

"json": Evaluiert die Antwort als JSON und gibt ein JavaScript-Objekt zurück. In jQuery 1.4 werden die JSON-Daten in strikt geparst; Jegliches fehlerhafte JSON wird zurückgewiesen, und ein Parse-Fehler wird ausgelöst. (Weitere Informationen zur korrekten JSON-Formatierung finden Sie unter json.org.)

"jsonp": Lädt in einem JSON-Block mit JSONP. Fügt am Ende Ihrer URL eine zusätzliche ?callback=? hinzu, um den Rückruf anzugeben. Deaktiviert Caching durch Anhängen eines Abfragezeichenfolgeparameters
_=[TIMESTAMP] an die URL , es sei denn, die Cacheoption ist auf "true" gesetzt.

"Text": Ein Klartext Zeichenfolge. Mehrere, durch Leerzeichen getrennte Werte: Ab jQuery 1.5 kann jQuery einen Dateityp von dem, was er im Content-Type-Header empfangen hat, in umwandeln, was Sie benötigen. Wenn Sie beispielsweise eine Textantwort als als XML behandeln möchten, verwenden Sie "text xml" für den Datentyp. Sie können auch eine JSONP-Anfrage erstellen, sie als Text empfangen und von jQuery als interpretiert werden. XML: "jsonp text xml." In ähnlicher Weise wird eine Kurzzeichenfolge wie "jsonp xml" zuerst versuchen, von jsonp nach xml zu konvertieren, und bei fehlgeschlagener Konvertierung von jsonp in Text und dann von Text in xml.

Jetzt zurück zu Ihrem Problem. Ich bin nicht vertraut mit Coffeescript, aber im Gegensatz zu dataType, die ein String ist, die accepts Parameter sind eine Karte und sollen wie folgt verwendet werden:

$.ajax({ 
    url: ... 
    dataType: 'json', 
    accepts: { 
     xml: 'text/xml', 
     text: 'text/plain' 
    } 
}); 
+12

+1 stimmte re: Dokumentation; Es ist jedoch völlig uninteressant, ein Attribut anzugeben, das nach dem Header benannt ist, den Sie ändern möchten, nämlich ein Bürger zweiter Klasse relativ zum realen Bustreiber dataType. Einfach zu verwirren, da sowohl dataType als auch accepts gesetzt werden, scheint tatsächlich zum standardmäßigen Response-Header zu führen. Jedenfalls bin ich froh, dass Datatype alleine den Job erledigt hat ... – virtualeyes

+18

Ich muss mich mit virtualeyes, eher nicht intuitiver Name, einigen. Und diese Dokumentation ist wie ein Freund, der schnell schwer zu verstehen ist:) ... Auch der Typdeklarationslink 'Map' verweist auf http://api.jquery.com/Types/#Map, was Daten zu beschreiben scheint Parameter. Es gibt keinen Beispielcode. Und das "Default: hängt von DataType ab" ist eine Untertreibung, nicht wahr: es hängt immer von 'dataType' ab, was die Reihenfolge der Typen angibt, oder? ... Dokumentation sollte idealerweise eher wie ein Fremder sein, den man sofort versteht. Was natürlich schwer zu erreichen ist, weiß ich. –

+0

Wenn weder 'dataType' noch' accepts' angegeben sind, welcher HTTP Accepts-Header wird gesendet? Keiner? –

Verwandte Themen