【问题标题】:jQuery .data() Not Updating DOMjQuery .data() 不更新 DOM
【发布时间】:2012-09-01 12:06:11
【问题描述】:

似乎 jQuery 1.7.2 没有为我更新 DOM 数据属性。给定以下标记:

<ul id="foo">
    <li data-my-key="12345">ABCDEF</li>
</ul>

运行下面的 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

经过进一步调查,我注意到在使用 .data() 函数设置新值后,DOM 被修改(通过 Chrome 21.0.1180.81、Firebug 1.10 中的“检查元素”验证)。 3 和 Firefox 14.0.1)。

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

【问题讨论】:

标签: jquery


【解决方案1】:

$('#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

查看这里了解更多信息:.prop() vs .attr()

【讨论】:

  • @DanielRuf prop 直接做什么?
  • 元素(与 .attr() 语法相同)api.jquery.com/prop 是否需要过滤器?
  • @DanielRuf 是的...否则您将如何选择具有相同数据属性的所有元素?
  • Well, actually .data(..) 不会改变元素的属性。它存储在 a special cache 中(或者在 jQuery 对象上,或者 - 如果处理 DOM 节点 - 在 jQuery.cache 中)。因此,我不明白 .prop() vs .attr() 与这里有什么关系。
  • 好吧,他也只想要他发布的代码中的第一个元素 ;-)
猜你喜欢
  • 1970-01-01
  • 2011-11-04
  • 2011-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-08
  • 2010-11-28
  • 1970-01-01
相关资源
最近更新 更多