0

簡単に有効化/無効化できるように、jquery でイベントをインテリジェントにバインド解除しようとしています。状態変数を使用する必要はなく、共有関数が非常に乱雑になるため、使用を避けようとしています。これは私が最初に試したもので、うまくいきませんでした。

var dragStart = $('#ruler').mousedown(function(e){
   position = container.offset();
   mousePosition = {
      x: e.pageX,
      y: e.pageY
   };

   var dragging = $(document).mousemove(function(e){
       var x = e.pageX - mousePosition.x;
       var y = e.pageY - mousePosition.y;

       container.offset({
           left: position.left + x,
           top: position.top + y
       });
   });

   var dragStop = $(document).mouseup(function(){
      dragStart.unbind();
      dragging.unbind();
      dragStop.unbind();
   });
});

jQueryのイベントハンドラー関数がセレクター内の要素への参照を返すため、機能しないことがわかりました。そのため、すべてが$(document)からバインド解除されていました。これは私の環境の問題です。

関数名を考え出し、ターゲットを絞ったアンバインドを実行できることはわかっていますが、実行しなければならないすべてのさまざまな関数 (上記で示した以上のもの) を使用すると、コードを実行するのが面倒になります。上記のコードで行っていたものと同様の機能を可能にする方法はありますか? 私はこれに沿って何かを考えていました:

var foo;
$(<selector>).<eventType>(foo = function(){
   // DO SOMETHING
   $(<unbind button>).click(function(){
      // foo.unbind();
      // OR
      // $(<selector>).unbind(foo);
      // ???????
   });
});

私は創造的な解決策に対してもオープンです。私は今それを機能させることができますが、私はこの特定の方法でそれを行うことができるかどうかを確認しようとしています. ありがとう!

4

1 に答える 1

2

イベントに対してより強力な方法で名前を付ける必要があります。たとえば、委任されたイベントの王様が次clickdocumentようになります。

$(document).on('click','a', doSomething);

そして、このようなものがもっとあるかもしれませんが、これは本体にまで委譲されます。そのため、そのうちの 1 つを削除したい場合clickは、ドキュメントからイベントをバインド解除するときに、残りのすべてを実際に削除します。

より良いです:

$(document).on('click.someName','a', doSomething);  // bind
$(document).off('click.someName','a');  // unbind

また、ドキュメントまたはその他の要素までイベント委任を使用している可能性のあるコードがページにさらにある可能性があると想像してください。名前空間がないと、イベントのバインド/バインド解除中に共謀が発生します。

于 2013-02-19T17:03:51.203 に答える