Mulai Chrome versi 135, tombol memperkenalkan `command` dan `commandfor`
(developer.chrome.com)- Tombol sangat penting untuk membangun aplikasi web dinamis. Digunakan untuk membuka menu, mengganti aksi, dan mengirim formulir
- Di Chrome 135, atribut baru
commanddancommandformenyempurnakan sekaligus menggantikan atribut sebelumnyapopovertargetactiondanpopovertarget - Masalah yang muncul saat mengimplementasikan perilaku tombol dengan cara lama:
- Handler
onclickdi HTML bisa dibatasi penggunaannya dalam kode nyata karena kebijakan keamanan (CSP) - Perlu sinkronisasi status antara tombol dan elemen lain, dan kode untuk mengelola status sambil menjaga aksesibilitas menjadi kompleks
- Di React, AlpineJS, Svelte, dan lainnya pun penanganan status serta event tetap kompleks
- Handler
Pola command dan commandfor
- Dengan atribut
commanddancommandfor, tombol dapat bertindak secara deklaratif terhadap elemen lain. Ini memberikan kenyamanan seperti framework sambil tetap mempertahankan fleksibilitas - Tombol
commandformenggunakan ID (mirip atributfor), dancommandmenerima nilai bawaan untuk memberikan pendekatan yang lebih intuitif - Contoh: implementasi tombol buka menu
- Tidak memerlukan aria-expanded maupun JavaScript tambahan
<button commandfor="my-menu" command="show-popover"> Open Menu </button> <div popover id="my-menu"> <!-- ... --> </div>
command dan commandfor vs popovertargetaction dan popovertarget
- Jika Anda pernah menggunakan
popover, Anda mungkin sudah familier dengan atributpopovertargetdanpopovertargetaction - Keduanya bekerja mirip dengan
commandfordancommand, tetapi khusus untuk popover - Atribut baru ini sepenuhnya menggantikan atribut lama sekaligus menyediakan fungsi tambahan
Perintah bawaan
- Atribut
commandmemiliki perilaku bawaan yang dipetakan ke berbagai APIshow-popover: dipetakan keel.showPopover()hide-popover: dipetakan keel.hidePopover()toggle-popover: dipetakan keel.togglePopover()show-modal: dipetakan kedialogEl.showModal()close: dipetakan kedialogEl.close()
- Contoh: implementasi dialog konfirmasi penghapusan
- Status dan aksesibilitas dapat dikelola tanpa JavaScript
<button commandfor="confirm-dialog" command="show-modal"> Delete Record </button> <dialog id="confirm-dialog"> <header> <h1>Delete Record?</h1> <button commandfor="confirm-dialog" command="close" aria-label="Close"> <img role="none" src="/close-icon.svg"> </button> </header> <p>Are you sure? This action cannot be undone</p> <footer> <button commandfor="confirm-dialog" command="close" value="cancel"> Cancel </button> <button commandfor="confirm-dialog" command="close" value="delete"> Delete </button> </footer> </dialog>- Kode penanganan hasil: nilai balikan dapat diproses pada event close dialog
dialog.addEventListener("close", (event) => { if (event.target.returnValue === "cancel") { console.log("Cancel was clicked"); } else if (event.target.returnValue === "delete") { console.log("Delete was clicked"); } });
Perintah kustom
- Selain perintah bawaan, Anda juga dapat mendefinisikan perintah kustom dengan prefiks
-- - Perintah kustom memicu event
"command"pada elemen target, tetapi tidak menjalankan logika tambahan - Contoh: implementasi perintah rotasi gambar
<button commandfor="the-image" command="--rotate-landscape"> Landscape </button> <button commandfor="the-image" command="--rotate-portrait"> Portrait </button> <img id="the-image" src="photo.jpg"> <script type="module"> const image = document.getElementById("the-image"); image.addEventListener("command", (event) => { if (event.command === "--rotate-landscape") { image.style.rotate = "-90deg"; } else if (event.command === "--rotate-portrait") { image.style.rotate = "0deg"; } }); </script>
Penanganan perintah di Shadow DOM
- Di Shadow DOM, karena
commandforbekerja berdasarkan ID, ada batasan berikut:- Referensi elemen antar-Shadow DOM tidak dimungkinkan
- Dalam kasus ini, Anda dapat menggunakan JavaScript API untuk menetapkan properti
.commandForElement
- Contoh: menghubungkan perintah di Shadow DOM
<my-element> <template shadowrootmode="open"> <button command="show-popover">Show popover</button> <slot></slot> </template> <div popover><!-- ... --></div> </my-element> <script> customElements.define("my-element", class extends HTMLElement { connectedCallback() { const popover = this.querySelector('[popover]'); this.shadowRoot.querySelector('button').commandForElement = popover; } }); </script>
Rencana ke depan
- Chrome berencana menambahkan lebih banyak perintah bawaan:
- membuka dan menutup elemen <details>
- dukungan perintah
show-pickerpada <input> dan <select> - perintah pemutaran untuk <video> dan <audio>
- fungsi menyalin teks dari elemen
1 komentar
Opini Hacker News
Para ahli teori bahasa pemrograman telah berspekulasi sejak tahun 80-an tentang "comefrom", versi yang lebih kuat dari "goto". Ini hanya pernah diimplementasikan di intercal. intercal lebih unggul daripada bahasa seperti C dalam hal keamanan, performa, dan ergonomi manusia, tetapi mengalami kesulitan menembus pasar komersial. Menarik melihat javascript mengintegrasikan fitur intercal ini. Semoga ini dapat memicu lonjakan pemrograman yang sopan, seperti halnya objek berbasis closure di javascript mendorong pemrograman fungsional ke arus utama
Invokers bukan hanya milik Chrome. Ini juga sudah tersedia di Firefox nightly
Gagasan menerapkan perilaku UI deklaratif tanpa JS itu menarik
aria-expanded)show-modalmengintegrasikan aksesibilitas ke dalam markup--rotate-landscape) memungkinkan komponen mengekspose API melalui HTMLPertanyaan:
.commandForElementdi antara shadow root. Ini tampak seperti masalah yang baru terselesaikan setengahnyashow-picker,toggle-details), apakah platform akan membengkak dengan sintaks khusus?Spesifikasi:
commandforcommandApakah ini pola action/messaging yang digunakan Next, Be, Apple, dan lainnya sekitar 30 tahun lalu, atau saya melewatkan sesuatu?
Toolkit UI Java awal milik Netscape (IFC) memungkinkan pengaitan elemen action
Atribut
commanddancommandforyang baru memperbaiki dan menggantikan atributpopovertargetactiondanpopovertargetSaya benar-benar alergi terhadap pemrograman dengan string. Saya paham manfaat aksesibilitasnya, tetapi saya tidak terlalu antusias menggunakan ID elemen sebagai lapisan perilaku web app lainnya
Ini seharusnya tidak diimplementasikan tanpa API yang lengkap. Alih-alih sekitar 5 perintah, ini tampak seperti bisa mengimplementasikan semua kemampuan JavaScript melalui HTML. Itu bisa berarti ribuan perintah
Saya sempat berharap tentang command and conquer di HTML
Memperbaiki dan memperluas HTML itu bagus, tetapi jalan masih panjang. Tim HTMX punya beberapa ide yang bagus