用于在jquery中删除事件的die函数

用于在jquery中删除事件的die函数,jquery,Jquery,我创建了一个mouseover事件处理程序,如下所示: $('.grpName_tooltip0, .grpName_tooltip1, .grpName_tooltip2').live('mouseover',function(){ var localGrpName=$(this).attr('class')=='grpName_tooltip0'?arrGrpNames[0]:$(this).attr('class')=='grpName_tooltip1'?arrGrpNames[

我创建了一个
mouseover
事件处理程序,如下所示:

$('.grpName_tooltip0, .grpName_tooltip1, .grpName_tooltip2').live('mouseover',function(){
    var localGrpName=$(this).attr('class')=='grpName_tooltip0'?arrGrpNames[0]:$(this).attr('class')=='grpName_tooltip1'?arrGrpNames[1]:$(this).attr('class')=='grpName_tooltip2'?arrGrpNames[2]:'';
    $('#GroupsDivTooltip').html(localGrpName);
    $('.ttpGrp').css({'top':$(this).offset().top+27,'left':$(this).offset().left}).fadeIn();
}).live('mouseleave',function(){
    $('#GroupsDivTooltip').html('');
    $('.ttpGrp').fadeOut();
});
我想做。为特定的
.grpName\u工具提示0
类名而死

当我像下面这样单独尝试时,不起作用

$('.grpName_tooltip0').die('mouseover');
这是所有提到的工作。。。如下

$('.grpName_tooltip0, .grpName_tooltip1, .grpName_tooltip2').die('mouseover');
我只想要一个


请建议我……

也许最好试试这个:

$('.grpName_tooltip0').mouseover(function(){return false;});
试试这个:

$('.grpName_tooltip0, .grpName_tooltip1, .grpName_tooltip2').mouseenter(function(){
   ....
   $('.grpName_tooltip0').unbind('mouseenter');
})
第一:
.live()
.die()
自jQuery 1.7以来就被弃用了。您应该现在就使用(但这显示了相同的问题,因此这里的所有解决方案仍然有效)


如果不必使用事件委派,只需
unbind
事件处理程序即可

如果必须使用事件委派,一种方法是直接向元素添加额外的事件处理程序,这可以防止事件在DOM中冒泡并在根()处触发事件处理程序

另一种解决方法是在元素上设置一个标志,并且只有当标志不是时才执行事件处理程序中的事件,例如,
false

$('.grpName_tooltip0, .grpName_tooltip1, .grpName_tooltip2').live('mouseover',function(){
    if($(this).data('active') !== false) {
        // do something
    }
});
然后,您可以通过设置

$('.grpName_tooltip0').data('active', false); // or true

上述所有方法都有一个缺点,即为了防止事件处理程序触发,元素必须在您做出决策时存在。但在你的情况下,情况可能并非如此

因此,另一种方法是保留一个选择器列表,您希望从事件处理程序中排除这些选择器:

var exclude = [];

$('.grpName_tooltip0, .grpName_tooltip1, .grpName_tooltip2').live('mouseover',function(){
    var run = true, $self = $(this);
    $.each(exclude, function(sel) {
        if($self.is(sel)) {
            run = false;
            return false;
        }
    });

    if(run) {
        // do stuff
    }
});
然后,您只需将不希望处理程序为其激发的选择器添加到列表中:

exclude.push('.grpName_tooltip0');
根据您的实际情况,可以通过多种方式优化此方法(例如,使用对象而不是数组进行
O(1)
access)

还有一种方法是完全解除事件处理程序的绑定,并且只为需要的元素重新绑定它:

function handler() {
    // your event handler code here
}

var selectors = ['.grpName_tooltip0', '.grpName_tooltip1', '.grpName_tooltip2'];

$(selectors.join()).live('mouseover', handler);
后来:

$(selectors.join()).die('mouseover');
$($.grep(selectors, function(sel) {
    return sel !==  '.grpName_tooltip0';
}).join()).live('mouseover', handler);

不可能删除事件处理程序,因为只有一个事件处理程序附加到文档,如果选择器匹配,该事件处理程序将始终激发。文档中的注释:“为了使
.die()
正常工作,与之配套使用的选择器必须与最初与
.live()
配套使用的选择器完全匹配。不过,这并不使用事件委派,它可能不适用于OP的用例。或更短的:
$('.grpName_tooltip0')。mouseover(false)