É mencionado na .data()
documentação
Os atributos de dados são extraídos na primeira vez que a propriedade de dados é acessada e, em seguida, não são mais acessados ou alterados (todos os valores de dados são armazenados internamente no jQuery)
Isso também foi abordado no Por que as alterações no jQuery $ .fn.data () atualizam os atributos correspondentes do html 5 data- *?
A demonstração da minha resposta original abaixo parece não funcionar mais.
Resposta atualizada
Novamente, a partir da .data()
documentação
O tratamento de atributos com traços incorporados foi alterado no jQuery 1.6 para estar em conformidade com a especificação W3C HTML5.
Então, para <div data-role="page"></div>
o seguinte é verdade$('div').data('role') === 'page'
Tenho certeza de que $('div').data('data-role')
funcionou no passado, mas isso não parece mais ser o caso. Criei uma vitrine melhor que registra em HTML, em vez de ter que abrir o console, e adicionei um exemplo adicional da conversão de atributos de dados multi-hífen para camelCase .
Demonstração atualizada (25-07-2015)
Veja também 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 mais antiga
Resposta original
Para este HTML:
<div id="foo" data-helptext="bar"></div>
<a href="#" id="changeData">change data value</a>
e esse JavaScript (com 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 demonstração
Usando o Chrome DevTools Console para inspecionar o DOM, $('#foo').data('helptext', 'Testing 123');
ele não atualiza o valor como visto no console, mas $('#foo').attr('data-helptext', 'Testing 123');
sim.