Se menciona en la .data()
documentación.
Los atributos de datos se extraen la primera vez que se accede a la propiedad de datos y luego ya no se accede ni se muta (todos los valores de datos se almacenan internamente en jQuery)
Esto también se cubrió en ¿Por qué los cambios en jQuery $ .fn.data () actualizan los atributos html 5 data- * correspondientes?
La demostración de mi respuesta original a continuación ya no parece funcionar.
Respuesta actualizada
De nuevo, de la .data()
documentación.
El tratamiento de los atributos con guiones incrustados se modificó en jQuery 1.6 para cumplir con la especificación W3C HTML5.
Entonces, para <div data-role="page"></div>
lo siguiente es cierto$('div').data('role') === 'page'
Estoy bastante seguro de que $('div').data('data-role')
funcionó en el pasado, pero ese ya no parece ser el caso. Creé un mejor escaparate que registra en HTML en lugar de tener que abrir la consola y agregué un ejemplo adicional de la conversión de múltiples guiones a los atributos de datos de camelCase .
Demo actualizada (2015-07-25)
Ver también jQuery Data vs Attr?
HTML
<div id="changeMe" data-key="luke" data-another-key="vader"></div>
<a href="#" id="changeData"></a>
<table id="log">
<tr><th>Setter</th><th>Getter</th><th>Result of calling getter</th><th>Notes</th></tr>
</table>
JavaScript (jQuery 1.6.2+)
var $changeMe = $('#changeMe');
var $log = $('#log');
var logger;
(logger = function(setter, getter, note) {
note = note || '';
eval('$changeMe' + setter);
var result = eval('$changeMe' + getter);
$log.append('<tr><td><code>' + setter + '</code></td><td><code>' + getter + '</code></td><td>' + result + '</td><td>' + note + '</td></tr>');
})('', ".data('key')", "Initial value");
$('#changeData').click(function() {
// set data-key to new value
logger(".data('key', 'leia')", ".data('key')", "expect leia on jQuery node object but DOM stays as luke");
// try and set data-key via .attr and get via some methods
logger(".attr('data-key', 'yoda')", ".data('key')", "expect leia (still) on jQuery object but DOM now yoda");
logger("", ".attr('key')", "expect undefined (no attr <code>key</code>)");
logger("", ".attr('data-key')", "expect yoda in DOM and on jQuery object");
// bonus points
logger('', ".data('data-key')", "expect undefined (cannot get via this method)");
logger(".data('anotherKey')", ".data('anotherKey')", "jQuery 1.6+ get multi hyphen <code>data-another-key</code>");
logger(".data('another-key')", ".data('another-key')", "jQuery < 1.6 get multi hyphen <code>data-another-key</code> (also supported in jQuery 1.6+)");
return false;
});
$('#changeData').click();
Demo anterior
Respuesta original
Para este HTML:
<div id="foo" data-helptext="bar"></div>
<a href="#" id="changeData">change data value</a>
y este JavaScript (con jQuery 1.6.2)
console.log($('#foo').data('helptext'));
$('#changeData').click(function() {
$('#foo').data('helptext', 'Testing 123');
// $('#foo').attr('data-helptext', 'Testing 123');
console.log($('#foo').data('data-helptext'));
return false;
});
Ver demo
Al usar la Consola Chrome DevTools para inspeccionar el DOM, no actualiza el valor como se ve en la Consola, pero sí lo hace.$('#foo').data('helptext', 'Testing 123');
$('#foo').attr('data-helptext', 'Testing 123');