Jika Anda meneruskan data ke elemen DOM dari server, Anda harus mengatur data pada elemen:
<a id="foo" data-foo="bar" href="#">foo!</a>
Data kemudian dapat diakses menggunakan .data()
di jQuery:
console.log( $('#foo').data('foo') );
//outputs "bar"
Namun ketika Anda menyimpan data pada simpul DOM di jQuery menggunakan data, variabel disimpan pada objek simpul . Ini untuk mengakomodasi objek dan referensi yang kompleks karena menyimpan data pada elemen node sebagai atribut hanya akan mengakomodasi nilai string.
Melanjutkan contoh saya dari atas:
$('#foo').data('foo', 'baz');
console.log( $('#foo').attr('data-foo') );
//outputs "bar" as the attribute was never changed
console.log( $('#foo').data('foo') );
//outputs "baz" as the value has been updated on the object
Juga, konvensi penamaan untuk atribut data memiliki sedikit "gotcha" tersembunyi:
HTML:
<a id="bar" data-foo-bar-baz="fizz-buzz" href="#">fizz buzz!</a>
JS:
console.log( $('#bar').data('fooBarBaz') );
//outputs "fizz-buzz" as hyphens are automatically camelCase'd
Kunci yang ditulis dgn tanda penghubung masih akan bekerja:
HTML:
<a id="bar" data-foo-bar-baz="fizz-buzz" href="#">fizz buzz!</a>
JS:
console.log( $('#bar').data('foo-bar-baz') );
//still outputs "fizz-buzz"
Namun objek yang dikembalikan oleh .data()
tidak akan memiliki set kunci ditulis dgn tanda penghubung:
$('#bar').data().fooBarBaz; //works
$('#bar').data()['fooBarBaz']; //works
$('#bar').data()['foo-bar-baz']; //does not work
Karena alasan inilah saya menyarankan untuk menghindari kunci ditulis dgn tanda penghubung dalam javascript.
Untuk HTML, tetap gunakan formulir ditulis dgn tanda penghubung. Atribut HTML seharusnya mendapatkan ASCII-lowercased otomatis , sehingga <div data-foobar></div>
, <DIV DATA-FOOBAR></DIV>
, dan <dIv DaTa-FoObAr></DiV>
yang seharusnya diperlakukan sebagai identik, tetapi untuk kompatibilitas terbaik bentuk kasus yang lebih rendah harus lebih disukai.
The .data()
Metode juga akan melakukan beberapa dasar auto-casting jika nilai cocok dengan pola diakui:
HTML:
<a id="foo"
href="#"
data-str="bar"
data-bool="true"
data-num="15"
data-json='{"fizz":["buzz"]}'>foo!</a>
JS:
$('#foo').data('str'); //`"bar"`
$('#foo').data('bool'); //`true`
$('#foo').data('num'); //`15`
$('#foo').data('json'); //`{fizz:['buzz']}`
Kemampuan auto-casting ini sangat nyaman untuk instantiating widget & plugin:
$('.widget').each(function () {
$(this).widget($(this).data());
//-or-
$(this).widget($(this).data('widget'));
});
Jika Anda benar-benar harus memiliki nilai asli sebagai string, maka Anda harus menggunakan .attr()
:
HTML:
<a id="foo" href="#" data-color="ABC123"></a>
<a id="bar" href="#" data-color="654321"></a>
JS:
$('#foo').data('color').length; //6
$('#bar').data('color').length; //undefined, length isn't a property of numbers
$('#foo').attr('data-color').length; //6
$('#bar').attr('data-color').length; //6
Ini adalah contoh yang dibuat-buat. Untuk menyimpan nilai warna, saya dulu menggunakan notasi hex numerik (yaitu 0xABC123), tetapi perlu dicatat bahwa hex diurai secara salah dalam versi jQuery sebelum 1.7.2 , dan tidak lagi diurai menjadi Number
seperti pada jQuery 1.8 rc 1.
jQuery 1.8 rc 1 mengubah perilaku auto-casting . Sebelum, format itu adalah representasi yang sah dari Number
akan dilemparkan ke Number
. Sekarang, nilai-nilai yang numerik hanya auto-cast jika representasi mereka tetap sama. Ini paling baik digambarkan dengan sebuah contoh.
HTML:
<a id="foo"
href="#"
data-int="1000"
data-decimal="1000.00"
data-scientific="1e3"
data-hex="0x03e8">foo!</a>
JS:
// pre 1.8 post 1.8
$('#foo').data('int'); // 1000 1000
$('#foo').data('decimal'); // 1000 "1000.00"
$('#foo').data('scientific'); // 1000 "1e3"
$('#foo').data('hex'); // 1000 "0x03e8"
Jika Anda berencana untuk menggunakan sintaks numerik alternatif untuk mengakses nilai numerik, pastikan untuk memberikan nilainya ke yang Number
pertama, seperti dengan +
operator unary .
JS (lanjutan):
+$('#foo').data('hex'); // 1000