Saya memiliki bidang berikut pada tampilan MVC:
@Html.TextBoxFor(model => model.Course.Title, new { data_helptext = "Old Text" })</span>
Dalam file js terpisah, saya ingin mengatur data-helptext
atribut ke nilai string. Ini kode saya:
alert($(targetField).data("helptext"));
$(targetField).data("helptext", "Testing 123");
The alert()
panggilan bekerja dengan baik, hal itu menunjukkan teks "Old Text" dalam dialog peringatan. Namun, panggilan untuk mengatur data-helptext
atribut ke "Testing 123" tidak berfungsi. "Teks Lama" masih merupakan nilai atribut saat ini.
Apakah saya menggunakan panggilan ke data () secara salah? Saya sudah mencari ini di web, dan saya tidak bisa melihat kesalahan saya.
Ini markup HTML:
<input data-helptext="Old Text" id="Course_Title" name="Course.Title" type="text" value="" />
jquery
model-view-controller
attributes
custom-data-attribute
Jason Evans
sumber
sumber
data-
atribut HTML5 khusus ?Jawaban:
Itu disebutkan dalam
.data()
dokumentasiIni juga dibahas pada Mengapa tidak mengubah ke jQuery $ .fn.data () memperbarui atribut html 5 data- * yang sesuai?
Demo pada jawaban asli saya di bawah ini sepertinya tidak berfungsi lagi.
Jawaban yang diperbarui
Sekali lagi, dari
.data()
dokumentasiJadi untuk
<div data-role="page"></div>
yang berikut ini benar$('div').data('role') === 'page'
Saya cukup yakin itu
$('div').data('data-role')
berhasil di masa lalu tetapi tampaknya tidak menjadi masalah lagi. Saya telah membuat showcase yang lebih baik yang log ke HTML daripada harus membuka Konsol dan menambahkan contoh tambahan dari multi-hyphen ke konversi atribut data camelCase .Demo yang diperbarui (2015-07-25)
Juga lihat jQuery Data vs Attr?
HTML
JavaScript (jQuery 1.6.2+)
Demo yang lebih lama
Jawaban asli
Untuk HTML ini:
dan JavaScript ini (dengan jQuery 1.6.2)
Lihat demo
Menggunakan Chrome DevTools Console untuk memeriksa DOM,
$('#foo').data('helptext', 'Testing 123');
tidak memperbarui nilai seperti yang terlihat di Konsol tetapi$('#foo').attr('data-helptext', 'Testing 123');
tidak.sumber
data('key', 'value')
metode tidak memperbarui nilai dalam cache jQuery tetapi karena alasan kinerja (saya kira DOM mutasi) DOM itu sendiri tidak diperbarui..attr('key','value')
terlepas dari apakah Anda melakukannya.data('key', 'value')
atau tidak, kan? Itu tampak berlebihan bagi saya, dan saya mengalami kesulitan membayangkan skenario di mana Anda ingin menulis ke DOM yang di-cache, tetapi bukan DOM yang sebenarnya. Mungkin saya tidak mengerti cache jQuery; Jadi, akankah pengunjung melihat semua hal yang.data()
dimodifikasi di layar mereka, atau tidak?Saya mengalami masalah serius dengan
Itu tidak mengatur
data-property
atribut.Mulai menggunakan jQuery's
.attr()
:untuk mengatur nilai dan
untuk mengambil nilai.
Sekarang berhasil!
sumber
Jawaban yang diterima @ andyb memiliki bug kecil. Lebih lanjut ke komentar saya pada posnya di atas ...
Untuk HTML ini:
Anda perlu mengakses atribut seperti ini:
tetapi metode datanya seperti ini:
Perbaikan di atas untuk metode .data () akan mencegah "tidak terdefinisi" dan nilai data akan diperbarui (sedangkan HTML tidak akan)
Titik atribut "data" adalah untuk mengikat (atau "tautan") nilai dengan elemen. Sangat mirip dengan
onclick="alert('do_something')"
atribut, yang mengikat aksi ke elemen ... teks tidak berguna Anda hanya ingin aksi bekerja ketika mereka mengklik elemen.Setelah data atau tindakan terikat ke elemen, biasanya * tidak perlu memperbarui HTML, hanya data atau metode, karena itulah yang akan digunakan oleh aplikasi Anda (JavaScript). Dari segi kinerja, saya tidak mengerti mengapa Anda juga ingin memperbarui HTML, tidak ada yang melihat atribut html (kecuali di Firebug atau konsol lain).
Salah satu cara Anda mungkin ingin memikirkannya: HTML (beserta atribut) hanyalah teks. Data, fungsi, objek, dll yang digunakan oleh JavaScript ada di bidang yang terpisah. Hanya ketika JavaScript diperintahkan untuk melakukannya, itu akan membaca atau memperbarui teks HTML, tetapi semua data dan fungsi yang Anda buat dengan JavaScript bertindak sepenuhnya terpisah dari teks / atribut HTML yang Anda lihat di konsol Firebug (atau lainnya) Anda.
* Saya memberi penekanan pada biasanya karena jika Anda memiliki kasus di mana Anda perlu melestarikan dan mengekspor HTML (misalnya beberapa jenis format mikro / editor teks sadar data) di mana HTML akan memuat segar di halaman lain, maka mungkin Anda perlu memperbarui HTML terlalu.
sumber
data
dalamattr('data-helptext'
membuat perbedaan, di mana jawaban yang diterima dan yang dengan banyak orang yang tidak bekerja. +1Hal yang sama terjadi pada saya. Ternyata itu
memberi Anda objek yang tidak bisa ditulisi. Saya menyelesaikannya menggunakan:
Dan sejak saat
data
itu , adalah objek JS standar yang dapat ditulis.sumber
$.extend...
, Anda dapat menggunakandata
sesuka Anda:,data.name = 'Nico'; data.questionSolved = true;
danconsole.log(data)
akan menampilkan properti yang baru ditambahkan iniMengutip kutipan:
.data()
- Dokumentasi jQueryPerhatikan bahwa batasan ini (sangat aneh ) hanya ditahan untuk penggunaan
.data()
.Solusinya? Gunakan
.attr
sebagai gantinya.Tentu saja, beberapa dari Anda mungkin merasa tidak nyaman karena tidak menggunakan metode khusus itu. Pertimbangkan skenario berikut:
Akal sehat - Mengapa mereka mengubah atribut yang sudah ada seperti itu? Bayangkan saja
class
mulai diubah namanya menjadi grup danid
untuk pengidentifikasi . Internet akan rusak.Dan bahkan kemudian, Javascript sendiri memiliki kemampuan untuk memperbaikinya - Dan tentu saja, meskipun itu tidak sesuai dengan HTML, REGEX (Dan berbagai metode serupa) dengan cepat dapat mengubah nama atribut Anda ke 'standar' mitos-baru ini.
TL; DR
sumber
Seperti disebutkan,
.data()
metode ini tidak akan benar-benar menetapkan nilaidata-
atribut, juga tidak akan membaca nilai yang diperbarui jikadata-
atribut berubah.Solusi saya adalah memperluas jQuery dengan
.realData()
metode yang benar-benar sesuai dengan nilai atribut saat ini:CATATAN: Tentu saja Anda bisa menggunakan
.attr()
, tetapi dari pengalaman saya, sebagian besar pengembang (alias saya) membuat kesalahan dengan melihat.attr()
dan.data()
dipertukarkan, dan sering mengganti satu dengan yang lain tanpa berpikir. Ini mungkin bekerja sebagian besar waktu, tapi ini cara yang bagus untuk memperkenalkan bug, terutama ketika berhadapan dengan segala jenis pengikatan data dinamis. Jadi dengan menggunakan.realData()
, saya bisa lebih eksplisit tentang perilaku yang dimaksud.sumber
Punya masalah yang sama. Karena Anda masih bisa mendapatkan data menggunakan metode .data (), Anda hanya perlu mencari cara untuk menulis ke elemen. Ini adalah metode pembantu yang saya gunakan. Seperti yang dikatakan kebanyakan orang, Anda harus menggunakan .attr. Saya memilikinya mengganti _ dengan - seperti yang saya tahu itu. Saya tidak mengetahui adanya karakter lain yang digantikannya ... namun saya belum merisetnya.
EDIT: 5/1/2017
Saya menemukan masih ada contoh di mana Anda tidak bisa mendapatkan data yang benar menggunakan metode bawaan sehingga yang saya gunakan sekarang adalah sebagai berikut:
sumber