4
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”,我可以解决这个问题,但我不知道该怎么做。如果它有参数,我也不能杀死它。我怎样才能做到这一点?

谢谢!

4

2 回答 2

2

您错过了varfrom runMe,因此runMe泄漏到全局执行上下文中。因此,每次调用时,对inmyClass的引用都会发生变化。myobjectrunMe

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

这是一个工作示例


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

于 2012-09-13T07:13:07.360 回答
1

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

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

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

在这里,您可以并且应该用document按钮的最近的静态父元素替换。新代码演示


根据文档,数据是该.live()方法的可选第二个参数,您可以通过事件对象访问它。使用如下:

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();

旧代码工作演示

于 2012-09-13T07:24:42.530 回答