1

リスナーが呼び出されたスコープ外でリスナーをオフにできるかどうかわからなかったので、小さなテスト コードを作成しました。より長く動作するようです。

var testobj = {
    init: function() {
        testobj.listener();
    },

    listener: function() {

        $(document).on('mousedown', function() {
            testobj.listener_off();
                console.log("on");
        });


    },

    listener_off: function() {
        $(document).on('mouseup', function() {
            $(document).off('mousedown', function() {
                console.log("off");
            });
        });
    }
}

$(function() {
    testobj.init();
});

jsfiddle

繰り返しになりますが、問題は次のとおりです。

$(document).off('mousedown', function() {
    console.log("off");
});

使用中にコードが壊れているようです:

$(document).off('mousedown');

うまく機能しているようです。

さらに、複数のイベント リスナー (特に同じイベントに反応するもの) を扱う場合、それらをオンまたはオフにするためのベスト プラクティスと見なされるものは何ですか? それらを別々の関数に分けて、後で呼び出されるようにしたり、問題を引き起こす可能性があるのは正しいですか?

4

2 に答える 2

1

に関数を渡すと、.off()その特定のハンドラを削除したいということになります。新しくインスタンス化された匿名関数を渡しているため、それはイベントのハンドラーではないため、正味の効果はありません

この形式は.off()、変数名やオブジェクトのプロパティ名などの参照先のハンドラー関数がある場合に意味があります。イベントハンドラー、そして設定を解除したいときにもう一度:

function someHandler(ev) {
  // handle handle handle ...
}

// ...

$('#foo').on('click', someHandler);

// ...

if (itsChristmasTime()) {
  $('#foo').off('click', someHandler);
}

あなたの場合、イベント名だけを渡して、引数が 1 つのバージョンが必要なだけです。イベント ハンドラーを追跡する別の方法は、イベント名に修飾子を使用することです。JQuery は "." を探します。イベント名の "." は無視されます。イベント処理の目的でサフィックスを付けますが、完全に忘れるわけではありません。したがって、使用中の特定の関数を追跡する必要なく、ハンドラーを識別するためにそれを使用できます。

$('#foo').on('click.remove-me', function(ev) { ... });

// ...

if (itsChristmasTime()) {
  $('#foo').off('click.remove-me');
}

そうすれば、ウィジェットの動作のさまざまな側面に対して個別の「クリック」ハンドラーを維持し、そのうちの 1 つまたは一部のみを選択的に削除できます。

于 2013-11-03T18:50:00.803 に答える
1

これは、関数の 2 番目の引数として関数を渡すときに、登録されたものと同じ関数インスタンスであるoff必要があるためです。

基本的に、以下は機能しません。

$(myDiv).on('click', function () {});
$(myDiv).off('click', function () {});

しかし、これは:

function clickHandler() {}

$(myDiv).on('click', clickHandler);
$(myDiv).off('click', clickHandler);

2番目のパラメーターなしで呼び出すとoff、その特定のイベントのすべてのリスナーが削除されます。そのため、あなたのケースで機能しています。

于 2013-11-03T18:50:01.240 に答える