1

我有一个生成 JQuery mousedown 回调的自定义 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

这里有几个可能的选择。

选项 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 回答
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 回答