【问题标题】:JavaScript changed DOM value not working in JS function [duplicate]JavaScript更改的DOM值在JS函数中不起作用[重复]
【发布时间】:2025-12-24 19:40:06
【问题描述】:

我有一个链接,它根据页面上的活动动态更改某些参数。替换值的功能似乎工作正常,我可以在 chrome 开发人员工具的“元素”窗口中看到它正在更新。但是,当我尝试从另一个 JS 函数中读取该值时,它根本没有改变。

我为这个问题做了一个非常简化的例子:

<a href="#" id="a-delete-page" data-action="data/1/pageid/0/">
check data-action value</a>    
<a href="#" id="toggle">set new value</a>

<script>
$('#a-delete-page').click(test);
$('#toggle').click(toggleValue);

function toggleValue(){
    var newValue = '123';    
    $("#a-delete-page").attr('data-action',newValue);

    alert("new value set:"+newValue);  
}

function test(){
  alert($(this).data('action'));   
}
</script>

在这里试试:http://jsfiddle.net/2hj3e/

首先点击“check data-action value”,你会看到data-action参数。然后单击设置新值(您会在开发人员工具中看到它发生了变化)并再次单击“检查数据操作值”。我希望它打印 123,但它仍然打印“data/1/pageid/0/”。

谁能帮助我理解这一点,并指导我如何解决这个问题。

【问题讨论】:

  • 数据对象和数据属性不是一回事。只有 DOM 加载时的 jQuery 会将 data-* 属性解析为数据对象,但更改 data-* 属性不会更新数据对象,请参阅 jsFiddle 解决您的问题:jsfiddle.net/2hj3e/1
  • 它不会在 DOM 加载时发生,它会在您第一次在元素上调用 .data() 时发生。在他的 jsfiddle 中,当它使用旧数据调用 updateUrlParameter 时会发生这种情况。

标签: javascript jquery


【解决方案1】:

jQuery 仅在您第一次调用 .data() 时从 data- 属性中提取值。之后,它基本上会缓存它们,因此即使您更新或添加另一个data- 属性,它也不会反映在对.data() 的调用中。如果您想在初始调用后更新数据,则需要使用.data('action', newvalue) 进行设置。

来源:http://api.jquery.com/data/#data-html5

【讨论】:

    【解决方案2】:

    jQuery 与.data 有一些不同之处。如果您使用.data 来检索值,也可以使用它来设置它。

    $("#a-delete-page").data('action',newValue);
    

    【讨论】:

    • 会不会是在设置对象的属性而不是实际的元素属性?我也注意到通过 jQuery 设置数据不会使用 data- 属性更新文档元素。
    • 我认为问题在于属性只能包含字符串,而.data可以包含任意对象。
    • 很高兴知道!除了 api.jquery.com 之外,您没有任何关于此的文档吗?
    • 不,我可能就是从那里得到它的。