Javascript jQuery取消绑定单击事件函数并根据情况重新附加
下面的代码用于创建滑动菜单。我需要知道如何解除绑定附加到单击事件的函数,并在其他时间重新附加它。(使用jQuery 1.7.2) 下面的代码是我到目前为止的代码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
$('#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);