jQuery:我如何将参数传递给事件监听器的回调?

时间:2012-09-13 07:04:23

标签: callback jquery

function myClass(myobject){
      var myclass = {};

      myclass.registerEvent = function(){
          $('#'+myobject.id).live('someEventThatTriggersRightAway', runMe);
      };

      runMe = function(){
            $('#'+myobject.id).die('someEventThatTriggersRightAway', runMe);
            console.log("Hello "+myobject.name);
      };

      return myclass;
}


var instance1 = new myClass({id:'button1',name:'MATO'});
var instance2 = new myClass({id:'button2',name:'YAMA'});

当我运行此代码时

instance1.registerEvent();

结果是

Hello YAMA

就好像第一个实例被第二个实例覆盖了一样。如果我能在事件的回调中传递'myobject',我可以解决这个问题,但我不知道该怎么做。如果它有参数我也不能杀它。我怎么能这样做?

谢谢!

2 个答案:

答案 0 :(得分:2)

您错过了var runMe,因此runMe正在泄漏到全局执行上下文。因此,每次致电myClass时,myobject中对runMe的引用都会发生变化。

var runMe = function(){
    $('#'+myobject.id).die('someEventThatTriggersRightAway', runMe);
    console.log("Hello "+myobject.name);
};

这是working example


旁注:您是否知道不推荐使用jQuery .live().die()方法?您应该使用.on()(jQuery 1.7+)或.delegate()代替。

答案 1 :(得分:1)

以下答案纯粹是理论上的,因为.live().die()已被弃用,因此不应再使用 。要使您的代码保持最新,请使用以下内容替换下面给出的.live() / .die()来电:

// for .live()
$(document).on('click', '#'+myobject.id, myobject, runMe);

// for .die()
$(document).off('click', '#'+e.data.id, runMe);

在这里,您可以而且应该使用按钮的最近的静态父元素替换documentNew code demo

<小时/> 根据{{​​3}},数据是.live()方法的可选第二个参数,您可以通过documentation访问该方法。使用方法如下:

function myClass(myobject){
      var myclass = {};

      myclass.registerEvent = function(){
          $('#'+myobject.id).live('click', myobject, runMe);
      };

      var runMe = function(e){
          $('#'+e.data.id).die('click', runMe);
          console.log("Hello "+e.data.name);
      };

      return myclass;
}

var instance1 = new myClass({id:'button1',name:'MATO'});
var instance2 = new myClass({id:'button2',name:'YAMA'});

instance1.registerEvent();
instance2.registerEvent();

event object