- Artikel ini membahas penguasaan manipulasi Document Object Model (DOM) menggunakan JavaScript vanilla.
- Meski alat modern seperti Angular, VueJS, React, Solid, dan Svelte banyak digunakan, artikel ini menekankan pentingnya memahami DOM API browser untuk pengembangan web.
- Penulis menyediakan kumpulan materi yang mencakup API browser dasar, contoh yang mudah dipahami, demo langsung, tips dan praktik terbaik, kasus penggunaan nyata, serta kompatibilitas dengan browser modern dan Internet Explorer.
- Materi tersebut dibagi menjadi tiga level: dasar, menengah, dan lanjutan.
- Level dasar mencakup tugas seperti mengubah favicon secara dinamis sesuai preferensi skema warna pengguna, menghitung waktu baca halaman web, dan memperbarui variabel root CSS secara dinamis.
- Level menengah mencakup tugas seperti menghapus indentasi di area teks menggunakan kombinasi tombol Shift+Tab, masuk ke mode layar penuh, dan membangun input spin.
- Level lanjutan mencakup tugas seperti membuat kursor kustom, menyanitasi string HTML, dan membuat scrollbar kustom.
- Penulis juga memberikan tips seperti menghindari pergeseran layout saat membuka modal, serta mendapatkan kotak pembatas dari node teks.
- Artikel ditutup dengan ajakan untuk berlangganan newsletter penulis tentang konten teknologi frontend.
1 komentar
Opini Hacker News
Daftar contohnya bagus, dan bahkan hanya dengan melihat sekilas beberapa saja, ketelitian dan detailnya terasa mengejutkan
Saat berpindah dari platform seperti React ke implementasi yang lebih kecil dan minimal, saya sering buntu soal bagaimana menangani pola yang kompleks dengan JS standar. Namun ketika melihat kodenya, kadang terasa, “ternyata jauh lebih mudah daripada meneruskan banyak sekali properti ke library raksasa.”
Bahkan framework JS minimal pun, ketika permintaan fitur yang tampak polos menumpuk, pada akhirnya mudah berubah menjadi monster berisi hook, event, dan tambalan side effect
Sekarang saya bahkan tidak memakai jQuery, dan hal seperti ES module memang saya pakai untuk merapikan kode, tetapi tidak perlu sampai menjalankan perintah npm. Ini bukan barang yang harus ditarik sebagai vendor dependency, melainkan standar browser global
Belakangan ini saya menganggap MDN seperti kitab suci. Jika diikuti dengan percaya, hampir selalu membawa kita sampai akhir, sementara framework justru mulai menghambat di titik tertentu. Lima tahun lalu belum sampai seperti ini, tetapi API browser cepat berkonvergensi ke elemen dasar yang kuat dan konsisten seperti module, flexbox, dan grid
Misalnya, sebagian besar contoh di artikel asli lebih dekat dengan kode yang tetap harus ditulis sendiri meskipun memakai React
Sebagai proyek sampingan, saya sedang membuat sesuatu yang belum bernama, semacam “vim untuk desainer web”. Seperti Webflow, ini membuat website atau komponen di browser, tetapi semuanya digerakkan oleh bahasa perintah
Awalnya saya bertekad melakukannya tanpa framework. Saya sudah mengerjakan hal ini sejak 2009 dan sudah lama memakai JS sebelum menyentuh framework, jadi saya pikir native DOM API sudah cukup
Namun memindahkan data masuk dan keluar dari DOM terlalu membosankan dan rawan salah, sehingga demi kesehatan mental, akhirnya saya mulai menulis mini-framework sendiri. Baru saat itu saya teringat alasan awal orang mulai memakai framework. Pada akhirnya, kita akan memakai framework dalam bentuk apa pun; bedanya hanya apakah itu buatan sendiri yang khusus, atau standar industri buatan komunitas
Untuk situs dengan sedikit interaksi, native DOM juga bagus, dan sebagian besar situs yang memakai React sebenarnya mungkin tidak membutuhkannya. Namun jika produk punya sedikit saja nuansa atau kompleksitas, saya akan memakai framework dan menghindari kerepotannya. Pada akhirnya saya pindah ke Svelte dan jauh lebih puas
Untuk website yang membutuhkan interaksi, manipulasi DOM bisa menjadi pilihan yang lebih baik karena memakai teknologi yang lebih fundamental dan universal, proses build-nya ringan atau tidak ada, eksekusinya cepat, dan eksplisit
Tentu ada banyak area abu-abu, tetapi kasus ini tepat masuk kategori ketika framework memberikan keuntungan
value.startsWith('javascript:')saja menimbulkan celah. Karena URL bisa diawali whitespace sembarang, setidaknya perluvalue.trim().startsWith('javascript:')Meski begitu, menurut saya allowlist lebih baik daripada blocklist. Cukup izinkan
http:,https:, dan jika perlumailto:,ftp:,sftp:, sementara URL relatif yang diawali/mungkin bisa diizinkanNamun karena semua atribut yang benar-benar bisa menjadi URL harus ditangani dengan tepat, pada akhirnya mungkin lebih baik hanya mengizinkan beberapa tag beserta atributnya
['http:', 'https:', 'mailto:', 'tel:'].includes(new URL(value, location.origin).protocol)[1] https://caniuse.com/url
Artikel ini tidak boleh memberi kesan bahwa sanitasi HTML semudah itu. Memang di bagian akhir disebutkan https://github.com/cure53/DOMPurify, tetapi menurut saya seharusnya jauh lebih tegas mengatakan jangan mencoba menulis sendiri hal semacam ini dan cukup merekomendasikan DOMPurify saja
Saya membuka issue untuk masalah ini: https://github.com/phuocng/html-dom/issues/281
Ini terlihat seperti daftar yang berguna untuk diketahui, dan meski belum melihat semuanya, sejauh ini tampak oke
Saat membuka contoh pertama, terlihat
window.matchMedia('(prefers-color-scheme: dark)')dijalankan dua kali tanpa perluJika
setFaviconakan dipakai sebagai callback event listener, cukup gunakanevent.matchesdari parametereventyang diteruskan ke callbackSecara pribadi, saya lebih suka menanganinya di HTML, karena itu juga mendukung pengguna yang mematikan JS
https://phuoc.ng/collection/html-dom/change-the-favicon-dyna...
theme-color; ini fitur bagus yang jarang dipakai, bahkan oleh developer PWA yang peduli detailTeknik “textarea yang meluas otomatis” mulai usang karena properti CSS baru form-sizing
https://chriscoyier.net/2023/09/29/css-solves-auto-expanding...
Bahkan tanpa memakai properti CSS baru ini, cara menyesuaikan
heightelemen tidak ideal dan bisa terasa tersendatPendekatan yang lebih baik adalah memakai elemen cermin yang disembunyikan
https://css-tricks.com/the-cleanest-trick-for-autogrowing-te...
Cukup banyak hal di sini memakai API lama dan canggung, padahal ada API native yang lebih baik
Misalnya “mengganti elemen” ditulis sebagai
ele.parentNode.replaceChild(newEle, ele);, tetapi kalau tidak menargetkan Chrome di bawah 54, Firefox di bawah 49, atau Safari di bawah 10, cukup pakaiele.replaceWith(newEle)replaceWith juga bisa mengganti satu node dengan beberapa node atau teks
Demikian pula untuk “mengiterasi NodeList”, disarankan memakai spread array lalu
forEach, tetapi cukupfor (let ele of nodelist) ...Bagus. Sudah saya bookmark. Ada juga materi bagus dengan nuansa serupa: https://youmightnotneedjquery.com/
Saya tidak sering mengerjakan web, tetapi setiap kali melakukannya, kelebihan framework di dunia itu benar-benar mematahkan semangat. Proyek React baru yang dimulai dengan ratusan dependency sudah di luar kendali, dan beratnya kompleksitas itu mengejutkan
Sebaliknya, teknologi browser lintas platform bawaan kini lebih kuat dari sebelumnya, dan jumlah kode untuk tugas umum juga tidak terlalu banyak
Para developer frontend, kalian baik-baik saja?
Misalnya manajemen state aplikasi dan routing adalah bagian besar yang harus diimplementasikan sendiri kalau hanya memakai DOM API murni
Tergantung kompleksitas aplikasi, ini mungkin bukan masalah besar, tetapi begitu melewati aplikasi dasar, nilai fitur tambahan seperti ini cepat meningkat. Namun kalau yang dipakai membutuhkan NPM, urusannya jadi merepotkan
Sebagai developer frontend yang menyukai platform dasar dan fiturnya, saya senang melihat hal-hal bagus hadir, seperti CSS bersarang, container queries, dan pengalaman JS yang secara umum membaik sejak ES6
Pada saat yang sama, saya juga heran karena terlalu banyak orang memakai komponen bahkan untuk hal sepele seperti tombol atau teks tebal
Saya menyukai framework itu sendiri, tetapi banyak pemasaran framework dan library bersandar pada keyakinan bahwa CSS dan manipulasi DOM murni itu luar biasa sulit, sementara menarik paket apa saja dari NPM bukan hanya cepat dan mudah, tetapi juga pekerjaan yang profesional
Lihat saja Kubernetes, Helm, Terraform, CircleCI; jumlah istilah yang bertumpuk-tumpuk itu tidak masuk akal
Saya benar-benar terkejut saat mengetahui bahwa beberapa fungsi DOM mengembalikan live HTMLCollection yang diperbarui otomatis
Saya penasaran seberapa aktif fitur ini dipakai dalam kode produksi nyata sebelum demam framework, atau sekitar saat tren kembali mengembangkan tanpa framework mulai sedikit populer lagi
Yang lama menjadi baru lagi. Peran frontend pertama saya pada 1999 adalah membuat aplikasi web
Fitur-fitur keren seperti drag-and-drop tree view, klik untuk mengedit, bahkan sesuatu yang pada dasarnya seperti single-page app, semuanya dibuat dengan JS “Vanilla”
Bagian tersulit adalah menyelaraskan perbedaan antara Netscape dan Internet Explorer
Kenapa sekarang kita terlihat seperti tidak tahu cara melakukannya ;]
Fitur JavaScript murni favorit saya belakangan ini adalah Element.insertAdjacentHTML, yang sudah ada sejak Chrome 1.0 dan masa IE
Mengatakan bahwa fitur ini berguna, terutama bersama string multi-baris dengan backtick, masih kurang menggambarkan manfaatnya. Sulit dipercaya fitur ini sudah ada begitu lama dan saya baru mengetahuinya sekitar setahun lalu
insertAdjacentHTML(position, text)mem-parse teks yang ditentukan sebagai HTML atau XML, lalu menyisipkan node hasilnya ke posisi yang ditentukan di pohon DOMKalau hanya memakai DOM biasa, kita harus membuat elemen
li, membuat elemena, menambahkannya sebagai anak, mengatur atributhref, memasukkan nilai teks, lalu menyisipkannya keul. Atau mengumpulkannya sebagai string besar dan memasukkannya denganinnerHTML, sementara memodifikasi daftar yang sudah ada akan lebih menyakitkan dan bertele-tele