无法更新数据属性值

dev*_*dev 82 jquery

虽然在网络上有一些关于此的例子,但它似乎无法正常工作.我无法弄清楚这个问题.

我有这个简单的HTML

         <div id="foo" data-num="0"></ div>
         <a href="#" id="changeData">change data value</a>
Run Code Online (Sandbox Code Playgroud)

每次单击"更改数据值"链接时,我都想更新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);   
Run Code Online (Sandbox Code Playgroud)

该值每次从0更改为1.我无法增量.我有什么错误吗?

A. *_*lff 105

如果您希望更改节点元素的属性data-num而不是数据对象的属性data-num,请使用它:

DEMO

$('#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);
});
Run Code Online (Sandbox Code Playgroud)

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

  • 数据被加载到dom中并使用.data()在那里进行操作.该属性未更新,不应用于存储或检索数据,仅用于初始设置数据.虽然这是更改属性的一种方法(首选`..()`,但这不是使用数据的正确方法. (7认同)
  • `.prop()`将访问或更改DOM中任何属性或属性的值,而不是HTML.`.attr()`将访问和重写HTML,这使得它比`.prop()`慢.你不应该使用`.attr()`而不是`.data()`,不仅因为它更慢,而且因为它不是它应该如何工作.http://jsfiddle.net/eXA76/2/ (4认同)
  • @NigelAngel虽然我很感激您对此的看法,但数据并不总是最佳选择.如果您需要更新数据属性的值并将其显示在dom中以及实际更改CSS随后使用的基础值甚至是Javascript,该怎么办?最好的方法通常是使用.data(),如果你没有以任何方式从Javascript更新值,但如果你是这样,总是使用.attr()来设置和检索值. (4认同)
  • 是的,jQuery文档介绍了它应该如何使用!http://api.jquery.com/data/数据存储在文档加载的全局变量中.如果另一个开发人员,插件或脚本**正确**使用`.data()`更新数据,则通过属性引用它将无效.通过忽略正确的方法并使用属性,您将有意识地导致问题. (2认同)

Luc*_*ems 53

编辑:下面的答案是好的.

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

$('#foo').data('num', num); 
Run Code Online (Sandbox Code Playgroud)

所以你的例子是:

var num = $('#foo').data("num") + 1;       
console.log(num)       
$('#foo').data('num', num); 
console.log(num)
Run Code Online (Sandbox Code Playgroud)

  • 这是错误的,这是更新属性的***错误***方法 (87认同)
  • 这是有趣的.我可以看到控制台中的值发生了变化.但是当我使用Chrome查看html时,它是0(初始).我想如果以后我可以检索到最后一个值(例如5) (7认同)
  • 正如@dev所说,我试过并看到jQuery中的更改但不影响chrome和safari中的html.所以我决定使用attr()而不是data(). (5认同)
  • 是的我同意你@adeneo,但他没有正确使用数据方法.如果要使用attr方法更新它,为什么要使用这种属性? (2认同)

Lal*_*rya 29

如果我们想使用现有的原生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>
Run Code Online (Sandbox Code Playgroud)

通过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'); 
Run Code Online (Sandbox Code Playgroud)

阅读本文档,了解vanilla jsjquery的此文档


Bri*_*den 11

对于我自己来说,使用Jquery lib 2.1.1以下内容并没有按照我预期的方式工作:

设置元素数据属性值:

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

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

<div class="my-class"></div>
Run Code Online (Sandbox Code Playgroud)

我需要更新DOM,所以我以后可以做$('.my-class [data-num ="myValue"]')//当前长度为0

所以我必须这样做

$('.my-class').attr('data-num', 'myValue');
Run Code Online (Sandbox Code Playgroud)

要让DOM更新:

<div class="my-class" data-num="myValue"></div>
Run Code Online (Sandbox Code Playgroud)

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


小智 6

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

obj.attr('data-myvar','myval')
Run Code Online (Sandbox Code Playgroud)

obj.data('myvar','myval')
Run Code Online (Sandbox Code Playgroud)

在此之后

obj.data('myvar') == obj.attr('data-myvar')
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。


And*_*mas 6

基本上,有两种方法可以设置/更新数据属性值,具体取决于您的需要。不同的是,数据保存在哪里,

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

对这个评论更清楚的解释