2010-02-27 10 views
6

mam do czynienia z kolejnym problemem:jQuery i long int id

W naszej bazie mamy obiekty z identyfikatorami, jak 4040956363970588323. Piszę jakiś klient-kreatora na jQuery do interakcji z takimi obiektami. Klient otrzymuje bazy danych o obiektach koryta Ajax prośba, jak:

$.ajax({ 
     url: "/api/pages/", 
     type: "get", 
     dataType: "json", 
     data: {"id": site_id}, 
     success: function(data){ 
      if (data.success){ 
       for (var pidx in data.pages){ 
        console.log(data.pages[pidx].id); 
        var li = $('<li class="ui-widget-content"></li>'); 
        var idf = $('<input type="hidden" id="pid" value="{0}"/>'.format(data.pages[pidx].id)) 
        var urlf = $('<input type="hidden" id="purl" value="{0}"/>'.format(data.pages[pidx].url)) 
        li.text(data.pages[pidx].title); 
        li.append(idf); 
        li.append(urlf); 
        $("#selectable_pages_assign").append(li); 
       } 
       pages_was = $("#selectable_pages_assign>li"); 
      } 
      else 
       updateTips(data.message); 
     }, 
     error: function(){ 
      updateTips("Internal erro!"); 
     } 
}) 

Więc, jak widać wysyłać dane jak JSON obiektu (trochę kodu serwera):

return HttpResponse(dumps({ 
         "success": True, 
         "pages": [{"id": page.id, "title": page.title, "url": page.image} for page in Page.objects.filter(site = site)] 
      })) 

Według Firebug, serwer wysyła poprawne identyfikatory w danych, ale console.log(..) zamiast poprawnego identyfikatora (4040956363970588323), generuje id 4040956363970588000.

Dlaczego tak się dzieje?

Bez odpowiednich identyfikatorów, jakaś szansa, że ​​mój czarodziej będzie działać poprawnie :)

+0

FWIW, twój komunikat o błędzie mówi "updateTips (" Wewnętrzny błąd! ");' (Literówka na słowie "błąd"). Co jest zabawne: P –

Odpowiedz

9

Moje przypuszczenie jest coś idzie źle w konwersji do formatu JSON. Kiedy piszesz wartość, prawdopodobnie będziesz musiał umieścić wokół niej cytaty, aby upewnić się, że jest traktowane jako ciąg znaków.

+1

+1, pamiętaj, aby wysłać go jako ciąg – tvanfosson

+0

jeszcze jeden głos, aby wartość id była ciągiem – Pointy

+0

A jak to zrobić? Przechwytywam wartość z danych HTML5 i próbuję traktować ją jako ciąg, ale nadal jest ona zaokrąglana niepoprawnie: ''' + $ (this) .data ('id') + '''. Czy jest lepszy sposób to zrobić? – andrewtweber

3

To wygląda na jakiś problem z przelewem.

Według this discussion tu na SO JavaScript może obsłużyć tylko wskazówki o wielkości 2^64, co oznacza, że ​​maksymalna INT wynosi około

184467440737100000 

która jest znacznie mniejsza niż

4040956363970588323 

Edycja : Przepraszam, największa dokładna liczba całkowita to 2^53, ale przypadek jest taki sam.

+0

dziękuję za odpowiedź, bardzo przydatne informacje –

+1

Numery JavaScript są wartościami zmiennoprzecinkowymi podwójnej precyzji IEEE 754, z zastrzeżeniem, że standard ECMAScript, na którym oparty jest JavaScript, zawiera tylko jedną wartość "NaN", a nie więcej. W ten sposób tracisz dokładność całkowitą, gdy przekraczasz precyzję reprezentacji, która dokładnie zachowuje wszystkie liczby całkowite o wartości mniejszej niż 2 ** 53, i zachowuje tylko liczby całkowite poza tym zakresem (te z ładnymi reprezentacjami binarnymi, mniej więcej, przerzedzenie w miarę zwiększania się wielkości, aż do całkowitego przepełnienia do wartości nieskończoności). –

Powiązane problemy