Kebijakan Chromium pada dialog JavaScript

Histori dialog JavaScript

JavaScript diperkenalkan pada tahun 1995, dan di versi pertama JavaScript, ada metode pada objek jendela bernama alert(), confirm(), dan prompt().

Meski cocok dengan JavaScript pada saat itu, API sinkronnya bermasalah bagi browser modern. Karena mesin JavaScript perlu dijeda hingga respons pengguna diperoleh, dialog JavaScript merupakan modal aplikasi. Dan karena dialog adalah modal aplikasi, dialog tersebut biasanya (dan sayangnya) digunakan untuk merusak pengguna.

Oleh karena itu, tim Chromium sangat menyarankan agar Anda tidak menggunakan dialog JavaScript.

Alternatif

Ada banyak opsi untuk penggantian dialog.

Ada beberapa pilihan untuk alert()/confirm()/prompt(). Untuk memberi tahu pengguna tentang peristiwa (misalnya, kalender situs), Notifications API harus digunakan. Untuk mendapatkan input pengguna, elemen <dialog> HTML harus digunakan. Untuk bukti konsep XSS, console.log(document.origin) devtool dapat digunakan.

Adapun onbeforeunload, perlu diperhatikan bahwa sudah tidak dapat diandalkan. Seperti yang ditunjukkan oleh Ilya Grigorik, “Anda tidak dapat mengandalkan peristiwa pagehide, beforeunload, dan unload untuk diaktifkan di platform seluler”. Jika perlu menyimpan status, Anda harus menggunakan Page Visibility API.

Perubahan

Kemampuan halaman untuk menentukan string onbeforeunload telah dihapus di Chrome 51. (Ini juga dihapus oleh Safari yang dimulai dengan Safari 9.1 dan di Firefox 4.)

Dialog alert()/confirm()/prompt() telah berubah dari modal aplikasi menjadi ditutup saat tabnya dialihkan. Perubahan ini terjadi di semua saluran pada awal Mei 2017.

Dialog beforeunload memerlukan gestur pengguna di halaman agar dapat ditampilkan mulai di Chrome 60. (Hal ini tidak mengubah pengiriman peristiwa beforeunload.) Hal ini selaras dengan Chromium, yang membuat perubahan ini di Firefox 44.

Menampilkan dialog alert()/confirm()/prompt() saat dalam layar penuh akan menyebabkan layar penuh hilang mulai dari Chrome 61.

Dialog prompt() tidak mengaktifkan tabnya. Jika prompt() dipanggil dari tab latar belakang, panggilan akan segera ditampilkan dan tidak ada dialog yang ditampilkan. Perubahan ini berlaku di semua saluran pada awal Mei 2017.

Dialog alert() tidak mengaktifkan tabnya. Jika alert() dipanggil dari tab latar belakang, panggilan akan segera ditampilkan. Tab ditandai dengan indikator dan pengguna akan melihat dialog saat beralih ke tab. Perubahan perilaku ini terlihat mulai Chrome 64.

Dialog confirm() tidak mengaktifkan tabnya. Jika confirm() dipanggil dari tab latar belakang, panggilan akan segera ditampilkan dan tidak ada dialog yang ditampilkan. Perubahan perilaku ini terlihat mulai Chrome 69.

Karena perubahan ini, jika situs Anda menggunakan dialog, sebaiknya Anda beralih menggunakan alternatif yang disebutkan sebelumnya sehingga hal ini tidak akan memengaruhi Anda.