Как установить атрибуты данных в элементах HTML
У меня есть div с атрибутом data-myval = "10"
. Я хочу обновить его значение; не изменилось бы, если я использую div.data('myval',20)
? Нужно ли использовать только div.attr('data-myval','20')
?
Я запутался между HTML5 и jQuery? Пожалуйста, порекомендуйте. Спасибо!
EDIT: Обновлен div.data('myval')=20
до div.data('myval',20)
, но все же HTML не обновляется.
Ответы
Ответ 1
HTML
<div id="mydiv" data-myval="10"></div>
JS
var a = $('#mydiv').data('myval'); //getter
$('#mydiv').data('myval',20); //setter
демонстрация
Ссылка
Из ссылки:
Сам jQuery использует метод .data()
для сохранения информации под именами 'events' и 'handle', а также резервирует любое имя данных, начинающееся с подчеркивания ('_'), для внутреннего использования.
Следует отметить, что jQuery data()
не меняет атрибут 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>
Посмотреть это демо
Ответ 2
Обратите внимание, что 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>
Ответ 3
Вы также можете использовать следующую attr
вещь;
HTML
<div id="mydiv" data-myval="JohnCena"></div>
Script
$('#mydiv').attr('data-myval', 'Undertaker'); // sets
$('#mydiv').attr('data-myval'); // gets
ИЛИ
$('#mydiv').data('myval'); // gets value
$('#mydiv').data('myval','John Cena'); // sets value
Ответ 4
Ванильное решение 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
Ответ 5
Если вы используете jQuery, используйте .data()
:
div.data('myval', 20);
Вы можете хранить произвольные данные с помощью .data()
, но при использовании .attr()
вы ограничены только строками.
Ответ 6
[jQuery].data() vs .attr() vs .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
.
Ответ 7
Другой способ установить атрибут data- - использовать свойство набора данных.
<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