2012-06-09 2 views
34

Tengo un BIGINT MySQL que estoy almacenando en datos HTML5. Luego estoy tratando de acceder a ese valor y pasarlo a través de una llamada AJAX.Problema con la cadena de tratamiento de jQuery data() como el número

<div data-id="211285677671858177"> 

Y el JavaScript:

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

La cuestión es que la función de jQuery data parece recuperar ese valor como un punto flotante y no una cadena. Por lo tanto, agregarlo a una cadena en blanco no ayuda porque ya es demasiado tarde; ya se ha redondeado (en este caso, al 211285677671858180). ¿Qué puedo hacer para arreglar esto?

Respuesta

58

Este no es un caso de "int larga" en realidad, el número que obtiene es la representación disponible más cercana como un número de coma flotante.

De todos modos, desea el valor como una cadena. Citar el (el énfasis es mío) jQuery docs for .data: se hace

Cada intento de convertir la cadena en un valor JavaScript (esto incluye booleanos, números, objetos, matrices y nula) de lo contrario se deja como una cadena. Para recuperar el atributo del valor como una cadena sin ningún intento de convertirlo, use el método attr().

+0

Bien, gracias por la explicación. Desearía que hubiera una manera de decirle a 'data' que no la convierta, pero supongo que' attr' funcionará por ahora – andrewtweber

+0

También encontré que usaba [HTMLElement.dataset] (https://developer.mozilla.org/en -US/docs/Web/API/HTMLElement/dataset) también es bastante sencillo y rápido de implementar. –

2

intento typecasting a cadena:

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

Eso no funcionó, todavía está redondeando a 80 – andrewtweber

+1

@andrewtweber tiro total en la oscuridad pero usa $ (this) .attr ('data-id'); mantenerlo como una cadena? – TK123

+0

Sí, eso funciona. Interesante ... Me pregunto si la cosa de 'datos' es un error entonces? Voy a dejar la pregunta abierta por un tiempo para ver lo que otros tienen que decir – andrewtweber

3

No hay tal cosa como un "entero largo" en JavaScript. Todos los números son de coma flotante de 64 bits. Su número allí no se puede representar exactamente en la representación de punto flotante IEEE-794.

La única forma de "corregir" esto es convertir el número en una cadena en un dominio que pueda hacer frente a valores enteros grandes.

+1

Bien. Independientemente, no * quiero * que sea un número. Quiero que se trate es una cadena, pero 'datos' parece tratarlo como un punto flotante. ¿Algunas ideas? – andrewtweber

+2

Todos los valores de atributo son cadenas.Sin embargo, jQuery intenta ser útil y convierte las cosas a tipo numérico cuando usa la API '.data()'. Intente obtener el valor '.attr()' del atributo. – Pointy

0

Probar que rodea a los datos de atributos de valor entre comillas simples, si quieres data que tratarlo como una cadena. El problema allí, supongo, es que tendrás las comillas para despojar.

0

Tuve un problema similar cuando la identificación de datos (alfanumérica) se estaba convirtiendo mediante el uso de .data() como resultado, los últimos caracteres se convertían a todos los ceros. Tomó algunas investigaciones determinar que esto es un error en la implementación de jQuery de .data().

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

Para mí, para obtener el ID de datos directamente como una solución alternativa, solía .attr ("data-id") directamente y esto me dio la ID correcta.

Cuestiones relacionadas