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',我可以解决这个问题,但我不知道该怎么做。如果它有参数我也不能杀它。我怎么能这样做?
谢谢!
答案 0 :(得分:2)
您错过了var
runMe
,因此runMe
正在泄漏到全局执行上下文。因此,每次致电myClass
时,myobject
中对runMe
的引用都会发生变化。
var runMe = function(){
$('#'+myobject.id).die('someEventThatTriggersRightAway', runMe);
console.log("Hello "+myobject.name);
};
旁注:您是否知道不推荐使用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);
在这里,您可以而且应该使用按钮的最近的静态父元素替换document
。 New 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();