Maafkan saya karena tidak lebih spesifik tentang ini. Saya memiliki bug yang aneh. Setelah dokumen dimuat, saya mengulang beberapa elemen yang awalnya memiliki data-itemname=""
, dan saya menetapkan nilai tersebut menggunakan .attr("data-itemname", "someValue")
.
Masalah: Ketika saya kemudian mengulang melalui elemen-elemen itu, jika saya melakukannya elem.data().itemname
, saya mengerti ""
, tetapi jika saya melakukannya elem.attr("data-itemname")
, saya mengerti "someValue"
. Ini seperti .data()
getter jQuery hanya mendapatkan elemen yang pada awalnya ditetapkan untuk berisi beberapa nilai, tetapi jika awalnya kosong, dan kemudian disetel, maka .data()
tidak akan mendapatkan nilainya nanti.
Saya telah mencoba membuat ulang bug ini tetapi belum bisa.
Edit
Saya telah membuat ulang bug! http://jsbin.com/ihuhep/edit#javascript,html,live
Juga, cuplikan dari tautan di atas ...
JS:
var theaters = [
{ name: "theater A", theaterId: 5 },
{ name: "theater B", theaterId: 17 }
];
$("#theaters").html(
$("#theaterTmpl").render(theaters)
);
// DOES NOT WORK - .data("name", "val") does NOT set the val
var theaterA = $("[data-theaterid='5']");
theaterA.find(".someLink").data("tofilllater", "theater5link"); // this does NOT set data-tofilllater
$(".someLink[data-tofilllater='theater5link']").html("changed link text"); // never gets changed
// WORKS - .attr("data-name", "val") DOES set val
var theaterB = $("[data-theaterid='17']");
theaterB.find(".someLink").attr("data-tofilllater", "theater17link"); // this does set data-tofilllater
$(".someLink[data-tofilllater='theater17link']").html("changed link text");
HTML:
<body>
<div id="theaters"></div>
</body>
<script id="theaterTmpl" type="text/x-jquery-tmpl">
<div class="theater" data-theaterid="{{=theaterId}}">
<h2>{{=name}}</h2>
<a href="#" class="someLink" data-tofilllater="">need to change this text</a>
</div>
</script>
elem.data("itemname")
tidakelem.data().itemname
?elem.data().itemname = somevalue;
tidak mengubah data yang mendasarinya.)Jawaban:
Saya mengalami "bug" serupa beberapa hari yang lalu saat bekerja dengan
.data()
dan.attr('data-name')
untuk atribut data HTML5.Perilaku yang Anda gambarkan bukanlah bug, tetapi memang disengaja.
The
.data()
panggilan khusus - bukan hanya tidak mengambil HTML5 Data atribut itu juga upaya untuk mengevaluasi / mengurai atribut. Jadi dengan atribut sepertidata-myjson='{"hello":"world"}'
saat diambil via.data()
akan mengembalikanObject
sementara pengambilan via.attr()
akan mengembalikan sebuah string. Lihat contoh jsfiddle.Karena
.data()
pemrosesan tambahan, jQuery menyimpan hasil evaluasi atribut dalam$.cache
- setelah semua, setelah atribut data dievaluasi, akan sia-sia untuk mengevaluasi ulang pada setiap.data()
panggilan - terutama karena variabel data dapat berisi string JSON yang kompleks.Saya mengatakan semua itu untuk mengatakan yang berikut: Setelah mengambil atribut melalui
.data()
perubahan apa pun yang dibuat oleh.attr('data-myvar', '')
tidak akan terlihat oleh.data()
panggilan berikutnya . Uji ini di jsfiddle.Untuk menghindari masalah ini jangan mencampurkan
.data
dan.attr()
menelepon. Gunakan satu atau lainnya.sumber
Ini adalah hasil dari kesalahpahaman:
data
BUKAN aksesor untukdata-*
atribut . Lebih dan kurang dari itu.data
adalah aksesor untuk data cache jQuery pada elemen. Cache tersebut diinisialisasi daridata-*
atribut jika ada, tetapidata
tidak pernah menulis ke atribut, juga tidak mengubah atribut mengubah cache data setelah inisialisasi:data
juga memijat apa yang ditemukannya dengan berbagai cara, menebak tipe data, membuatdata("answer")
elemen dengandata-answer="42"
angka, bukan string, atau bahkan mem-parsing hal-hal sebagai JSON jika terlihat seperti JSON:Jika Anda ingin menggunakan atribut (baik membaca dan menyetelnya), gunakan
attr
, bukandata
.attr
adalah aksesor untuk atribut.sumber
Itu karena nama atributnya adalah
data-itemname
. Anda tidak dapat menggunakan notasi-
singkatanobj.attribute
(obj.data-nama item akan diartikan sebagai "obj.data minus itemname").sumber
.attr("data-itemname", "someValue")
memodifikasi DOM..data("itemname", "someValue")
memodifikasi cache jQuery.Untuk mendapatkan ini berfungsi dalam mengikuti Javascript dan sebagai tambahan di CSS Anda harus mengatur keduanya.
sumber
Mengapa Anda tidak menggunakannya di
.data()
mana-mana?Anda juga dapat mendeklarasikan nilai default sebaris pada HTML, yang juga tidak masalah.
dan
jika Anda ingin mengubahnya, lakukan saja
dan untuk menghapusnya, Anda dapat meminta
Anda harus benar-benar mencoba dan menghindari penggunaan
.attr("data-*")
, saya tidak tahu mengapa Anda ingin melakukannya.sumber
.attr('data-*', ...)
tidak akan membuat data terlihat oleh.data()
getAttribute()
dansetAttribute()
- jadi kedua metode akan mengakses atribut sebenarnya dan akan berfungsi kembali. Atau Anda cukup menggunakandataSet
properti yang disediakan browser modern.class
sebagai gantinya karena browser memiliki fungsi asli untuk mendapatkan elemen dengan kelas tertentu.Anda harus mengatur data menggunakan
.data('itemname', 'someValue');
. Menggunakan.attr()
untuk menyetel atribut data tidak akan berfungsi: http://jsfiddle.net/ThiefMaster/YHsKx/Namun, Anda dapat memberikan nilai sebaris dengan menggunakan misalnya
<div data-key="value">
di markup.sumber
.data()
panggilan menetapkan atribut, sedangkan.attr()
panggilan tidak apa-apa..attr()
sama sekali, hanya.data()
, dan, panjang pemilih$(".someLink[data-tofilllater='theater5link']")
,, adalah nol. jadi sepertinya saya harus menggunakan.attr()
: /Saya dapat melihat bahwa ini telah memunculkan beberapa divisi tentang bagaimana mendekati pengaturan atribut data.
Saya juga mengalami masalah ini dan saya menemukan bahwa masalahnya tampaknya hanya format nama atribut data .
Dalam pengalaman saya, Anda harus menghindari penggunaan tanda hubung dalam variabel data (nama variabel yang muncul setelah " data- ").
Ini tidak berhasil untuk saya:
[Markup]
[jQuery]
Tapi berikut ini bekerja dengan baik! :):
(Saya menggunakan garis bawah dan bukan tanda hubung bila diperlukan)
[Markup]
[jQuery]
Saya harap ini membantu. Cheers semuanya!
sumber