Membuat roda scroll cepat secara default

Sahel Sharify
Sahel Sharify

Untuk meningkatkan performa scroll/zoom wheel, developer dianjurkan untuk mendaftarkan pemroses peristiwa wheel dan mousewheel sebagai pasif dengan meneruskan opsi {passive: true} ke addEventListener(). Mendaftarkan pemroses peristiwa sebagai pasif memberi tahu browser bahwa pemroses roda tidak akan memanggil preventDefault() dan browser dapat melakukan scroll dan zoom dengan aman tanpa memblokir pemroses.

Masalahnya adalah bahwa sering kali pemroses peristiwa roda secara konsep pasif (tidak memanggil preventDefault()) tetapi tidak ditentukan secara eksplisit sebagai tersebut, sehingga browser harus menunggu penanganan peristiwa JS selesai sebelum mulai men-scroll/memperbesar meskipun menunggu tidak diperlukan. Di Chrome 56, kami memperbaiki masalah ini untuk touchstart dan touchmove, dan perubahan tersebut kemudian diadopsi oleh Safari dan Firefox. Seperti yang dapat Anda lihat dari video demonstrasi yang kami buat pada saat itu, membiarkan perilaku seperti itu akan menghasilkan penundaan yang signifikan dalam respons scroll. Sekarang di Chrome 73, kami telah menerapkan intervensi yang sama ke peristiwa wheel dan mousewheel.

Intervensi

Sasaran kami dengan perubahan ini adalah untuk mengurangi waktu yang diperlukan untuk memperbarui tampilan setelah pengguna mulai men-scroll dengan roda atau touchpad tanpa perlu developer mengubah kode. Metrik kami menunjukkan bahwa 75% pemroses peristiwa wheel dan mousewheel yang terdaftar di target root (jendela, dokumen, atau isi) tidak menentukan nilai apa pun untuk opsi pasif dan lebih dari 98% pemroses tersebut tidak memanggil preventDefault(). Di Chrome 73, kami mengubah pemroses wheel dan mousewheel yang terdaftar di target root (jendela, dokumen, atau isi) menjadi pasif secara default. Artinya, pemroses peristiwa seperti:

window.addEventListener("wheel", func);

menjadi setara dengan:

window.addEventListener("wheel", func, {passive: true});

Dan memanggil preventDefault() di dalam pemroses akan diabaikan dengan peringatan DevTools berikut:

[Intervention] Unable to preventDefault inside passive event listener due
to target being treated as passive. See https://www.chromestatus.com/features/6662647093133312

Kerusakan dan Panduan

Dalam sebagian besar kasus, tidak akan ada kerusakan. Hanya dalam kasus yang jarang terjadi (kurang dari 0,3% halaman menurut metrik kami), scroll/zoom yang tidak disengaja mungkin terjadi karena panggilan preventDefault() diabaikan di dalam pemroses yang diperlakukan sebagai pasif secara default. Aplikasi Anda dapat menentukan apakah aplikasi mungkin mengalami hal ini di dunia nyata dengan memeriksa apakah pemanggilan preventDefault() memiliki efek apa pun melalui properti defaultPrevented. Perbaikan untuk kasus yang terpengaruh relatif mudah: teruskan {passive: false} ke addEventListener() untuk mengganti perilaku default dan mempertahankan pemroses peristiwa sebagai pemblokiran.