2012-06-09 10 views
34

Ho un BIGINT MySQL che sto memorizzando nei dati HTML5. Quindi sto cercando di accedere a quel valore e passare attraverso una chiamata AJAX.Problema con jQuery data() stringa trattante come numero

<div data-id="211285677671858177"> 

E il JavaScript:

var send_data = { 
    id: '' + $(this).data('id') 
} 
$.post('/send.php', send_data); 

Il problema è che la funzione di jQuery data sembra recuperare tale valore come una virgola mobile e non una stringa. Quindi non è utile aggiungerlo a una stringa vuota perché è già troppo tardi: è già stato arrotondato (in questo caso a 211285677671858180). Cosa posso fare per risolvere questo problema?

risposta

58

Questo non è un caso di "long int", il numero che si ottiene è la rappresentazione disponibile più vicina come numero a virgola mobile.

Ad ogni modo, si desidera che il valore sia una stringa. Citare la (sottolineatura mia) jQuery docs for .data:

Ogni tentativo è fatto per convertire la stringa in un valore JavaScript (questo include booleani, numeri, oggetti, array e null) altrimenti viene lasciato come una stringa. Per recuperare l'attributo del valore come una stringa senza alcun tentativo di convertirlo, utilizzare il metodo attr().

+0

Ok, grazie per la spiegazione. Vorrei che ci fosse un modo per dire 'data' di non convertirlo, ma immagino che' attr' farà per ora – andrewtweber

+0

Ho anche scoperto che usando [HTMLElement.dataset] (https://developer.mozilla.org/en -US/docs/Web/API/HTMLElement/dataset) è anche abbastanza semplice e veloce da implementare. –

2

prova typecasting a stringa:

id: '' + $(this).data('id').toString(); 
+1

Che non ha funzionato, è ancora arrotondato a 80 – andrewtweber

+1

@andrewtweber totale sparato al buio ma utilizza $ (this) .attr ('data-id'); tienilo come una stringa? – TK123

+0

Sì, funziona. Interessante ... Mi chiedo se la cosa 'data' è un bug allora? Lascerò la domanda aperta per un po 'per vedere cosa hanno da dire gli altri – andrewtweber

3

Non c'è cosa come un "intero lungo" in JavaScript. Tutti i numeri sono a virgola mobile a 64 bit. Il tuo numero non può essere rappresentato esattamente nella rappresentazione in virgola mobile IEEE-794.

L'unico modo per "risolvere" questo è rendere il numero in una stringa in un dominio che può far fronte a grandi valori interi.

+1

Ok. Indipendentemente da ciò, non voglio * che sia un numero. Voglio che sia trattata come una stringa, ma 'data' sembra trattarla come un punto fluttuante. Qualche idea? – andrewtweber

+2

Tutti i valori degli attributi sono stringhe.Tuttavia, jQuery cerca di essere utile e converte le cose in un tipo numerico quando si utilizza l'API '.data()'. Prova a ottenere il valore '.attr()' dell'attributo. – Pointy

0

Prova che circonda i dati valore di attributo tra virgolette singole, se si vuole data trattarlo come una corda. Problema lì, immagino, avrai le virgolette da spogliare.

0

Avevo un problema simile in cui l'ID dati (alfanumerico) veniva convertito tramite l'uso di .data(), di conseguenza gli ultimi caratteri venivano convertiti in tutti gli zeri. Ci sono voluti alcuni studi per determinare che si tratta di un bug nell'implementazione di jQuery di .data().

Riferimento: http://bugs.jquery.com/ticket/7579

Per me, per ottenere l'ID dati direttamente da un lavoro in giro, ho usato .attr ("data-id") direttamente e questo mi ha dato l'ID corretto.