Javascript中所有类实例的常见回调

时间:2012-07-13 01:59:24

标签: javascript jquery

我有一个自定义Javascript类,可以生成一个JQuery mousedown回调。 mousedown回调在$(document)上,实际上应该只为第一个新实例设置,而不是为任何后续实例设置。我有类似的东西:

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

我希望那些回调只在多个myclass实例被装箱的情况下注册一次,如果没有创建,则完全不注册。

3 个答案:

答案 0 :(得分: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
      })
   }
}

答案 1 :(得分: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);
}

答案 2 :(得分: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的新实例不会重新绑定到事件,如果它们是在第一个完成未绑定后创建的。