在 .data()
文档 中提到:
第一次访问数据属性时会获取数据属性,然后不再访问或修改(所有数据值都存储在 jQuery 内部)。
这也在 为什么更改 jQuery $.fn.data() 不会更新相应的 html 5 data-* 属性? 中有所涉及。
我的原始答案中的演示似乎不再有效。
更新的答案
同样来自于 .data()
文档:
在 jQuery 1.6 中,带有嵌入破折号的属性处理方式已更改以符合 W3C HTML5 规范。
因此,对于 <div data-role="page"></div>
,以下内容是正确的:$('div').data('role') === 'page'
我非常确定过去 $('div').data('data-role')
是有效的,但现在不再是这种情况。我创建了一个更好的演示,将日志记录到 HTML 中而不是必须打开控制台,并添加了一个多连字符转换为驼峰式的data- 属性的附加示例。
更新的演示(2015-07-25)
另请参见 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() {
logger(".data('key', 'leia')", ".data('key')", "expect leia on jQuery node object but DOM stays as luke");
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");
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();
Older demo
Original answer
For this HTML:
<div id="foo" data-helptext="bar"></div>
<a href="#" id="changeData">change data value</a>
以及这个JavaScript代码(使用jQuery 1.6.2)
console.log($('#foo').data('helptext'));
$('#changeData').click(function() {
$('#foo').data('helptext', 'Testing 123');
console.log($('#foo').data('data-helptext'));
return false;
});
查看演示
使用 Chrome 开发者工具 中的 控制台 检查 DOM,$('#foo').data('helptext', 'Testing 123');
不能 更新值,但是 $('#foo').attr('data-helptext', 'Testing 123');
可以。
data-
属性? - andyb