Cara mengatur atribut data dalam elemen HTML

248

Saya memiliki div dengan atribut data-myval = "10". Saya ingin memperbarui nilainya; bukankah itu akan berubah jika saya gunakan div.data('myval',20)? Apakah saya hanya perlu menggunakan div.attr('data-myval','20')?

Apakah saya bingung antara HTML5 dan jQuery? Mohon saran. Terima kasih!

EDIT: Diperbarui div.data('myval')=20ke div.data('myval',20), tetapi HTML tetap tidak diperbarui.

Pulkit Mittal
sumber
1
Ada apa div? Objek atau elemen jQuery?
Brad
2
div.data('myval')=20tidak akan berfungsi untuk menyimpan nilai hanya karena sintaksnya salah - lihat jawaban untuk sintaks yang benar. Tetapi perhatikan bahwa .data()tidak benar-benar memperbarui atribut elemen , itu menyimpan data di tempat lain.
nnnnnn
Bagi mereka yang ingin menghindari gQuery gunakan this -> div.dataset.myval = '20';
Harijs Krūtainis

Jawaban:

473

HTML

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

JS

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

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

Demo

Referensi

Dari referensi:

jQuery sendiri menggunakan .data()metode untuk menyimpan informasi di bawah nama 'peristiwa' dan 'pegangan', dan juga menyimpan nama data apa pun yang dimulai dengan garis bawah ('_') untuk penggunaan internal.

Perlu dicatat bahwa jQuery data()tidak mengubah dataatribut di HTML.

Jadi, jika Anda perlu mengubah dataatribut di HTML, Anda harus menggunakan .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>

Lihat demo ini

Jashwant
sumber
Aku tidak tahu apa konsistensi yang Anda butuhkan, tapi saya akan merekomendasikan untuk menggunakan data()untuk getdan setHTML-5 atribut data.
Jashwant
7
@Jashwant mungkin bisa menjadi pengeditan yang berguna: pikirkan aturan css seperti [data-myval="10"]{ color: red; }, ini akan memberi gaya pada tag sesuai dengan nilai atribut data.
TechNyquist
4
.data tidak berfungsi. .attr bekerja. mungkin kita bisa mengedit jawabannya agar jelas. tampaknya yang pertama adalah solusinya, sementara itu bisa diekspos sedikit lebih baik. saya tidak yakin bagaimana menjelaskan dengan lebih baik, inilah alasan mengapa saya tidak mengedit posting.
Gaucho
@ Gaucho, apakah sekarang lebih baik?
Jashwant
1
@Gaucho .data hanya akan berfungsi jika Anda menggunakan jQuery yang lebih baru> = 1.4.3, untuk versi yang lebih lama .attr akan berfungsi.
Ilias
46

Anda juga dapat menggunakan attrhal berikut ;

HTML

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

Naskah

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

ATAU

$('#mydiv').data('myval'); // gets value
$('#mydiv').data('myval','John Cena'); // sets value
Baqer Naqvi
sumber
6
Bagi saya bekerja hanya dengan .attr. Apakah itu mungkin?
Zariweya
Saya senang itu berhasil. Panggilan .data () bersifat khusus - tidak hanya mengambil atribut data HTML5, tetapi juga mencoba mengevaluasi / mengurai atribut. Jadi dengan atribut seperti data-myval = '{"hello": "world"}' ketika diambil melalui .data () akan mengembalikan Objek sementara pengambilan melalui .attr () akan mengembalikan string.
Baqer Naqvi
36

Solusi Vanilla Javascript

HTML

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

JavaScript:

  • Menggunakan getAttribute()properti 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
    
  • Menggunakan datasetproperti 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
    
rajesh kakawat
sumber
32

Harap perhatikan bahwa jQuery .data()tidak diperbarui saat Anda mengubah data-atribut html5 dengan javascript.

Jika Anda menggunakan jQuery .data()untuk mengatur data-atribut dalam elemen HTML, Anda sebaiknya menggunakan jQuery .data()untuk membacanya. Jika tidak, dapat terjadi inkonsistensi jika Anda memperbarui atribut secara dinamis. Sebagai contoh, lihat setAttribute(), dataset(), attr()di bawah ini. Ubah nilainya, tekan tombol beberapa kali dan lihat konsol.

Johann Echavarria
sumber
8

Jika Anda menggunakan jQuery, gunakan .data():

div.data('myval', 20);

Anda dapat menyimpan data arbitrer dengan .data(), tetapi Anda dibatasi hanya dengan string saat menggunakan .attr().

Blender
sumber
14
Perhatikan bahwa .data()metode ini tidak memperbarui data- atribut - yaitu, data yang disimpannya tidak berakhir di atribut (itulah sebabnya ia dapat menyimpan nilai non-string) meskipun ia dapat mengambil nilai dari data-atribut. Padahal saya curiga OP tidak terlalu perlu set atribut padahal itu pertanyaan yang diajukan.
nnnnnn
1
Saya tidak berpikir itu akan menjadi masalah (selain yang Anda sebutkan, atau jika ada kode lain yang digunakan .attr()untuk mengambil atribut). Saya hanya berpikir itu layak untuk ditunjukkan mengingat bahwa OP secara eksplisit (jika mungkin salah) bertanya tentang memperbarui atribut.
nnnnnn
1
@ Blender ini tidak benar-benar menjawab pertanyaan saya. Saya ingin mengupdate HTML, tetapi pada saat yang sama, gunakan element.data ('myval') untuk mengambilnya juga.
Pulkit Mittal
1
Saya perlu melakukan itu karena elemen yang dihasilkan pada pemuatan dokumen memiliki atribut data, dan saya ingin melakukannya untuk elemen dinamis baru juga. Saya tahu mungkin tidak ada kebutuhan khusus untuk itu, tetapi saya ingin menjaga konsistensi.
Pulkit Mittal
1
@PulkitMittal - Perhatikan bahwa meskipun .attr()Anda tidak benar-benar memperbarui "html", Anda memperbarui DOM. Saat Anda meminta browser untuk memberikan "html" (baik oleh .html()atau DOM element.innerHTML), browser secara efektif membuat ulang untuk Anda berdasarkan status DOM pada saat itu. Semacam.
nnnnnn
4

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

Metode jQuery .data()memperbarui objek internal yang dikelola oleh jQuery melalui penggunaan metode, jika saya benar.

Jika Anda ingin memperbarui data-attributesdengan beberapa spread, gunakan -

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

- jika tidak, $('body').attr('data-test', 'text');akan bekerja dengan baik.

Cara lain untuk melakukannya adalah dengan menggunakan -

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

- yang membatasi perubahan atribut apa pun HTMLElement.prototype.dataset, bukan tambahan apa punHTMLElement.prototype.attributes .

Cody
sumber
2

Cara lain untuk menyetel atribut data adalah menggunakan properti 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
CloudBranch
sumber
1

Untuk menjaga jQuery dan DOM tetap sinkron, opsi sederhana mungkin adalah

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