17

私のページには、クリックイベントに応答するさまざまな要素がたくさんあります。グローバルフラグに基づいてすべてのクリックをブロックする必要がある場合があります。一元化された場所でこのチェックを行う方法はありますか?

現在、各イベントでフラグを確認しています。例:

var canClick = false; // Global flag

// Sample click event:
$("#someDiv").click(function(){
  if(!canClick) return;

  // Some stuff ...
});

私がやりたいのは、他の要素の 前にすべてのクリックイベントをトラップする1つの要素を持つことです。

ドキュメントで試してみましたが、これらのイベントは他のクリックイベントの後にのみ発生します。

例:

$("#someDiv").click(function(){ console.log("someDiv click"); });

$(document).click(function(){ console.log("Document click"); });

// When I click on the someDiv element it prints:
> someDiv click
> Document click

また、すべての上にフルスクリーンdivを配置し、これを使用してイベントをトラップしようとしましたが、クリックがこのフルスクリーンdivを介して伝播されなかったという問題がありました。また、少しハッキーな感じがするので、クリックをトラップするために余分な要素を作成することに依存したくありません。

jQueryクリック関数を上書きして、そこに小さなチェックを入れることができますか?

私がここで見逃している明らかな何かがありますか?

助けてくれてありがとう。

4

3 に答える 3

24

はい、.addEventListener()を使用して、3番目のオプションをtrueに設定します。これにより、リスナーがキャプチャフェーズにバインドされ、他の何かが実行される前に関数が実行されます。

これにより、すべてのクリックハンドラーの実行が停止する例を次に示します。

document.addEventListener('click', function(e) {
    e.stopPropagation();
}, true);

ここで実際の動作を確認してください。

http://jsfiddle.net/wLwMh/1/

于 2011-05-27T21:03:29.677 に答える
0

すべてのクリックイベントをキャプチャしてから、チェック後にリスナーをバインドするカスタムイベントをトリガーできます。

$("#someDiv").bind('awesomeEvent', function() {
    //do stuff here
}

$(*).click(function() {
    if(canClick) {
        $(this).trigger('awesomeEvent');
    }
}

編集$(*)セレクターを使用することは、パフォーマンスの観点からは良い考えではありません。どういうわけか、本当に範囲を狭めてみるべきです。

于 2011-05-27T20:53:25.080 に答える
0

Inject Javascriptの使用:

view.loadUrl(
                    "javascript:(function() {"


                            + "document.addEventListener('click', function(e)"
                            + "{"
                            + "e.stopPropagation();"
                            + "}"
                            + ", true);"

                            + "})()"
            );
于 2020-01-19T02:50:02.060 に答える