0

現在、いくつかのセレクターで動作する event.stopPropagation() がありますが、これらの要素は ajax 要求の後に置き換えられるため、これらのセレクターを引数として .on() に渡す必要があります。

ここに画像の説明を入力

これは私が持っていて機能するものです(ただし、ajaxがセレクター要素を置き換えると壊れます):

$('.addSetMenu input, .addSetMenu select, .addSetMenu').on('click', function(event) {
    return event.stopPropagation();
});

ajax リクエストはこれらの要素をすべて置き換えるため、セレクターを引数として .on() にデータとして渡そうとしていますが、正しく機能していないようです。

   $(document).on('click', '.addSetMenu input, .addSetMenu select, .addSetMenu', function(event) {
     return event.stopPropagation();
  });
4

1 に答える 1

1

stopPropagation()2番目のコード例では、委任されたイベント処理と組み合わせることはできません。これは、委任されたイベント処理が機能するためにイベント伝播を使用するためです。したがって、イベントがドキュメントオブジェクト(イベントハンドラーによって処理される場所)にバブルアップするまでに、イベントは既に伝播されているため、すでに発生した伝播を停止することはできません。

ここでの本当の解決策は、おそらくあなたが本当に止めようとしていることを理解することです。本当にイベントの伝播を停止する必要がある場合は、コンテンツをajaxに置き換えるたびに、最初のタイプのイベントハンドラーを再バインドする必要があります(重複するイベントハンドラーを取得しないように注意してください)。しかし、あなたが電話で本当に防ごうとしていることを私たちが知っていれば、私stopPropagation()たちはより簡単な解決策を提供できるかもしれません。

あなたのpasteBinの例から判断すると、次の3つの可能性があります。

  1. クリックとstopPropagationを処理するようにコードを変更して、クローズハンドラーの前にある共通の親に変更します。これはおそらくより良い解決策ですが、これが機能するかどうか、正確にどのコードが機能するかを知るには、HTML構造とajaxで動的にロードしているものについてもっと知る必要があります。
  2. クローズハンドラー(pasteBinの例のコード)で、実際のクリックターゲットを調べ、resetMenu()ターゲットがセレクターの項目の1つである場合は呼び出さないでください。.is()イベントターゲットのメソッドを使用して、それを判別できます。
  3. ajaxを介してコンテンツをリロードするたびに、静的バージョン.on()(最初のコード例)を使用してイベントハンドラーを再インストールします。
于 2012-06-27T18:52:00.793 に答える