Sayfayı daha duyarlı hale getirmek için etkinlik işleyiciyi 'pasif' olarak işaretlemeyi düşünün


217

Sürüklemek için çekiç kullanıyorum ve bu uyarı mesajı bana söylediği için diğer şeyleri yüklerken dalgalı oluyor.

Ana temas meşgul olduğundan X ms için 'touchstart' giriş olayının işlenmesi gecikti. Sayfayı daha duyarlı hale getirmek için olay işleyiciyi 'pasif' olarak işaretlemeyi düşünün.

Bu yüzden dinleyiciye 'pasif' eklemeye çalıştım

Hammer(element[0]).on("touchstart", function(ev) {
  // stuff
}, {
  passive: true
});

ama hala bu uyarıyı alıyorum.

Yanıtlar:


265

Bu uyarıyı ilk kez alanlar için, son zamanlarda tarayıcılarda oldukça yakın bir zamanda (2016 yazında) uygulanan Pasif Olay Dinleyicileri adlı bir kanayan kenar özelliğinden kaynaklanmaktadır . Gönderen https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md :

Pasif olay dinleyicileri , DOM özelliklerinde, geliştiricilerin dokunma ve tekerlek olay dinleyicilerini engellemek için kaydırma ihtiyacını ortadan kaldırarak daha iyi kaydırma performansına katılmalarını sağlayan yeni bir özelliktir. Geliştiriciler, dokunma ve tekerlek dinleyicilerine hiçbir zaman preventDefault'u çağırmayacaklarını belirtmek için {pasif: doğru} ile açıklama ekleyebilir. Bu özellik Chrome 51, Firefox 49'da gönderildi ve WebKit'e indi. Tam resmi açıklama için buradan daha fazla bilgi edinebilirsiniz.

Ayrıca bakınız: Pasif olay dinleyicileri nelerdir?

.Js kitaplığınızın destek vermesini beklemeniz gerekebilir.

Olayları dolaylı olarak bir JavaScript kütüphanesi aracılığıyla yönetiyorsanız, söz konusu kütüphanenin bu özelliği desteklemesinin insafına olabilirsiniz. Aralık 2019 itibariyle, büyük kütüphanelerin hiçbirinin destek uyguladığı görülmüyor. Bazı örnekler:


16
İyonik kütüphaneler ne olacak?
abhit

10
Ben arıyorum preventDefault()- Bu uyarıyı bastırmak mümkün mü?
maja


12
Google Haritalar JavaScript API sürüm 3 de bu uyarıları oluşturur. Sorun issuetracker.google.com/issues/63211698 adresinden takip ediliyor . (Google Chrome'un Google Haritalar JavaScript API'sının oluşturduğu ihlaller konusunda uyarı verdiğini düşünerek bir tür ironik.)
Jochem Schulenklopper

6
bu uyarıyı bastırmak için `` addEventListener ('touchstart', this.callPassedFuntion, {passive: false}) ``
Shlomi Schwartz

9

Bu, uyarı mesajını gizler:

jQuery.event.special.touchstart = {
  setup: function( _, ns, handle ) {
      this.addEventListener("touchstart", handle, { passive: !ns.includes("noPreventDefault") });
  }
};

6
Amaç gerçek olayı durdurmak değil miydi? Sorunu çözene kadar mesajı gizlemek istemem.
yardpenalty.com

1
Bence bu bir jquery kütüphanesi meselesi. Bence geliştiriciler bunu düzeltmek zorunda. Ama eğer alacaksanız, lütfen nasıl yapılacağını bana bildirin. Çok teşekkür ederim.
Iván Rodríguez

Kesinlikle Ivan! Evet öyle. Hey, şimdi merak ediyorum ... d3 eklentisini kullanıyorum ve 2300 ihlal gibi oluyorum. Belki kodunuz yardımcı olacaktır! Seni haberdar edeceğim!
yardpenalty.com

@ yardpenalty.com, hayır, etkinliği durdurmak hedef değil! Uyarı, dinleyicinizi olaydaki varsayılan davranışı engelleyip engellemeyeceğini belirtmeden yerleştirdiğinizi belirtir. Aramak istediğiniz vakalarınız varsa preventDefault()belirtmelisiniz passive: false. Değilse, belirtin passive: true. Uyarıyı yalnızca siz de belirtmezseniz alırsınız. Belirtir passive: trueve preventDefault()çağrılırsanız, hata oluşur ve varsayılan değer engellenmez. Belirtmek passiveburada bir hack değil. Bu çözüm . Uyarının istediği bu!
tao

@tao Yorumunuz için teşekkürler. Birkaç yıl oldu ama gelecekte çözümü kesinlikle hatırlayacağım!
yardpenalty.com

1

Ayrıca Laravel'deki select2 açılır eklentisiyle de karşılaşın. Alfred Wallace tarafından önerilen değeri

this.element.addEventListener(t, e, !1)

için

this.element.addEventListener(t, e, { passive: true} )

sorunu çözer. Neden aşağı oyu var, bilmiyorum ama benim için çalışıyor.


0

Eski sorunlara sahip olanlar için hatayı atan satırı bulun ve ekleyin {passive: true}- ör:

this.element.addEventListener(t, e, !1)

olur

this.element.addEventListener(t, e, { passive: true} )

0

Jquery-ui-touch-punch ile jquery-ui-dragable için Iván Rodríguez'e benzer şekilde düzelttim, ancak touchmove için bir olay daha geçersiz kılma ile:

jQuery.event.special.touchstart = {
    setup: function( _, ns, handle ) {
        this.addEventListener('touchstart', handle, { passive: !ns.includes('noPreventDefault') });
    }
};
jQuery.event.special.touchmove = {
    setup: function( _, ns, handle ) {
        this.addEventListener('touchmove', handle, { passive: !ns.includes('noPreventDefault') });
    }
};

-1

JQuery 3.4.1 slim üzerinde çalışan bir çözüm buldum

Küçültme işleminden sonra, {passive: true}1567 satırındaki addEventListener işlevine şöyle ekleyin :

t.addEventListener(p, a, {passive: true}))

Hiçbir şey molalar ve deniz feneri denetimleri dinleyicilerden şikayetçi değil.


2
asla bir kütüphanenin kaynak kodunu değiştirmeyin; bunun yerine geçersiz kılmalısınız.
Raptor
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.