Javascript 按事件指针/引用解除特定Jquery事件的绑定

Javascript 按事件指针/引用解除特定Jquery事件的绑定,javascript,jquery,Javascript,Jquery,我需要的是: var MyEventPointer = $('body').on('MyCustomEvent','.myClass',function(e){ // do something }); var MyEventPointer2 = $('body').on('MyCustomEvent','.myClass',function(e){ // do something }); $('body').unbindByEventID(MyEventPointer); My

我需要的是:

var MyEventPointer = $('body').on('MyCustomEvent','.myClass',function(e){
   // do something
});

var MyEventPointer2 = $('body').on('MyCustomEvent','.myClass',function(e){
   // do something
});

$('body').unbindByEventID(MyEventPointer);

MyEventPointer
是指向特定事件处理程序的指针。尽管两个事件处理程序完全相同,但只有一个是未绑定的,因为它们在创建时返回不同的唯一标识符。这应该像我在变量中存储对计时器的引用一样工作,并在以后使用其引用再次禁用计时器。我知道Jquery为事件存储唯一的ID,但我不知道是否可以访问它们。这可以通过Jquery实现吗?或者我需要自己的解决方案吗?需要委派事件,以便包括
.myClass
的当前和未来实例

更新: 示例代码:

<tr><td><input class="MyWidget" /></td></tr>
<tr><td><input class="MyWidget" /></td></tr>
<tr><td><input class="MyWidget" /></td></tr>
<!-- Repeats n times, rows are added and deleted dynamically -->    
// Creation
$('.MyWidget').MyWidget();


// The plugin
$.fn.MyWidget = function (options) {
   return this.each(function () {
      new ATK.MyWidget(this, options);
   });
};

// The widget class
ATK.MyWidget = function (element, options) {
   // constructor
}
ATK.MyWidget.prototype = new ATK.ParentWidget();

ATK.MyWidget.prototype.SetFilterEvent = function(Selector) {
   var base = this;   
   $('body').on('MyCustomEvent',Selector,function(e){base.eMyCustomEvent(e,this)});
}

ATK.MyWidget.prototype.eMyCustomEvent = function(e,eventThis) {
   console.log(this.protected.$element.attr('id')+' has detected that '+$(eventThis).attr('id')+' has changed.');
}

您可以这样做:

function MyEventPointer1(e){
   // do something
});

function MyEventPointer2(e){
   // do something
});

$('body').on('MyCustomEvent','.myClass', MyEventPointer1);
$('body').on('MyCustomEvent','.myClass', MyEventPointer2);

$('body').off('MyCustomEvent','.myClass', MyEventPointer1);

更具体地说,在类的情况下,您可以轻松地应用上述模式,它可以工作:

ATK.MyWidget.prototype.SetFilterEvent = function(Selector) {
    this.event = function(e) {this.eMyCustomEvent(e, this);}
    $('body').on('MyCustomEvent',Selector,this.event);
}

ATK.MyWidget.prototype.RemoveFilterEvent = function(Selector) {
    $('body').off('MyCustomEvent',Selector,this.event);
}

(您可能需要检查以确保this.event不为null,并在构造函数中将其设置为null,或者在构造函数中将this.event声明为this函数或类似函数更有效,但这基本上完成了任务。)

如果您想在一个元素上使用不同的相同事件,我的意思是如果您想在同一个元素上注册多个事件处理程序,那么您可以使用
事件命名空间
,即

$('body').on('MyCustomEvent.nameSpaceOne','.myClass',function(e){
    // do something
});

$('body').on('MyCustomEvent.nameSpaceTwo','.myClass',function(e){
    // do something
});
使用
事件名称空间
删除第一个处理程序,在本例中,删除它;s
nameSpaceOne

$('body').off('MyCustomEvent.nameSpaceOne', '.myClass'); 

.

在这两种情况下,作为返回值得到的都是
的jQuery对象,而不是唯一的引用。事实上,我上面的示例是伪代码-我试图找出如何取回唯一ID而不是jQuery对象。在这种情况下,这不起作用,因为类(对象)侦听更改不应修改它正在侦听的元素。删除我的评论,因为Jasper的回答更有意义;)
MyEventPointer
是一个JavaScript对象,而不是一个事件处理程序。它使用两个函数。在我的例子中,只能有一个函数。该函数是一个类的方法,该类在任何给定时间的文档中都有n个实例。实例知道它们何时被创建,何时将被销毁,但不知道其他实例(通过设计)。为了使委托能够工作,类必须将事件附加到已知存在于自身之外的包装器(在本例中为主体)上。所有实例都在侦听相同的内容,但当事件发生时,每个实例都需要得到通知,以便能够自行处理更改。说真的,因为你的原始问题中没有提到我不知道的其他限制,所以投票被否决?@Nick:这是否是一个问题,取决于你用什么技术来模拟javascript中的类。即使这是一个问题,您也可以通过使用存储为类属性的“匿名”函数(实际上是您在其他策略中所做的…)轻松地绕过它。如果你想让我更具体一些,你需要向我展示更多的代码。我试图让问题尽可能简单-这只是一种从事件处理程序创建中获取UID的方法。但是如果上面的代码有用的话,我当然可以发布更多的代码。@Nick我的代码适用于您的示例,所以是的,您需要发布一个新的示例,我提供的代码不适用于该示例,然后我才能修改我的代码,使其也适用于这种情况。您给出的描述是合理的,但它使用了“类”这样的术语,在javascript中实际上没有意义,尽管这通常不是问题,但它在这里。触发时,两个处理程序是否都会选择
MyCustomEvent
(没有名称空间)?例如,
.trigger('MyCustomEvent')
@Nick,如果没有名称空间,那么是的,但我想为什么您应该在没有
名称空间的情况下使用它。