当元素数据发生变化时,jQuery的data()属性不会更新

我想使用jQuery的data() api来检索元素的所有数据属性。 但是这个api的缓存性质真的很烦人。 有时我需要在javascript中更改元素的某些数据属性,但data() api始终返回每个数据属性的初始值。 所以我必须使用attr()来访问元素的每个数据属性以获取其最新值。 有没有办法克服这个缓存的事情,并使data()每次调用时总是返回最新的值?

简短的回答是: 不要使用jQuery .data()来动态设置数据属性,除非你能保证数据属性总是由jQuery设置

以下任一解决方案都可行:

  • 改用DOM
  • 请改用jQuery .attr()

这是jQuery文档中的相关部分 (我不认为它真的突出了这可能会让jQuery用户感到惊讶):

数据属性在第一次访问数据属性时被拉出,然后不再被访问或变异( 然后所有数据值都在内部存储在jQuery中 )。

关于为什么你可能使用jQuery来设置属性:许多客户端模板语言构建DOM,包括数据属性。

给定动态构建的HTML(如DevTools中所示:

 

DOM API说实话:

  document.querySelector('form').getAttribute('data-test'); 

JQuery 返回一个过时的先前值 (在本例中为19000):

  $('form').data('test'); 

jQuery attr也返回当前值:

  $('form').attr('data-amount'); 

在更新data属性以重置其缓存之后,您还可以使用jQuery的.removeData()方法。

例如:

 > document.querySelector('.sub-panels') 
​…​
​ > document.querySelector('.sub-panels').setAttribute('data-test', 300); undefined > document.querySelector('.sub-panels')
​…​
​ > $('.sub-panels').data('test') 300 > document.querySelector('.sub-panels').setAttribute('data-test', 400); undefined > $('.sub-panels').data('test') 300 > $('.sub-panels').removeData(); [div.sub-panels, prevObject: jQuery.fn.init(1), context: document, selector: ".sub-panels"] > $('.sub-panels').data('test') 400