jQuery .data()不更新DOM

sen*_*nfo 14 jquery

似乎jQuery 1.7.2没有为我更新DOM数据属性.鉴于以下标记:

<ul id="foo">
    <li data-my-key="12345">ABCDEF</li>
</ul>
Run Code Online (Sandbox Code Playgroud)

运行下面的JavaScript,我得到一些我不期望的结果:

$('#foo li:first').data('my-key') // Returns 12345 - Expected
$('#foo li[data-my-key="12345"]') // Returns the expected <li>
$('#foo li:first').data('my-key', '54321')
$('#foo li:first').data('my-key') // Returns 54321 - Expected
$('#foo li[data-my-key="54321"]') // Returns an empty array - Not expected
Run Code Online (Sandbox Code Playgroud)

经过进一步调查,我注意到在使用.data()函数设置新值后对DOM 进行修改(在Chrome 21.0.1180.81,Firebug 1.10.3和Firefox 14.0.1中使用"Inspect Element"验证).

从我的角度来看,这种行为是出乎意料的,但这是否是jQuery数据运行的预期方式?如果是这样,使用jQuery更新data-*属性的适当方法是什么?只需使用attr()函数?

Nea*_*eal 7

$('#foo li[data-my-key="54321"]')是一个属性选择器.

使用.data(..)更改不使用过滤器而无法选择的元素属性.

如果你想获得具有特定属性的所有元素,你可以这样做(使用filter(...)):

$('#foo li').filter(function(index) {
  return $(this).data('my-key') === 54321;
}); //returns all `#foo li` with data[my-key] === 54321
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅此处:.prop()vs .attr()

  • [嗯,实际上](http://tirania.org/blog/archive/2011/Feb-17.html)`.data(..)`不*改变元素的属性.它存储在[特殊缓存](https://github.com/jquery/jquery/blob/master/src/data.js#L45)中(或者在jQuery对象上,或者 - 如果处理DOM节点 - 在`jQuery.cache`).因此,我不明白[.prop()vs .attr()](http://stackoverflow.com/q/5874652/561731)在这里是如何相关的. (12认同)