如何在HTML元素中设置数据属性


233

我有一个带有属性的div data-myval = "10"。我想更新它的价值;如果我使用,它不会改变div.data('myval',20)吗?我div.attr('data-myval','20')只需要使用吗?

我在HTML5和jQuery之间感到困惑吗?请指教。谢谢!

编辑:更新div.data('myval')=20div.data('myval',20),但HTML仍未更新。


1
里面有什么div?jQuery对象或元素?
布拉德,

2
div.data('myval')=20仅因为语法错误而无法存储值-请参阅正确语法的答案。但是请注意,.data()实际上并没有更新element 属性,而是将数据存储在其他位置。
nnnnnn 2012年

对于那些有意避免使用gQuery的人,请使用此-> div.dataset.myval ='20';
HarijsKrūtainis6

Answers:


448

的HTML

<div id="mydiv" data-myval="10"></div>

JS

var a = $('#mydiv').data('myval'); //getter

$('#mydiv').data('myval',20); //setter

演示版

参考

从参考:

jQuery本身使用该.data()方法在“事件”和“句柄”名称下保存信息,并且还保留任何以下划线(_)开头的数据名称供内部使用。

应该注意的是,jQuery data()不会更改dataHTML中的属性。

因此,如果需要更改dataHTML中的属性,则应.attr()改用。

的HTML

<div id="outer">
    <div id="mydiv" data-myval="10"></div>
</div>

JS:

alert($('#outer').html());   // alerts <div id="mydiv" data-myval="10"> </div>
var a = $('#mydiv').data('myval'); //getter
$('#mydiv').attr("data-myval","20"); //setter
alert($('#outer').html());   //alerts <div id="mydiv" data-myval="20"> </div>

这个演示


我不知道你需要什么的一致性,但我会建议使用data()getsetHTML-5数据属性。
Jashwant 2012年

7
@Jashwant可能是一个有用的编辑:想想像这样的css规则[data-myval="10"]{ color: red; },它将根据data属性的值来设置标签的样式。
TechNyquist

4
.data不起作用。.attr的作品。也许我们可以编辑答案以使其清楚。似乎第一个是解决方案,但可能会更好一些。我不确定如何更好地解释,这就是为什么我不编辑帖子的原因。
高乔

@高乔,现在好点了吗?
Jashwant

1
@Gaucho .data仅在您使用较新的jQuery> = 1.4.3时才起作用,对于较旧的版本.attr将起作用。
伊利亚斯

41

您还可以使用以下attr内容:

的HTML

<div id="mydiv" data-myval="JohnCena"></div>

脚本

 $('#mydiv').attr('data-myval', 'Undertaker'); // sets 
 $('#mydiv').attr('data-myval'); // gets

要么

$('#mydiv').data('myval'); // gets value
$('#mydiv').data('myval','John Cena'); // sets value

6
对我而言,仅使用.attr。那有可能吗?
Zariweya

我很高兴它奏效。.data()调用很特殊-它不仅检索HTML5数据属性,而且还尝试评估/解析该属性。因此,使用诸如data-myval ='{“ hello”:“ world”}'之类的属性时,通过.data()检索将返回一个对象,而通过.attr()进行检索将返回一个字符串。
Baqer Naqvi

32

请注意,.data()当您data-使用javascript 更改html5 属性时,jQuery 不会更新。

如果使用jQuery 在HTML元素中.data()设置data-属性,则最好使用jQuery .data()读取它们。否则,如果您动态更新属性,则可能会出现不一致的情况。例如,看setAttribute()dataset()attr()下文。更改值,多次按该按钮,然后查看控制台。


29

香草Javascript解决方案

的HTML

<div id="mydiv" data-myval="10"></div>

JavaScript:

  • 使用DOM的getAttribute()属性

     var brand = mydiv.getAttribute("data-myval")//returns "10"
     mydiv.setAttribute("data-myval", "20")      //changes "data-myval" to "20"
     mydiv.removeAttribute("data-myval")         //removes "data-myval" attribute entirely
  • 使用JavaScript的dataset属性

    var myval = mydiv.dataset.myval     //returns "10"
    mydiv.dataset.myval = '20'          //changes "data-myval" to "20"
    mydiv.dataset.myval = null          //removes "data-myval" attribute

8

如果您使用的是jQuery,请使用.data()

div.data('myval', 20);

您可以使用来存储任意数据.data(),但使用时只能使用字符串.attr()


14
请注意,该.data()方法也没有更新data- 的属性 -也就是说,它存储在一个属性没有结束备份数据(这就是为什么它可以存储非字符串值),即使它可以检索从价值data-属性。尽管我怀疑OP确实不需要设置属性,即使这就是问题所在。
nnnnnn 2012年

1
我认为这不是问题(除了您提到的内容之外,或者是否有其他.attr()用于检索属性的代码)。我只是认为值得指出,因为OP明确(如果可能是错误地)询问了有关更新属性的问题。
nnnnnn 2012年

1
@Blender并不能真正回答我的问题。我想更新HTML,但同时也要使用element.data('myval')来检索它。
Pulkit Mittal

1
我需要这样做是因为在文档加载时生成的元素具有作为数据属性的元素,并且我也想对新的动态元素这样做。我知道可能没有特定的需求,但我想保持一致性。
Pulkit Mittal

1
@PulkitMittal-请注意,即使.attr()您没有真正更新“ html”,也要更新DOM。当您要求浏览器给您“ html”(无论是by .html()还是DOM element.innerHTML)时,浏览器会根据当时的DOM状态为您有效地重新生成它。有点。
nnnnnn 2012年

3

[jQuery] .data()vs .attr()vs .extend()

.data()如果我正确的话,jQuery方法会通过使用该方法来更新由jQuery管理的内部对象。

如果您想更新data-attributes点差,请使用-

$('body').attr({ 'data-test': 'text' });

-否则,$('body').attr('data-test', 'text');就可以了。

您可以完成此操作的另一种方法是使用-

$.extend( $('body')[0].dataset, { datum: true } );

–将任何属性更改限制为HTMLElement.prototype.dataset而不是任何其他HTMLElement.prototype.attributes更改。


2

设置数据属性的另一种方法是使用数据集属性。

<div id="user" data-id="1234567890" data-user="johndoe" data-date-of-birth>John Doe</div>

const el = document.querySelector('#user');

// el.id == 'user'
// el.dataset.id === '1234567890'
// el.dataset.user === 'johndoe'
// el.dataset.dateOfBirth === ''

// set the data attribute
el.dataset.dateOfBirth = '1960-10-03'; 
// Result: el.dataset.dateOfBirth === 1960-10-03

delete el.dataset.dateOfBirth;
// Result: el.dataset.dateOfBirth === undefined

// 'someDataAttr' in el.dataset === false
el.dataset.someDataAttr = 'mydata';
// Result: 'someDataAttr' in el.dataset === true

0

为了使jQuery和DOM保持同步,一个简单的选择可能是

$('#mydiv').data('myval',20).attr('data-myval',20);        
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.