2013-07-08 8 views
8

Page strona javascript:Przesyłanie danych jQuery.ajax z ciągiem zawierającym "???" zmienia wartość na "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 

      }); 

Zawartość wniosku, że faktycznie zostanie wysłana do serwera:

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

Co się dzieje? Czy ciąg "???" jakieś specjalne słowo kontrolujące czy coś w jQuery?

Dzięki.

+1

'processData: false' naprawi to najprawdopodobniej. – Ohgodwhy

+1

Po prostu ciekawa: jakiej wersji jQuery używasz? – Sumurai8

+0

Dlaczego przesyłasz? tak czy inaczej? Dlaczego nie tylko null czy singiel? – Petah

Odpowiedz

3

?? jest używany jako obiekt zastępczy nazwy wywołania zwrotnego w danych dla żądań jsonp . Więc, znajdując to, jQuery "będzie promować" twoją prośbę jako jsonp.

jquery bug tracker, ticket #12326

pomocą tej właściwości

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

To rozwiązuje .. Świetne .. :) dzięki .. –

0

Jest to known bug:

Zamieszczając AJAX i danych ma "??" formatuje go do jQuery?

Jest oznaczony jako poprawiony, mimo że w komentarzach dotyczących błędu nigdy nie został naprawiony. Problem powinien zostać ponownie otwarty.

Obejścia widocznie to zmieniając linię JSON do następujących:

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

i umożliwiając jego odcinkach. W ten sposób nie uruchomi się wyrażeń regularnych, które powodują zastąpienie podwójnych znaków zapytania.

11

Gdybym przeczytać komentarze błędów w innych odpowiedzi, prawdziwym problemem polega na tym, że stringify swój ciąg JSON przed przekazaniem go do data. data oczekuje, że będzie to String zawierające zapytanie (np. "a=asdf&b=qwer" lub Object zawierające klucze i wartości, które zamieni w zapytanie). Zamiast tego podajesz coś takiego, jak '{"a":"asdf","b":"qwer"}', a String zawierające usztywnioną tablicę, która nie jest zapytaniem. W jakiś sposób udaje się przekonwertować dane, które serwer rozumie, ale najwyraźniej też uruchamia ten błąd/funkcję.

Rozwiązanie 1

Jeśli chcesz uzyskać dostęp do danych za pośrednictwem $_POST['a'] aby dostać klucz "a" w JSON obiektu:

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

(Source; Cowboy on jQuery bugs)

Rozwiązanie 2

Jeśli chcesz pobrać JSON-string:

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

W tym przypadku $_POST["MyLilString"] zawiera zserializowaną JSON, które można wykorzystać na json_decode().

(Source; Ajpiano on jQuery bugs)

Inna sugestia

Kolejna propozycja zrobiłem wyciąg z uwag (ale teraz jestem w stanie znaleźć -_- ') jest ustawiona jsonp do false.

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

To powinno zatrzymać jQuery przed wstawieniem funkcji zwrotnej również do treści żądania.

+0

dzięki za dobre wyjaśnienie, oficjalne problemy jquery są wymienione tutaj: [link] (https://github.com/jquery/api.jquery.com/issues/ 878) i tutaj: [link] (https://github.com/jquery/jquery/issues/1799) –

+0

Rozwiązanie 3 jest poprawne! – alexcasalboni

Powiązane problemy