307

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

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

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

4

8 回答 8

568

HTML

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

JS

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

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

演示

参考

从参考:

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

应该注意的是,jQuerydata()不会改变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>

这个演示

于 2012-11-23T06:32:09.333 回答
55

Vanilla 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
    
于 2012-11-23T07:47:52.157 回答
53

您还可以使用以下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
于 2016-08-16T17:12:52.107 回答
34

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

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

$("#button").on("click", function() {
  var field = document.querySelector("#textfield")

  switch ($("#method").val()) {
    case "setAttribute":
      field.setAttribute("data-customval", field.value)
      break;
    case "dataset":
      field.dataset.customval = field.value
      break;
    case "jQuerydata":
      $(field).data("customval", field.value)
      break;
    case "jQueryattr":
      $(field).attr("data-customval", field.value)
      break;
  }

  objValues = {}
  objValues['$(field).data("customval")'] = $(field).data("customval")
  objValues['$(field).attr("data-customval")'] = $(field).attr("data-customval")
  objValues['field.getAttribute("data-customval")'] = field.getAttribute("data-customval")
  objValues['field.dataset.customval'] = field.dataset.customval

  console.table([objValues])
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<h1>Example</h1>
<form>
  <input id="textfield" type="text" data-customval="initial">
  <br/>
  <input type="button" value="Set and show in console.table (F12)" id="button">
  <br/>
  <select id="method">
    <option value="setAttribute">setAttribute</option>
    <option value="dataset">dataset</option>
    <option value="jQuerydata">jQuery data</option>
    <option value="jQueryattr">jQuery attr</option>
  </select>
  <div id="results"></div>
</form>

于 2014-09-24T17:25:03.493 回答
9

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

div.data('myval', 20);

您可以使用 存储任意数据.data(),但使用时仅限于字符串.attr()

于 2012-11-23T06:31:45.630 回答
7

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

$('#mydiv').data('myval',20).attr('data-myval',20);        
于 2020-01-29T15:02:30.013 回答
6

[jQuery] .data() 与 .attr() 与 .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

于 2017-12-17T07:38:25.303 回答
3

另一种设置 data- 属性的方法是使用dataset属性。

<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
于 2019-08-26T15:23:26.037 回答