1

JQuery マウスダウン コールバックを生成するカスタム Javascript クラスがあります。mousedown コールバックは $(document) にあり、実際には最初の新しいインスタンスに対してのみ設定する必要があり、後続のインスタンスに対しては設定しないでください。私は次のようなものを持っています:

function myclass(arg){
   this.arg = arg;
   $(document).mousedown(function(down_event){
       // start action
   }).mouseup(function(){
      // stop action
      })
}

myclassこれらのコールバックは、複数のインスタンスが作成された場合に一度だけ登録され、作成されていない場合はまったく登録されないようにしたいと考えています。

4

3 に答える 3

2

イベントが既に登録されている場合は変数を使用してフラグを立て、まだ登録されていない場合にのみ登録する必要があります。

この例:

var registered = false; // the 'flag' variable, default to false (i.e. not yet registered)

function myclass(arg){
   this.arg = arg;

   if (!registered) { // check the 'flag' variable if events have been registered yet
      registered = true; // set the 'flag' variable as events will be registered this time

      $(document).mousedown(function(down_event){
         // start action
      }).mouseup(function(){
         // stop action
      })
   }
}
于 2012-07-13T02:14:59.580 に答える
1

そのためのjQuery関数があります。.one()要素(この場合)で発生したイベントの最初のインスタンスにハンドラーをバインドするために使用しますdocument

function myclass(arg){
    this.arg = arg;
    $(document)
        .one('mousedown.yourEvent', downHandler)
        .one('mouseup.yourEvent', upHandler);
}

function downHandler(e) {
    // start action
}

function upHandler(e) {
    // stop action

    //ensure event dead forever
    $(document).on('.yourEvent', function() { return false; });
}

更新しました。変更(匿名関数ではなく名前付きハンドラーを使用し、イベントを特定の名前空間に配置する)は、myclassの新しいインスタンスが、最初のインスタンスのバインド解除が完了した後に作成された場合に、イベントに再バインドされないようにすることです。

于 2012-07-13T02:34:46.637 に答える
1

いくつかの可能なオプションを次に示します。

オプション 1: グローバル変数

function myclass(arg){
   this.arg = arg;

   if (!window._myClassCreatedAlready) {
      $(document).mousedown(function(down_event){
          // start action
      }).mouseup(function(){
         // stop action
      })
   }
   window._myClassCreatedAlready = true;
}

オプション 2: jQuery データ

function myclass(arg){
   this.arg = arg;

   if (!$.data(document, "mousedownset")) {
      $(document).mousedown(function(down_event){
          // start action
      }).mouseup(function(){
         // stop action
      })
   }
   $.data(document, "mousedownset", true);
}
于 2012-07-13T02:22:21.110 に答える