Javascript jQuery取消绑定单击事件函数并根据情况重新附加

Javascript jQuery取消绑定单击事件函数并根据情况重新附加,javascript,jquery,events,binding,click,Javascript,Jquery,Events,Binding,Click,下面的代码用于创建滑动菜单。我需要知道如何解除绑定附加到单击事件的函数,并在其他时间重新附加它。(使用jQuery 1.7.2) 下面的代码是我到目前为止的代码 $('#printVers').click(function(){ if($('#formVersion').val() != "Print") { $('.header').unbind('click'); } else { //else re-attach functionality

下面的代码用于创建滑动菜单。我需要知道如何解除绑定附加到单击事件的函数,并在其他时间重新附加它。(使用jQuery 1.7.2)

下面的代码是我到目前为止的代码

$('#printVers').click(function(){
   if($('#formVersion').val() != "Print")
   {
     $('.header').unbind('click');
   }
   else
   {
     //else re-attach functionality?
   }
});

谢谢

我建议您在
.header
中添加一个简单类,并在单击处理程序中检查该类,而不是取消绑定和重新绑定。见下文

$('#printVers').click(function(){
   if($('#formVersion').val() != "Print")
   {
     $('.header').addClass('dontClick');
   } else  {
     $('.header').removeClass('dontClick');
   }
});
然后在
.header
中单击handler

$('.header').click(function(){
     if ($(this).hasClass('dontClick')) {
        return false;
     }
     //rest of your code

如果您坚持要取消绑定和绑定,那么您可以将处理程序移动到函数并多次取消绑定/绑定该函数。

只需创建一个命名函数即可。您可以在这里使用低技术,然后返回到基础,以解除绑定并重新附加特定事件

function doStuff()
{
    if($(this).,next('.section').is(':visible'))
        ...
}

$('.header').on('click', doStuff);
$('.header').off('click', doStuff);

为什么不将顶部部分设置为函数,然后在else语句中调用它?

您可以将所有代码放在
下。在单独的函数中单击

function headerClick(){
  if($(this).next('.section').is(':visible'))
  {
    $('.section:visible').slideUp()              
    $('.arrows:visible').attr("src","right.gif")
  }
  else
  {
    $('.section').slideUp();
    $(this).next('.section').slideToggle();
    $(this).find('.arrows').attr("src","down.gif")
  }
}
然后像这样绑起来:

$(document).ready(function(){
    $('.section').hide();
    $('.header').click(headerClick);
});

$('#printVers').click(function(){
   if($('#formVersion').val() != "Print")
   {
       $('.header').unbind('click');
   }
   else
   {
       $('.header').click(headerClick);
   }
});

你可以试试这样的

$('#printVers').click(function(){
   if($('#formVersion').val() != "Print")
   {
       $('.header').addClass('clickDisabled');
   }
   else
   {
       $('.header').removeClass('clickDisabled');
   }
});
然后在单击处理程序中检查该类

$(document).ready(function(){
    $('.section').hide();
    $('.header').click(function(){
        if(!$(this).hasClass('clickDisabled')){
            ...
            ...
        }
    });
});

您可以尝试将变量设置为标志<代码>var canClick=($('#formVersion').val()!='Print')然后在执行代码之前,在
元素的click处理程序中检查
canClick
是否为true


如果仍要删除处理程序,可以将events对象分配给变量<代码>var eventObj=#('.header')。数据('events'),它将为您提供一个对象,其中包含分配给该对象的所有处理程序。要重新分配click事件,类似于
$('.header').bind('click',eventObj.click[0])

在尝试了绑定、解除绑定、打开、关闭、单击、属性、移除、属性之后,我成功了。 因此,我有以下场景:在我的html中,我没有附加任何内联onclick处理程序

然后在我的Javascript中,我使用以下内容添加了一个内联onclick处理程序:

$(element).attr('onclick','myFunction()');
为了稍后从Javascript中删除此内容,我使用了以下方法:

$(element).prop('onclick',null);

这就是我在Javascript中以友好方式绑定和解除绑定单击事件的工作方式。请记住不要在元素中插入任何内联onclick处理程序。

因此,您只需根据某个formVersion值启用或禁用
$('.header')
的单击事件处理程序即可,但是我如何引用第一个代码块中的点击功能来重新连接它呢?可能的重复也许我应该尝试重新让我的大脑参与咖啡和食物,而不是在周五下午问愚蠢的问题,这不仅是一个愚蠢的问题,而且是一个已经被问过的问题:(该死,你比我快了30秒XDIt’s simple它甚至一点都不好笑。感谢Tejs,如果能够在不使用fn名称的情况下获得最后一个绑定函数的句柄就好了。比如
elem.on('click',myfn)
。然后在其他完全无关的地方,我们可以有
var fn=elem.lastClickHandler()
elem.off('click',fn)
//一些没有处理程序的代码
elem.on('click',fn)
我想我们的建议没有被考虑:)嗯……有不同的方法……但我们的想法是一致的:)谢谢,我也喜欢这个版本,这也是我没有想到要做的。@MarkWalters绑定/解除绑定事件处理程序比简单地添加和删除类要做很多工作。这是一种常见的技术,但还是要由您选择要遵循的方法。Tjes使用
.on()
.off()的想法如何
命名函数很麻烦吗?我喜欢这两个想法,我确实对你的答案投了赞成票!:)@MarkWalters upvote不重要。。我刚才说绑定/重新绑定一个事件处理程序比添加一个类和删除一个类要昂贵。你说的昂贵是什么意思?因为您之前说过这是一项大量的工作,对此我不同意,我实际上认为我要实现(尽管很少)与您的代码有更多的关系?“unbind”函数只取消那些使用jquery“bind”方法绑定的函数的绑定。这其中有几个问题,首先,您使用两种不同的方法来设置onclick处理程序并使其无效。两者都使用
.prop
有什么问题?其次,像在第一行中那样向函数传递“字符串”引用是不好的做法,据我所知,这会导致调用
eval()
,这很糟糕!)@MarkWalters——简而言之,我认为他正确地使用了attr来设置onclick,并被IE强制使用prop来删除。在jQuery“removeattr”文档中:“注意:使用.removeattr()删除内联onclick事件处理程序在Internet Explorer 6、7或8中无法达到预期效果。为了避免潜在问题,请改用.prop():
$(element).prop('onclick',null);