Як встановити атрибути даних у елементах HTML


233

У мене є дів з атрибутом 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
Що в div? Об'єкт або елемент jQuery?
Бред

2
div.data('myval')=20не буде працювати для збереження значення лише тому, що синтаксис неправильний - див. відповіді щодо правильного синтаксису. Але зауважте, що .data()насправді атрибут елемента не оновлюється , він зберігає дані в іншому місці.
nnnnnn

Для тих, хто має сенс уникати gQuery, використовуйте це -> div.dataset.myval = '20';
Harijs Krūtainis

Відповіді:


448

HTML

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

JS

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

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

Демо

Довідково

З довідки:

jQuery сам використовує .data()метод збереження інформації під іменами "події" та "обробляти", а також зберігає будь-яке ім'я даних, починаючи з підкреслення ("_") для внутрішнього використання.

Слід зазначити, що jQuery's 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>

Дивіться цю демонстрацію


Я не знаю , що консистенція вам потрібно, але я б рекомендував використовувати data()в getі setHTML 5-атрибутів даних.
Jashwant

7
@Jashwant може бути корисним редагуванням замість цього: придумайте правило css, наприклад [data-myval="10"]{ color: red; }, воно буде стилювати тег відповідно до значення атрибута даних.
TechNyquist

4
.дані не працюють. .attr працює. можливо, ми можемо відредагувати відповідь, щоб дати зрозуміти. здається, що перше - це рішення, тоді як його можна було б трохи краще оголити. Я не впевнений, як краще пояснити, це причина, чому я не редагую публікацію.
Гаучо

@Gaucho, краще зараз?
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 () поверне рядок.
Бакер Накві

32

Зверніть увагу, що jQuery .data()не оновлюється при зміні data-атрибутів html5 за допомогою JavaScript.

Якщо ви використовуєте jQuery .data()для встановлення data-атрибутів у елементах HTML, .data()для їх читання краще використовувати jQuery . Інакше можуть виникнути невідповідності, якщо ви динамічно оновлюєте атрибути. Наприклад, див setAttribute(), dataset(), attr()нижче. Змініть значення, натисніть кнопку кілька разів і побачте консоль.


29

Ванільне рішення 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
    
  • Використання datasetвластивості JavaScript

    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-атрибута. Хоча я підозрюю, що ОП насправді не потрібно встановлювати атрибути, хоча саме про це і було задано питання.
nnnnnn

1
Я не думаю, що це буде проблемою (крім того, що ви згадали, або якщо є інший код, який використовується .attr()для отримання атрибута). Я просто подумав, що варто зазначити, враховуючи, що ОП явно (якщо можливо помилково) запитала про оновлення атрибутів.
nnnnnn

1
@Blender це насправді не відповідає на моє запитання. Я хочу оновити HTML, але в той же час використовуйте element.data ("myval"), щоб отримати його також.
Pulkit Mittal

1
Мені це потрібно зробити, тому що елементи, що створюються при завантаженні документа, мають такі як атрибути даних, і я хочу це зробити і для нових динамічних елементів. Я знаю, що може не бути конкретної потреби в цьому, але я хочу зберегти послідовність.
Pulkit Mittal

1
@PulkitMittal - Зауважте, що навіть .attr()якщо ви насправді не оновлюєте "html", ви оновлюєте DOM. Коли ви попросите браузера надати вам "html" (будь .html()то DOM або DOM element.innerHTML), браузер ефективно регенерує його для вас на основі стану DOM на той момент. Різновид.
nnnnnn

3

[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 .


2

Інший спосіб встановити атрибут 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

0

Щоб синхронізувати jQuery та DOM, може бути простим варіантом

$('#mydiv').data('myval',20).attr('data-myval',20);        
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.