Как установить атрибуты данных в HTML-элементах

У меня есть div с атрибутом data-myval = "10". Я хочу обновить его значение; разве это не изменится, если я использую div.data('myval',20)? Мне нужно использовать только div.attr('data-myval','20')?

Я не понимаю, что такое HTML5 и jQuery? Пожалуйста, порекомендуйте. Спасибо!

РЕДАКТИРОВАТЬ: обновлен div.data('myval')=20 до div.data('myval',20), но HTML по-прежнему не обновляется.


person Pulkit Mittal    schedule 23.11.2012    source источник
comment
Что в div? Объект или элемент jQuery?   -  person Brad    schedule 23.11.2012
comment
div.data('myval')=20 не сработает для сохранения значения только потому, что синтаксис неправильный - см. Ответы о правильном синтаксисе. Но обратите внимание, что .data() на самом деле не обновляет элемент attribute, он хранит данные в другом месте.   -  person nnnnnn    schedule 23.11.2012
comment
Для тех, у кого есть смысл избегать gQuery, используйте это - ›div.dataset.myval = '20';   -  person Harijs Krūtainis    schedule 09.06.2020


Ответы (8)


HTML

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

JS

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

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

Демо

Справка

Из справки:

Сам jQuery использует метод .data() для сохранения информации под именами «события» и «дескриптор», а также резервирует любые имена данных, начинающиеся с подчеркивания («_»), для внутреннего использования.

Следует отметить, что data() jQuery не изменяет атрибут data в HTML.

Итак, если вам нужно изменить атрибут data в HTML, вы должны вместо этого использовать .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>

См. эту демонстрацию

person Jashwant    schedule 23.11.2012
comment
Я не знаю, какая согласованность вам нужна, но я бы рекомендовал использовать атрибуты данных от data() до get и set HTML-5. - person Jashwant; 23.11.2012
comment
Вместо этого может быть полезным редактирование @Jashwant: подумайте о правиле css, таком как [data-myval="10"]{ color: red; }, оно будет стилизовать тег в соответствии со значением атрибута данных. - person TechNyquist; 28.06.2017
comment
.data не работает. .attr работает. может быть, мы можем отредактировать ответ, чтобы он был понятен. Кажется, первое - это решение, хотя его можно было бы немного лучше раскрыть. Я не уверен, как лучше объяснить, это причина, по которой я не редактирую сообщение. - person Gaucho; 02.11.2018
comment
@ Гаучо, теперь лучше? - person Jashwant; 02.11.2018
comment
@Gaucho .data будет работать, только если вы используете более новый jQuery ›= 1.4.3, для более старых версий .attr будет работать. - person Ilias; 15.11.2018
comment
Все еще здесь, недоумевая, почему у нас есть и объект данных, и атрибут данных, и удивляюсь, почему они не синхронизируются. - person brandonscript; 19.06.2020
comment
@brandonscript, (возможно, я не прав) jQuery представил data() перед атрибутами HTML data-. Таким образом, он использовался для внутреннего хранения данных в объектах. - person Jashwant; 19.06.2020
comment
›› Использование метода data () для обновления данных не влияет на атрибуты в модели DOM. Чтобы установить значение атрибута data- *, используйте attr. api.jquery.com/data - person Franchy; 22.06.2021

Вы также можете использовать следующую attr вещь;

HTML

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

Скрипт

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

OR

$('#mydiv').data('myval'); // gets value
$('#mydiv').data('myval','John Cena'); // sets value
person Baqer Naqvi    schedule 16.08.2016
comment
У меня работал только с .attr. Это вообще возможно? - person Zariweya; 21.08.2017
comment
Я рад, что это сработало. Вызов .data () особенный - он не только извлекает атрибуты данных HTML5, но также пытается оценить / проанализировать атрибуты. Таким образом, с таким атрибутом, как data-myval = '{hello: world}' при извлечении через .data () вернет объект, а извлечение через .attr () вернет строку. - person Baqer Naqvi; 21.08.2017

Решение Vanilla Javascript

HTML

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

JavaScript:

  • Использование свойства getAttribute() DOM

     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
    
person rajesh kakawat    schedule 23.11.2012

Обратите внимание, что jQuery .data() не обновляется при изменении атрибутов html5 data- с помощью javascript.

Если вы используете jQuery .data() для установки data- атрибутов в элементах HTML, вам лучше использовать 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>

person Johann Echavarria    schedule 24.09.2014

Если вы используете jQuery, используйте .data():

div.data('myval', 20);

Вы можете хранить произвольные данные с помощью .data(), но вы ограничены только строками при использовании .attr().

person Blender    schedule 23.11.2012
comment
Обратите внимание, что метод .data() не обновляет data- атрибуты - то есть данные, которые он хранит, не попадают в атрибут (вот почему он может хранить нестроковые значения ), даже если он может получить значение из атрибута data-. Хотя я подозреваю, что OP на самом деле не нужно устанавливать атрибуты, хотя вопрос задан именно так. - person nnnnnn; 23.11.2012
comment
@nnnnnn: Я не уверен, когда это станет проблемой, если не смотреть на атрибут data- через инспектор Chrome или Firebug. - person Blender; 23.11.2012
comment
Я не думаю, что это будет проблемой (помимо того, что вы упомянули, или если есть другой код, который использует .attr() для получения атрибута). Я просто подумал, что на это стоит указать, учитывая, что OP явно (если, возможно, ошибочно) спросил об обновлении атрибутов. - person nnnnnn; 23.11.2012
comment
@Blender, это не совсем ответ на мой вопрос. Я хочу обновить HTML, но в то же время использую element.data ('myval') для его получения. - person Pulkit Mittal; 23.11.2012
comment
@PulkitMittal: прочтите комментарии @ nnnnnn. .data('foo', 12) - это не то же самое, что .attr('data-foo', '12'). Зачем нужно обновлять HTML? - person Blender; 23.11.2012
comment
Мне нужно это сделать, потому что элементы, сгенерированные при загрузке документа, имеют их как атрибуты данных, и я хочу сделать это и для новых динамических элементов. Я знаю, что, возможно, в этом нет особой необходимости, но я хочу сохранить последовательность. - person Pulkit Mittal; 23.11.2012
comment
@PulkitMittal: Но почему? Если вы собираетесь обращаться к атрибутам данных с помощью data(), нет смысла изменять таким образом элемент DOM. - person Blender; 23.11.2012
comment
Наверное. хм ... Тогда я думаю, что могу изменить и то, и другое, используя .attr() и .data(), чтобы сохранить последовательность. - person Pulkit Mittal; 23.11.2012
comment
@PulkitMittal: Я до сих пор не понимаю, зачем вам это нужно. Это бессмысленно. - person Blender; 23.11.2012
comment
СОХРАНИТЬ ПОСЛЕДОВАТЕЛЬНОСТЬ. Я же тебе сказал! - person Pulkit Mittal; 23.11.2012
comment
@PulkitMittal: Я не собираюсь спорить об этом. Я просто указываю на то, что для этого нет причин, и вы зря тратите время, пытаясь. - person Blender; 23.11.2012
comment
Спасибо за ваш вклад @Blender; Я ценю это. Я сохраню оба установщика на случай, если какой-либо из моих более поздних Javascript использует data-attr или что-то в этом роде. - person Pulkit Mittal; 23.11.2012
comment
@PulkitMittal - Обратите внимание, что даже с .attr() вы на самом деле не обновляете html, вы обновляете DOM. Когда вы просите браузер предоставить вам html (будь то .html() или DOM element.innerHTML), браузер эффективно регенерирует его для вас на основе состояния DOM в то время. Вроде, как бы, что-то вроде. - person nnnnnn; 23.11.2012
comment
@nnnnnn - это самая важная часть работы метода .data(). Спасибо что подметил это! - person MrUpsidown; 25.03.2015

[jQuery] .data () против .attr () против .extend ()

Метод jQuery .data() обновляет внутренний объект, управляемый 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.

person Cody    schedule 17.12.2017

Чтобы поддерживать синхронизацию jQuery и DOM, простой вариант может быть

$('#mydiv').data('myval',20).attr('data-myval',20);        
person J. McNerney    schedule 29.01.2020