Varsayılan olarak tekerlek kaydırmasını hızlı yapma

Sahel Sharify
Sahel Sharify

Geliştiricilerin wheel kaydırma/yakınlaştırma performansını iyileştirmek için {passive: true} seçeneğini addEventListener() öğesine geçirerek wheel ve mousewheel etkinlik işleyicilerini pasif olarak kaydetmeleri önerilir. Etkinlik işleyicilerin pasif olarak kaydedilmesi, tarayıcıya, tekerlek işleyicilerin preventDefault() çağrısı yapmayacağını ve tarayıcının işleyicileri engellemeden kaydırma ve yakınlaştırmayı güvenli bir şekilde gerçekleştirebileceğini belirtir.

Sorun, tekerlek etkinliği işleyicilerin çoğu zaman kavramsal olarak pasif olmasıdır (preventDefault() çağrısı yapmayın). Ancak bunun açıkça belirtilmediğinden, tarayıcının kaydırmaya/yakınlaştırmaya başlamadan önce, gerekli olmamasına rağmen JS etkinlik işlemesinin tamamlanmasını beklemesi gerekir. Chrome 56'da touchstart ve touchmove için bu sorunu düzelttik ve bu değişiklik daha sonra hem Safari hem de Firefox tarafından benimsendi. O sırada hazırladığımız tanıtım videosundan görebileceğiniz gibi, davranış kaydırma yanıtında fark edilebilir bir gecikmeye yol açmıştı. Artık Chrome 73'te, aynı müdahaleyi wheel ve mousewheel etkinliklerine uyguladık.

Müdahale

Bu değişiklikle amacımız, kullanıcı tekerleği veya dokunmatik alanı kaydırmaya başladıktan sonra geliştiricilerin kod değiştirmeye gerek kalmadan ekranı güncelleme süresini azaltmak. Metriklerimiz, kök hedeflere (pencere, doküman veya gövde) kayıtlı olan wheel ve mousewheel etkinlik dinleyicilerinin% 75'inin pasif seçenek için herhangi bir değer belirtmediğini ve bu işleyicilerin% 98'inden fazlasının preventDefault() çağrısını yapmadığını gösteriyor. Chrome 73'te, kök hedeflere (pencere, doküman veya gövde) kayıtlı wheel ve mousewheel işleyicilerini varsayılan olarak pasif olacak şekilde değiştiriyoruz. Bu, bir etkinlik işleyicinin şun gibi:

window.addEventListener("wheel", func);

şuna eşdeğer hale gelir:

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

İşleyicinin içinde preventDefault() çağrısı, aşağıdaki Geliştirici Araçları uyarısıyla birlikte yoksayılacak:

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

Kırılma ve Yönlendirme

Vakaların büyük çoğunluğunda herhangi bir kesinti yaşanmayacaktır. Nadir durumlarda (metriklerimize göre sayfaların% 0,3'ünden azı), preventDefault() çağrısının varsayılan olarak pasif kabul edilen işleyiciler içinde yoksayılması nedeniyle istenmeyen kaydırma/yakınlaştırma gerçekleşebilir. Uygulamanız, preventDefault() çağrısının defaultPrevented özelliği üzerinden herhangi bir etkisi olup olmadığını kontrol ederek bu sonucun rastgele belirlenip etkilenmediğini belirleyebilir. Etkilenen destek kayıtları için düzeltme işlemi nispeten kolaydır: Varsayılan davranışı geçersiz kılmak ve etkinlik işleyiciyi engelleme olarak korumak için {passive: false} öğesini addEventListener() işlevine iletin.