2013-07-08 2 views
8

Seite Seite javascript:Übergeben von jQuery.ajax-Daten mit einer Zeichenfolge, die "???" enthält Es ändert den Wert in "jQuery19107363727174233645_1373301489648?"

var model = {"NumberOfCPUs":"2","NumberOfCores":"4","OSType":"Linux","OSVersion":"???"}; 

     var id = 0; 
     var success = false; 
     //send to server: 
     $.ajax(
      { 
       async: false, 
       data: JSON.stringify(model), 
       dataType: "json", 
       type: "post", 
       url: serverSideURL 

      }); 

Der Inhalt der Anfrage an den Server wird tatsächlich gesendet:

{"NumberOfCPUs":"2","NumberOfCores":"4","OSType":"Linux","OSVersion":"jQuery19107363727174233645_1373301489648?"} 

Was geschieht? Ist die Zeichenfolge "???" eine Art spezielles Kontrollwort oder etwas in jQuery?

Danke.

+1

'processData: false' wird dies höchstwahrscheinlich beheben. – Ohgodwhy

+1

Nur neugierig: Welche Version von jQuery verwenden Sie? – Sumurai8

+0

Warum reichen Sie ??? sowieso? Warum nicht einfach null oder eins? – Petah

Antwort

3

?? wird als Callback-Namens-Platzhalter in den Daten für jsonp Anfragen verwendet. Wenn Sie es also finden, wird jQuery Ihre Anfrage als jsonp "promoten".

jquery Bug-Tracker, ticket #12326

Verwenden Sie diese Eigenschaft

contentType: "application/json; charset=utf-8" 
+0

Das löst .. Toll .. .. danke .. –

0

Es ist ein known bug:

Wenn AJAX veröffentlichen und die Daten hat "??" ist es zu jQuery formatiert?

Es ist markiert behoben, obwohl in den Kommentaren auf den Bug eindeutig nie behoben wurde. Das Problem sollte erneut geöffnet werden.

Umgehungen offenbar sind Ihre JSON Zeile wie folgt zu ändern:

var model = {NumberOfCPUs:"2",NumberOfCores:"4",OSType:"Linux",OSVersion:"???"}; 

und ermöglicht es serialisiert werden. Auf diese Weise wird die Regex nicht ausgelöst, wodurch die doppelten Fragezeichen ersetzt werden.

11

Wenn ich durch die Kommentare der Fehler in den anderen Antworten lesen, das echte Problem liegt in der Tatsache, dass Sie Ihren Json-Zeichenfolge stringify, bevor es zu data vorbei. data erwartet entweder String, das eine Abfrage enthält (z. B. "a=asdf&b=qwer" oder Object, die die Schlüssel und Werte enthält, die in eine Abfrage umgewandelt werden). Sie übergeben stattdessen etwas wie '{"a":"asdf","b":"qwer"}', ein String, das ein stringifiziertes Array enthält, das keine Abfrage ist. Es schafft es irgendwie in Daten zu konvertieren, die der Server versteht, aber anscheinend löst er auch diesen Bug/Feature aus.

Lösung 1

Wenn Sie die Daten über $_POST['a'] zugreifen möchten Schlüssel "a" in Ihrem JSON-Objekt zu erhalten:

$.ajax({ 
    async: false, 
    data: model, //Pass the Array itself to the function 
    dataType: "json", 
    type: "post", 
    url: serverSideURL 
}); 

(Source; Cowboy on jQuery bugs)

Lösung 2

Wenn Sie die JSON-String abrufen möchten:

$.ajax({ 
    async: false, 
    data: { 
     "MyLilString": JSON.stringify(model) 
    } 
    dataType: "json", 
    type: "post", 
    url: serverSideURL 
}); 

In diesem Fall $_POST["MyLilString"] enthält die serialisierte JSON, die Sie json_decode() auf verwenden können.

(Source; Ajpiano on jQuery bugs)

Ein weiterer sugestion

Ein weiterer Vorschlag, den ich aus den Kommentaren Extrakt tat (aber ich bin jetzt nicht in der Lage zu finden -_- ') ist jsonp zu false einzustellen.

$.ajax({ 
    async: false, 
    data: model 
    dataType: "json", 
    type: "post", 
    url: serverSideURL, 
    jsonp: false 
}); 

Dies sollte jQuery vom Einfügen der Callback-Funktion in den Anfragetext zu stoppen.

+0

danke für die gute erklärung, die offiziellen jquery themen sind hier erwähnt: [link] (https://github.com/jquery/api.jquery.com/issues/ 878) und hier: [link] (https://github.com/jquery/jquery/issues/1799) –

+0

Lösung 3 ist die richtige! – alexcasalboni

Verwandte Themen