HTML5 Data Attributes: Cara Menggunakan data-* untuk Menyimpan Data di Elemen HTML
Daftar Isi
Atribut data-* adalah mekanisme standar HTML untuk menyimpan informasi tambahan pada sebuah elemen ketika informasi tersebut tidak mempunyai atribut HTML khusus yang lebih tepat. Tanda bintang bukan ditulis secara literal; bagian itu diganti dengan nama yang menjelaskan data, misalnya data-product-id="42", data-category="buku", atau data-stock="8". Teknik ini berguna ketika markup perlu membawa data yang nantinya dibaca JavaScript, misalnya ID internal sebuah kartu produk, status antarmuka, nilai filter, atau konfigurasi sederhana untuk sebuah komponen. Karena atribut tersebut berada langsung pada elemen, hubungan antara data dan elemen yang menggunakannya juga mudah dilihat melalui source HTML maupun DevTools. Atribut data-* bukan pengganti atribut semantik yang sudah tersedia: URL tetap sebaiknya menggunakan href atau src sesuai elemen, status form menggunakan mekanisme form yang tepat, dan informasi aksesibilitas tidak seharusnya dipindahkan ke atribut data. Dalam tutorial ini kita akan membuat contoh kartu produk menggunakan HTML dan JavaScript browser native, tanpa framework atau dependency eksternal, sehingga praktik cukup dilakukan dengan editor teks dan browser modern.
Materi ini berfokus pada tiga cara kerja yang perlu dibedakan. Pertama, atribut dapat ditulis langsung dalam markup dan dibaca sebagai teks. Kedua, JavaScript menyediakan properti dataset yang merepresentasikan custom data attributes melalui objek DOMStringMap; misalnya data-product-id diakses sebagai element.dataset.productId. Ketiga, selector CSS maupun JavaScript dapat mencari elemen berdasarkan atribut tersebut, misalnya selector [data-category="buku"]. Kita juga akan membahas konsekuensi penting yang sering terlewat oleh pemula: nilai yang diperoleh melalui dataset berupa string sehingga angka dan boolean perlu dikonversi berdasarkan kebutuhan program; perubahan melalui dataset tercermin pada atribut HTML elemen di DOM; dan data tersebut dapat diperiksa atau diubah oleh pengguna sehingga bukan tempat yang sesuai untuk password, token rahasia, keputusan otorisasi, atau informasi sensitif. Pada akhir praktik, Anda akan memiliki file HTML mandiri yang dapat dibuka langsung di browser dan dapat diverifikasi menggunakan tampilan halaman serta DevTools.
Landasan Sains dan Prinsip Kerja Metode
Dalam DOM, sebuah elemen HTML memiliki sekumpulan atribut. Custom data attributes memakai nama yang diawali data- dan memberi aplikasi ruang nama standar untuk data khusus halaman. HTML mendefinisikan mekanisme ini agar pengembang tidak perlu menciptakan atribut arbitrer seperti productid yang tidak mempunyai semantik standar. Contoh data-product-id="BK-101" menyimpan teks BK-101 pada elemen. JavaScript dapat mengambil nilai yang sama dengan getAttribute("data-product-id") ataupun, untuk custom data attributes yang dapat direpresentasikan melalui dataset, dengan dataset.productId. Kedua antarmuka itu berguna dalam konteks berbeda: getAttribute() bekerja menggunakan nama atribut secara eksplisit, sedangkan dataset dibuat khusus untuk kelompok atribut data-* dan biasanya lebih ringkas. Saat merancang nama untuk penggunaan umum, pola sederhana berbasis huruf kecil dan tanda hubung seperti data-product-id paling mudah dipahami dan dipetakan ke JavaScript. Prefix data- sendiri bukan dekorasi; prefix tersebutlah yang menyatakan bahwa atribut merupakan custom data attribute.
Pemetaan nama antara HTML dan JavaScript perlu dipahami agar kode tidak tampak seperti melakukan sihir. Pada arah HTML ke JavaScript, nama setelah data- dipetakan menjadi key dataset; pasangan tanda hubung yang diikuti huruf ASCII kecil mengubah huruf tersebut menjadi kapital dan menghilangkan tanda hubung. Karena itu data-product-id menjadi dataset.productId, sedangkan data-stock menjadi dataset.stock. Untuk nama sederhana seperti itu, dot notation mudah dibaca. Secara konseptual, nilai atribut tetap teks: data-stock="8" tidak otomatis menjadi JavaScript number 8. Ekspresi Number(card.dataset.stock) dapat dipakai ketika aplikasi memang membutuhkan angka, sementara nilai boolean sebaiknya mempunyai konvensi yang didefinisikan dengan tegas daripada mengandalkan truthiness string. Sebagai contoh, string "false" sendiri tetap truthy dalam kondisi JavaScript. Oleh karena itu representasi, konversi, dan validasi data harus menjadi keputusan aplikasi, bukan diasumsikan dilakukan HTML secara otomatis.
Data attribute juga merupakan bagian dari DOM sehingga dapat dimanfaatkan selector atribut. JavaScript dapat memakai document.querySelector('[data-product-id="BK-101"]'), sedangkan CSS dapat menggunakan selector serupa untuk styling berdasarkan keadaan atau kategori. Namun fungsi data dan presentasi sebaiknya tetap dipisahkan secara masuk akal. Jika sebuah nilai hanya menentukan tampilan dan class sudah cukup, class sering lebih jelas; jika nilai merupakan data khusus yang benar-benar perlu dibaca program, data-* menjadi pilihan yang tepat. Informasi yang bermakna bagi pengguna atau teknologi bantu juga jangan hanya disimpan di data-*, karena keberadaannya tidak otomatis membuat informasi tersebut tampil atau menjadi nama/status aksesibel. Lebih penting lagi, atribut pada halaman berada di sisi klien. Pengguna dapat melihat dan memodifikasinya dengan DevTools atau JavaScript. Server karena itu tidak boleh mempercayai harga, hak akses, identitas, atau parameter keamanan hanya karena nilainya berasal dari sebuah data attribute.
Formula, Komposisi Bahan, atau Spesifikasi Parameter
Karena topik ini bukan formula numerik, tabel berikut berfungsi sebagai spesifikasi teknis. Isinya merangkum komponen yang akan dipakai dalam contoh serta aturan representasinya. Perhatikan terutama perbedaan antara atribut di markup, key pada dataset, dan tipe nilai ketika sudah dibaca JavaScript. Spesifikasi ini dapat menjadi checklist sebelum Anda mulai membuat komponen yang lebih besar.
| Komponen | Spesifikasi/Rasio | Fungsi Teknis |
|---|---|---|
| Prefix atribut | data- | Menandai custom data attribute pada elemen HTML. |
| ID produk | data-product-id="BK-101" | Menghubungkan kartu dengan identifier aplikasi. |
| Kategori | data-category="buku" | Menyediakan nilai yang dapat dibaca atau dipakai selector atribut. |
| Stok | data-stock="8" | Menyimpan representasi teks dari jumlah stok. |
| Key dataset ID | dataset.productId | Membaca atau mengubah data-product-id melalui DOM. |
| Key dataset kategori | dataset.category | Mengakses data-category melalui JavaScript. |
| Konversi angka | Number(element.dataset.stock) | Mengubah string stok menjadi number ketika perhitungan memerlukannya. |
| Selector keberadaan | [data-product-id] | Memilih elemen yang memiliki atribut tersebut tanpa memeriksa nilainya. |
| Selector nilai | [data-category="buku"] | Memilih elemen yang nilai atributnya sesuai. |
| API atribut umum | getAttribute() / setAttribute() | Membaca atau menulis atribut menggunakan nama atribut secara eksplisit. |
data-* berada dalam DOM dan dapat dilihat serta dimodifikasi oleh pengguna. Jangan menyimpan password, API key, session token, atau secret lain di sana, dan jangan menjadikan nilai seperti data-price atau data-role sebagai sumber otoritatif untuk validasi keamanan server. Validasi dan otorisasi tetap harus dilakukan pada sisi yang dipercaya.Panduan Langkah Kerja Bertahap
Membuat Dokumen HTML dan Data Dasar
Buat direktori kerja bebas, kemudian buat file index.html. Tidak ada package yang perlu diinstal. Contoh pertama sengaja berupa dokumen lengkap supaya dapat dibuka langsung menggunakan browser. Kita menempatkan tiga data attribute pada elemen article: ID produk, kategori, dan stok. Teks nama produk tetap diletakkan dalam elemen yang terlihat, bukan hanya dalam atribut data, karena nama itu memang informasi yang perlu dibaca pengguna. Tombol belum melakukan aksi pada tahap ini; keberadaannya mempersiapkan interaksi pada langkah berikutnya.
<!doctype html>
<html lang="id">
<head>
<meta charset="utf-8">
<title>Latihan HTML Data Attributes</title>
</head>
<body>
<h1>Daftar Produk</h1>
<article
id="product-card"
data-product-id="BK-101"
data-category="buku"
data-stock="8">
<h2>Panduan HTML Praktis</h2>
<p>Stok tersedia: <span id="stock-text">8</span></p>
<button id="detail-button" type="button">Lihat data produk</button>
</article>
<p id="output">Data produk akan tampil di sini.</p>
</body>
</html>
Simpan file lalu buka index.html di browser. Hasil yang diharapkan adalah judul halaman, kartu sederhana berisi nama produk dan stok 8, tombol, serta teks output awal. Untuk memverifikasi atribut, buka DevTools dan gunakan panel Elements/Inspector untuk memilih elemen article. Anda seharusnya melihat data-product-id, data-category, dan data-stock tepat pada elemen itu. Tahap ini membuktikan bahwa browser menerima atribut sebagai bagian markup; atribut tersebut sendiri tidak otomatis mencetak nilainya sebagai konten visual. Selanjutnya kita akan membaca data tersebut dengan JavaScript.
Membaca Nilai Melalui dataset
Sekarang tambahkan JavaScript tanpa membuat file terpisah. Karena struktur artikel utama tidak boleh memakai elemen script aktif, blok berikut menampilkan source yang harus Anda tambahkan ke file praktik. Letakkan elemen script berikut tepat sebelum penutup </body> pada index.html. Posisi ini memastikan elemen kartu, tombol, dan output telah diparse sebelum kode mencarinya. Event listener membaca tiga key dari card.dataset. Perhatikan bahwa data-product-id menjadi productId, sedangkan nama satu kata seperti data-stock tetap menjadi stock.
<script>
const card = document.getElementById("product-card");
const button = document.getElementById("detail-button");
const output = document.getElementById("output");
button.addEventListener("click", () => {
const productId = card.dataset.productId;
const category = card.dataset.category;
const stock = card.dataset.stock;
output.textContent =
`ID: ${productId}, kategori: ${category}, stok: ${stock}`;
});
</script>
Simpan lalu refresh halaman dan klik tombol Lihat data produk. Hasil yang diharapkan pada paragraf output adalah ID: BK-101, kategori: buku, stok: 8. Anda dapat memverifikasi mapping tersebut lebih jauh melalui Console DevTools dengan memilih elemen menggunakan API DOM, tetapi tampilan output sudah merupakan verifikasi langsung dari kode. Penggunaan textContent juga disengaja: kita hanya ingin menampilkan data sebagai teks, bukan menafsirkannya sebagai markup HTML. Untuk data yang dapat berasal dari pengguna atau sumber luar, kebiasaan memilih API teks ketika markup tidak diperlukan menghindari interpretasi HTML yang tidak diinginkan.
Mengonversi String Menjadi Tipe yang Dibutuhkan
Walaupun data-stock="8" terlihat seperti angka, akses melalui dataset.stock menghasilkan string. Hal ini penting ketika Anda akan melakukan operasi matematika. Penjumlahan menggunakan string dapat menghasilkan konkatenasi yang tidak diinginkan, sedangkan konversi eksplisit membuat maksud program jelas. Ubah isi event listener pada langkah sebelumnya menjadi versi berikut. Kita menggunakan Number() lalu Number.isFinite() agar contoh tidak memperlakukan data yang gagal dikonversi sebagai stok valid. Kode lain pada file tetap sama.
button.addEventListener("click", () => {
const productId = card.dataset.productId;
const category = card.dataset.category;
const stock = Number(card.dataset.stock);
if (!Number.isFinite(stock)) {
output.textContent = "Nilai stok tidak valid.";
return;
}
output.textContent =
`ID: ${productId}, kategori: ${category}, stok berikutnya: ${stock + 1}`;
});
Simpan, refresh, lalu klik tombol. Dengan nilai awal data-stock="8", target output sekarang memuat stok berikutnya: 9, bukan 81. Untuk memverifikasi validasi, Anda dapat sementara mengubah nilai atribut di source menjadi teks yang bukan representasi angka, misalnya data-stock="tersedia", menyimpan dan refresh; output sesudah tombol diklik akan menyatakan nilai stok tidak valid. Setelah pengujian, kembalikan nilainya menjadi 8 agar langkah selanjutnya konsisten. Pola yang sama berlaku untuk tipe lain: tentukan format yang Anda simpan dan lakukan parsing secara eksplisit. Hindari menganggap Boolean(card.dataset.active) akan memahami string "false", sebab string non-kosong tersebut menghasilkan true.
Mengubah Data Attribute dari JavaScript
dataset tidak hanya digunakan untuk membaca. Menetapkan nilai pada propertinya memperbarui custom data attribute terkait pada elemen. Agar perubahan mudah dilihat, tambahkan tombol kedua tepat sesudah tombol detail di dalam article, lalu ganti JavaScript lama dengan blok script lengkap berikut. Saat tombol dipilih, program mengurangi stok, menulis hasil kembali melalui card.dataset.stock, dan memperbarui teks yang terlihat. Penugasan angka ke dataset.stock pada akhirnya direpresentasikan sebagai string pada atribut DOM. Kita tetap memvalidasi nilai sebelum melakukan perhitungan.
<button id="reduce-button" type="button">Kurangi stok</button>
<script>
const card = document.getElementById("product-card");
const detailButton = document.getElementById("detail-button");
const reduceButton = document.getElementById("reduce-button");
const stockText = document.getElementById("stock-text");
const output = document.getElementById("output");
detailButton.addEventListener("click", () => {
output.textContent =
`ID: ${card.dataset.productId}, kategori: ${card.dataset.category}, stok: ${card.dataset.stock}`;
});
reduceButton.addEventListener("click", () => {
const stock = Number(card.dataset.stock);
if (!Number.isFinite(stock) || stock <= 0) {
output.textContent = "Stok tidak dapat dikurangi.";
return;
}
const newStock = stock - 1;
card.dataset.stock = newStock;
stockText.textContent = newStock;
output.textContent = `Stok DOM diperbarui menjadi ${newStock}.`;
});
</script>
Setelah refresh, klik Kurangi stok satu kali. Tampilan stok seharusnya menjadi 7. Periksa elemen article melalui DevTools: atributnya sekarang seharusnya memperlihatkan data-stock="7". Ini memverifikasi sinkronisasi antara API dataset dan atribut DOM. Perubahan tersebut hanya terjadi pada dokumen yang sedang dimuat; mengubah DOM tidak menulis ulang file index.html di disk atau database server. Refresh akan mengembalikan nilai 8 karena browser membaca source awal lagi.
Memilih Elemen Berdasarkan Data Attribute
Salah satu keuntungan praktis data attributes adalah kemampuannya bekerja dengan selector atribut. Untuk melihat kasus yang lebih realistis, tambahkan kartu kedua setelah article pertama, tetapi sebelum paragraf output. Kartu kedua memiliki kategori berbeda. Kemudian tambahkan tombol filter di bawah kedua kartu. Pada script dari langkah 4, deklarasikan tombol filter dan tambahkan listener berikut. querySelectorAll('[data-category="buku"]') menghasilkan kumpulan elemen yang cocok; kita kemudian mengubah properti hidden pada kartu produk berdasarkan kategori. Dalam proyek besar, class juga bisa menjadi mekanisme tampilan yang baik, tetapi contoh ini sengaja menunjukkan bagaimana atribut data dapat menjadi sumber nilai untuk seleksi.
<article
data-product-id="AT-202"
data-category="alat-tulis"
data-stock="12">
<h2>Pensil Mekanik</h2>
<p>Stok tersedia: 12</p>
</article>
<button id="filter-button" type="button">Tampilkan hanya buku</button>
const filterButton = document.getElementById("filter-button");
filterButton.addEventListener("click", () => {
const products = document.querySelectorAll("[data-product-id]");
products.forEach((product) => {
product.hidden = product.dataset.category !== "buku";
});
output.textContent = "Filter kategori buku diterapkan.";
});
Letakkan deklarasi dan listener itu di dalam script yang sama, setelah variabel sebelumnya tersedia. Simpan dan refresh. Sebelum filter, dua produk terlihat; setelah tombol filter diklik, kartu Pensil Mekanik tersembunyi sedangkan produk buku tetap terlihat. Verifikasi tambahan dapat dilakukan di Elements: kartu alat tulis akan memiliki keadaan hidden pada DOM setelah aksi. Selector [data-product-id] berarti “semua elemen yang memiliki atribut ini”, sedangkan pembandingan kategori dilakukan melalui dataset.category. Dengan begitu Anda telah menggunakan data attribute sebagai data terstruktur sederhana sekaligus penanda seleksi.
Membandingkan dataset dengan getAttribute dan Memverifikasi DOM
Langkah terakhir membandingkan dua antarmuka resmi yang dapat membaca nilai sama. Anda tidak perlu mengubah struktur halaman. Tambahkan kode berikut di bagian akhir script yang sudah ada. Kode mengambil ID menggunakan dataset.productId dan getAttribute("data-product-id"), lalu menampilkan hasil perbandingan melalui console. Kita juga menggunakan hasAttribute() untuk memeriksa keberadaan atribut. Ini berguna ketika perbedaan antara “atribut ada” dan “nilai kebetulan kosong” relevan bagi logika aplikasi.
const idFromDataset = card.dataset.productId;
const idFromAttribute = card.getAttribute("data-product-id");
console.log("Nilai sama:", idFromDataset === idFromAttribute);
console.log("Memiliki data-stock:", card.hasAttribute("data-stock"));
Buka DevTools, pilih tab Console, lalu refresh halaman. Untuk source yang masih memakai atribut awal, hasil logika kedua pemeriksaan adalah true. Pesan pertama menunjukkan dataset dan getAttribute() membaca representasi ID yang sama pada kasus ini; pesan kedua memastikan atribut data-stock memang ada. dataset nyaman ketika kode memang mengelola custom data attributes, sedangkan getAttribute(), setAttribute(), hasAttribute(), dan removeAttribute() merupakan API atribut DOM yang lebih umum. Anda tidak perlu memilih satu API untuk seluruh proyek: gunakan bentuk yang membuat maksud operasi paling jelas. Sebagai pemeriksaan akhir, klik tombol detail, kurangi stok, lalu jalankan filter. Detail harus membaca data kartu, stok harus berubah pada DOM dan tampilan, dan hanya kategori buku yang tersisa setelah filter. Jika semua perilaku itu sesuai, contoh telah menguji pembacaan, konversi, penulisan, dan seleksi data attributes.
Verifikasi Akhir dan Parameter Kelayakan
Implementasi yang layak bukan sekadar halaman yang tidak menampilkan error visual. Periksa struktur DOM, tipe data setelah parsing, sinkronisasi perubahan, hasil selector, serta batas keamanan data. Tabel berikut membandingkan kondisi sebelum mekanisme diterapkan dengan target yang dapat diverifikasi melalui browser dan DevTools. Target tersebut tidak bergantung pada framework karena contoh hanya memakai HTML serta Web API standar browser.
| Parameter | Sebelum Menerapkan Metode | Sesudah Menerapkan Metode (Target) |
|---|---|---|
| Identitas data produk | Belum tersedia sebagai custom data attribute. | data-product-id="BK-101" terlihat pada kartu dan dapat dibaca sebagai dataset.productId. |
| Tipe stok untuk perhitungan | Nilai atribut merupakan representasi string. | Nilai dikonversi dengan Number() dan diperiksa dengan Number.isFinite() sebelum aritmetika. |
| Sinkronisasi perubahan | Stok DOM mulai dari 8. | Satu klik pengurangan menghasilkan tampilan 7 dan data-stock="7" pada DOM. |
| Seleksi kategori | Dua kartu produk terlihat. | Setelah filter buku, kartu kategori buku terlihat dan kartu alat-tulis tersembunyi. |
| Batas keamanan | Belum ada aturan penempatan data. | Secret dan keputusan otorisasi tidak ditempatkan atau dipercayakan pada data-*. |
Solusi Masalah di Lapangan (FAQ Teknis)
1. Mengapa element.dataset.product-id tidak bekerja seperti yang saya harapkan?
Nama atribut HTML dan nama properti JavaScript tidak ditulis dengan bentuk yang sama. Untuk atribut sederhana data-product-id, gunakan element.dataset.productId. Dalam ekspresi JavaScript, tanda minus mempunyai makna operator pengurangan, sehingga bentuk dot notation dengan product-id bukan cara mengakses key tersebut. Periksa ejaan atribut terlebih dahulu melalui Elements/Inspector, kemudian periksa nilai element.dataset di Console bila diperlukan. Untuk kode yang mudah dipelihara, gunakan nama data sederhana dan konsisten seperti data-product-id, data-category, dan data-stock. Jika Anda memang perlu mengakses nama atribut secara eksplisit, getAttribute("data-product-id") juga valid.
2. Mengapa penjumlahan stok menghasilkan teks seperti 81, bukan angka 9?
Nilai yang dibaca dari dataset adalah string. Jika Anda melakukan operasi yang melibatkan string dengan operator +, JavaScript dapat melakukan konkatenasi sehingga "8" + 1 menghasilkan string "81". Konversikan dahulu dengan Number(element.dataset.stock), lalu validasi sesuai domain data. Tutorial menggunakan Number.isFinite() untuk menolak hasil yang bukan bilangan finite. Jika nilai wajib berupa bilangan bulat non-negatif, aplikasi nyata dapat menambahkan pemeriksaan Number.isInteger() dan batas minimum. Verifikasi paling sederhana adalah memeriksa hasil operasi: stok 8 ditambah satu harus bernilai numerik 9 sesuai kebutuhan aplikasi.
3. Mengapa perubahan dataset hilang setelah halaman di-refresh?
Penugasan seperti card.dataset.stock = 7 mengubah elemen pada DOM dokumen yang sedang berjalan; operasi tersebut tidak mengedit file HTML asli dan tidak otomatis menyimpan nilai ke server. Saat refresh, browser memuat dokumen lagi dan data-stock="8" dari source menjadi nilai awal. Jika aplikasi perlu persistensi, Anda memerlukan mekanisme penyimpanan yang sesuai, misalnya backend/database, atau Web Storage untuk kasus data klien yang memang cocok dengan karakteristik dan batas keamanannya. Untuk memverifikasi perbedaan ini, ubah stok melalui tombol, lihat atribut menjadi 7 pada DevTools, lalu refresh dan lihat atribut kembali menjadi 8.
4. Bolehkah saya menyimpan JSON, token, atau data besar dalam data-*?
Secara teknis nilai atribut adalah teks dan aplikasi dapat menetapkan teks yang kemudian diparse sendiri, tetapi kemampuan tersebut tidak berarti semua data cocok ditempatkan di markup. Data kompleks atau besar dapat membuat markup sulit dibaca dan menambah data yang harus dibawa dokumen. Yang lebih penting, token rahasia, credential, dan nilai keamanan tidak aman hanya karena ditempatkan pada data-*; pengguna dapat memeriksa dan mengubah DOM. Gunakan data attributes untuk metadata sisi klien yang kecil dan terkait langsung dengan elemen. Jika sebuah nilai berasal dari data tak tepercaya dan akan ditampilkan, jangan menganggap data-* telah melakukan sanitasi; gunakan API output yang sesuai seperti textContent ketika yang dibutuhkan memang teks.
Kesimpulan dan Rencana Aksi
Custom data attributes menyediakan jembatan standar antara markup HTML dan data khusus yang dibutuhkan perilaku antarmuka. Pola dasarnya sederhana: definisikan atribut berawalan data-, beri nama yang menjelaskan tujuan, baca melalui dataset atau API atribut DOM, lalu konversikan string apabila logika membutuhkan tipe lain. Anda juga dapat mencari elemen menggunakan selector atribut dan memperbarui atribut melalui dataset, dengan memahami bahwa perubahan DOM tidak otomatis persisten. Setelah menyelesaikan latihan, rencana aksi yang berguna adalah mengulang contoh dengan dua atau tiga jenis metadata milik proyek Anda sendiri, kemudian periksa semuanya melalui Elements dan Console. Pertahankan batas desainnya: gunakan atribut HTML standar ketika atribut standar memang mewakili informasi tersebut, tampilkan informasi yang perlu dilihat pengguna sebagai konten yang tepat, dan jangan mengandalkan data-* untuk secret ataupun keputusan keamanan. Dengan prinsip tersebut, data-* menjadi alat yang kecil tetapi efektif untuk menghubungkan elemen, metadata, selector, dan JavaScript tanpa menambahkan dependency yang sebenarnya tidak diperlukan.
Ditulis dan diedit oleh Ahmad Ismail Al Malik
