无法更新数据属性值


91

尽管网上有一些有关此的示例,但它似乎无法正常工作。我不知道问题所在。

我有这个简单的html

         <div id="foo" data-num="0"></ div>
         <a href="#" id="changeData">change data value</a>

每次我单击“更改数据值”链接时,我想更新data-num的数据值。例如,我需要将其设置为1,2,3,4,...(每次单击链接时加1)

我所拥有的是

            var num = $('#foo').data("num");
            console.log(num);
            num = num+1;               
            console.log(num);
            $('#foo').attr('data-num', num);   

该值每次从0变为1。我不能使其递增。有什么建议我做错了吗?


5
data-仅是页面加载时的属性。数据被加载到dom中,并使用进行操作.data()。该属性不会更新,并且不应仅用于初始设置数据而用于存储或检索数据。
奈杰尔·天使

1
@NigelAngel错误。数据属性的目的是提供一种方法,使用户可以存储(和修改)没有其他有效位置的任意数据。当小数点是逗号时,例如外币。要对此进行数值计算,您必须将适当的值和实际的小数点存储在某处。如果这是总价,并且需要根据更改进行更新,那么该数据值将不得不再次更改,因此您需要能够对其进行更新。为此,您将使用.attr()
jezzipin

Answers:


64

答案是好的

您没有正确使用数据方法。更新数据的正确代码是:

$('#foo').data('num', num); 

因此,您的示例将是:

var num = $('#foo').data("num") + 1;       
console.log(num)       
$('#foo').data('num', num); 
console.log(num)

97
这是错误的,这是更新属性的错误方法
adeneo

2
是的,我同意你的@adeneo,但他没有正确使用数据方法。如果要使用attr方法更新它,为什么要使用这种属性?
Lucas Willems

@dev我编辑了答案,并添加了必须使用的整个代码。
Lucas Willems

7
这是有趣的。我可以看到该值在控制台中发生了变化。但是,当我使用Chrome浏览器查看html时,其值为0(初始值)。我想如果以后可以检索到最后一个值(例如5)就可以了
dev

6
正如@dev所说,我尝试过并发现jQuery中已更改了它,但不影响chrome和safari中的html。所以我决定使用attr()而不是data()。
QMaster

118

使用该相反,如果你想改变不是数据对象的节点元素的属性数据NUM,

演示

$('#changeData').click(function (e) { 
    e.preventDefault();
    var num = +$('#foo').attr("data-num");
    console.log(num);
    num = num + 1;
    console.log(num);
    $('#foo').attr('data-num', num);
});

PS:但是您实际上应该在所有情况下都使用data()对象,但不是全部...


7
数据被加载到dom中,并使用.data()进行操作。该属性不会更新,并且不应用于存储或检索数据,而仅用于初始设置数据。尽管这是更改属性的一种方法(.prop()首选),但这不是使用数据的正确方法。
奈杰尔·天使

4
.prop()将访问或更改DOM中任何属性或属性的值,但不访问HTML。.attr()将访问和重写HTML,这使其速度比慢.prop()。您不应该使用.attr()代替.data(),不仅仅是因为它速度较慢,而且因为那不是应该的工作方式。jsfiddle.net/eXA76/2
Nigel Angel

1
我认为应该删除此答案,因为它在使用data()时给出了不好的建议。
奈杰尔·安吉尔

2
是的,有关如何使用的jQuery文档!api.jquery.com/data数据在文档加载时存储在全局变量中。如果另一个开发人员,插件或脚本使用正确更新了数据,则通过属性引用将不会起作用.data()。通过忽略正确的方法并使用该属性,您将朝着有意识地引起问题的方向发展。
奈杰尔·安吉尔

4
@NigelAngel我很感谢您对此的意见,但数据并非总是最好的选择。如果您需要更新数据属性的值并将其显示在dom中,并且实际上更改CSS甚至Javascript然后使用的基础值,该怎么办?最好的方法通常是使用.data(),如果您不以任何方式从Javascript更新值,但如果是,则始终使用.attr()设置和检索值。
jezzipin

30

如果我们想使用现有的本机JavaScript检索或更新这些属性,则可以使用如下所示的getAttributesetAttribute方法:

的JavaScript

<script>
// 'Getting' data-attributes using getAttribute
var plant = document.getElementById('strawberry-plant');
var fruitCount = plant.getAttribute('data-fruit'); // fruitCount = '12'

// 'Setting' data-attributes using setAttribute
plant.setAttribute('data-fruit','7'); // Pesky birds
</script>

通过jQuery

// Fetching data
var fruitCount = $(this).data('fruit');

// Above does not work in firefox. So use below to get attribute value.
var fruitCount = $(this).attr('data-fruit');

// Assigning data
$(this).data('fruit','7');

// But when you get the value again, it will return old value. 
// You have to set it as below to update value. Then you will get updated value.
$(this).attr('data-fruit','7'); 

阅读本文档以获取vanilla js本文档以获取jquery


@Nigel Angel,您在Firefox上测试过吗?$(this).data('fruit')在Firefox上不起作用。
Lalit Kumar Maurya 2015年

非常感谢您的最后忠告“你必须将其设置为以下更新值那么你将得到更新值。”在jQuery的RLY奇怪的行为..
JGR

12

就我自己而言,使用Jquery lib 2.1.1时,以下操作无法达到我期望的方式:

设置元素数据属性值:

$('.my-class').data('num', 'myValue');
console.log($('#myElem').data('num'));// as expected = 'myValue'

但是元素本身仍然没有属性:

<div class="my-class"></div>

我需要更新DOM,以便稍后可以执行$('。my-class [data-num =“ myValue”]')//当前长度为0

所以我要做

$('.my-class').attr('data-num', 'myValue');

要更新DOM:

<div class="my-class" data-num="myValue"></div>

该属性是否存在将覆盖$ .attr。


1
我对jquery 2.1.1有同样的问题!
phlegx

8

遇到了类似的问题,最后我不得不设置两个

obj.attr('data-myvar','myval')

obj.data('myvar','myval')

在此之后

obj.data('myvar') == obj.attr('data-myvar')

希望这可以帮助。


6

基本上,有两种方法来设置/更新数据属性值,这取决于您的需要。不同之处在于,数据保存在哪里,

如果使用.data(),它将保存在名为的局部变量中data_user,并且在元素检查时不可见;如果使用.attr(),则将是公开可见的。

关于此评论的更清晰的解释


2

这个答案是给那些只想改变数据属性值的人的

建议将不会如@adeneo所述正确更改Jquery数据属性的值。但是由于某种原因,我没有看到他(或其他任何人)为寻求更新其数据属性的人发布正确的方法。@Lucas Willems发布的答案可能是对汤姆·布莱恩·汤普塞特(Brian Tompsett-汤莱恩)所遇到的问题的答案,但这不是可能将其他用户带到这里的询问的答案。

关于原始查询声明的快速解答

-更新数据属性

$('#ElementId').attr('data-attributeTitle',newAttributeValue);

容易犯的错误*-您要更改其属性的属性的开头必须有“ data-”。


2

遇到类似的问题,尽管IE 10及以下版本不支持此解决方案,但我还是提出了此解决方案。

给定

<div id='example' data-example-update='1'></div>

Javascript标准定义了一个称为数据集的属性来更新data-example-update。

document.getElementById('example').dataset.exampleUpdate = 2;

注意:使用驼峰大小写表示法访问正确的数据属性。

来源:https : //developer.mozilla.org/en-US/docs/Learn/HTML/Howto/Use_data_attributes


1

我在使用jquery时遇到同样的问题,即html数据标签未更新,但是将实际工作从jquery更改为javascript的代码起作用了。

单击按钮时,尝试使用此方法:(请注意,主要代码是Javascripts setAttribute()函数。)

function increment(q) {

    //increment current num by adding with 1
    q = q+1;

    //change data attribute using JS setAttribute function
    div.setAttribute('data-num',q);

    //refresh data-num value (get data-num value again using JS getAttribute function)
    num = parseInt(div.getAttribute('data-num'));

    //show values
    console.log("(After Increment) Current Num: "+num);

}

//get variables, set as global vars
var div = document.getElementById('foo');
var num = parseInt(div.getAttribute('data-num'));

//increment values using click
$("#changeData").on('click',function(){

    //pass current data-num as parameter
    increment(num);

});
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.