イベントハンドラーを「パッシブ」としてマークして、ページの応答性を高めることを検討してください


217

ドラッグにハンマーを使用していますが、この警告メッセージが私に伝えているように、他のものをロードするときにハンマーが途切れます。

メインスレッドがビジー状態のため、 'touchstart'入力イベントの処理がXミリ秒遅れました。ページの応答性を高めるために、イベントハンドラーを「パッシブ」としてマークすることを検討してください。

だから私はそのようにリスナーに「パッシブ」を追加しようとしました

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

しかし、私はまだこの警告を受けています。

回答:


264

この警告を初めて受け取った人にとっては、かなり最近(夏2016)ブラウザーに実装されたパッシブイベントリスナーと呼ばれる最先端の機能が原因です。https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.mdから:

パッシブイベントリスナーはDOM仕様の新機能であり、開発者はタッチとホイールのイベントリスナーをスクロールする必要がないため、スクロールパフォーマンスを向上させることができます。開発者は、タッチリスナーとホイールリスナーに{passive:true}の注釈を付けて、preventDefaultを呼び出さないことを示すことができます。この機能はChrome 51、Firefox 49に同梱され、WebKitに搭載されました。完全な公式説明については、こちらをご覧ください。

参照:パッシブイベントリスナーとは

.jsライブラリがサポートを実装するのを待つ必要があるかもしれません。

JavaScriptライブラリーを介して間接的にイベントを処理している場合、その特定のライブラリーがこの機能をサポートしていることに気付く場合があります。2019年12月の時点では、主要なライブラリのいずれもサポートを実装していないようです。いくつかの例:


16
イオンライブラリはどうですか?
16

10
私は電話していますpreventDefault()-この警告を抑制することは可能ですか?
maja 2017年


12
Google Maps JavaScript APIバージョン3もこれらの警告を生成します。問題はissuetracker.google.com/issues/63211698で追跡されています。(皮肉なことに、Google ChromeはGoogle Maps JavaScript APIが生成する違反について警告していると考えています。)
Jochem Schulenklopper

6
この警告を抑制するには、 `addEventListener( 'touchstart'、this.callPassedFuntion、{passive:false})`
Shlomi Schwartz

8

これにより、警告メッセージが非表示になります。

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

5
実際のイベントを止めることが目的ではないでしょうか?問題を処理するまでメッセージを非表示にしたくありません。
yardpenalty.com

1
jqueryライブラリの問題だと思います。開発者はそれを修正する必要があると思います。でも、もしそれが手に入るなら、どうしたらいいか教えてください。どうもありがとうございます。
イヴァンロドリゲス

確かにイワン!はい、そうです。ねえ、今私は気になります...私はd3プラグインを使用していて、2300違反のようになっています。多分あなたのコードが役立ちます!投稿し続けます!
yardpenalty.com 2019

@ yardpenalty.com、いいえ、イベントを停止することは目標ではありません!警告は、イベントのデフォルトの動作を妨げるかどうかを指定せずにリスナーを配置したことを示しています。呼び出すケースがある場合はpreventDefault()、指定する必要がありますpassive: false。そうでない場合は、を指定しますpassive: true。どちらも指定しない場合にのみ警告が表示されます。指定passive: truepreventDefault()て呼び出された場合、エラーが発生し、デフォルトは防止されません。passiveここでの指定はハックではありません。それが解決策です。それは警告が要求するものです!
tao

@taoコメントありがとうございます。数年経ちましたが、今後の解決策は間違いなく覚えています!
yardpenalty.com

1

Laravelのselect2ドロップダウンプラグインでもこれに遭遇します。からアルフレッドウォレスによって提案された値を変更する

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

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

問題を解決します。なぜ彼が反対票を投じたのか、私にはわかりませんが、それは私には有効です。


0

レガシー問題で立ち往生している人のために、エラーをスローしている行を見つけて追加してください{passive: true}-例:

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

なる

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

-1

jQuery 3.4.1スリムで動作するソリューションを見つけました

縮小後、次の{passive: true}ように1567行でaddEventListener関数に追加します。

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

何も壊れておらず、灯台の監査はリスナーについて不満を言っていません。


1
ライブラリのソースコードを変更しないでください。代わりにオーバーライドする必要があります。
ラプター
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.