我原本是这样做的:
$('div.ocontainer').each(function() {
var o = $(this);
var newCode = $(this).attr('id');
if (o.parents('.ocontainer').length != 0) {
var oldCode = o.parents('.ocontainer').attr('id');
console.log('unbinding '+oldCode);
$('#'+oldCode+' a').each(function() {
$(this).unbind('click')
})
}
console.log('binding '+newCode);
$('#'+newCode+' a').each(function() {
$(this).click(function() {
decideStMethod(newCode);
})
})
})
...但unbind
无效。我最终在click函数中传递了原始代码。所以我改为使用名称间隔事件:
$('div.ocontainer').each(function() {
var o = $(this);
var newCode = $(this).attr('id');
if (o.parents('.ocontainer').length != 0) {
var oldCode = o.parents('.ocontainer').attr('id');
console.log('unbinding '+oldCode);
$('#'+oldCode+' a').each(function() {
$(this).unbind('click.'+oldCode)
})
}
console.log('binding click.'+newCode);
$('#'+newCode+' a').each(function() {
$(this).bind('click.'+newCode,function() {
decideStMethod(newCode);
})
})
})
...现在unbind
有效但后续的bind
没有。但请注意,bind
行的行如果不是后续行,则会起作用,也就是说,如果unbind
之前没有行。{/ p>
使用这个是首先处理页面的一个区域,并在其中的链接上完成绑定。然后,处理子区域,如果其中一个具有自己的代码,则区域的处理程序必须是未绑定的,并用子区域替换。所有这一切的原因是子区域被动态地放置在该区域中,因此它们将是事先不知道的。哦,以防万一,这是jQuery 1.72
所以:
<div id="region" class="ocontainer">
<div id="subregion" class="ocontainer">
<a>
在处理区域时,链接绑定到click.region和传递'region'的函数。然后,click.region应该是未绑定的,它就是这样,并且click.subregion绑定在一个传递'subregion'的函数的位置,这不会发生。
答案 0 :(得分:0)
首先,bind()
和unbind()
是不推荐使用的功能。请改用.on()
和.off()
。
这是一个有一些改进的例子。
$('div.ocontainer').each(function() {
var o = $(this);
var newCode = o.attr('id'); //Use cached version instead
if (o.parents('.ocontainer').length != 0) {
var oldCode = o.parents('.ocontainer').attr('id');
console.log('unbinding '+oldCode);
$('#'+oldCode+' a').each(function() {
o.off('click', "#"+oldCode); //Turn off the event handler
})
}
console.log('binding click.'+newCode);
$('#'+newCode+' a').each(function() {
$(this).on('click', "#" + newCode, function() {
decideStMethod(newCode);
})
})
})