Jquery 如何重新打开以前的侦听器?
很抱歉,如果这已经发布了,但我已经看到了很多,并试图使用它们来获得解决方案,但没有一个一直为我工作 以下是我认为正确的方法(没有其他编码)。当触发Jquery 如何重新打开以前的侦听器?,jquery,events,click,listener,Jquery,Events,Click,Listener,很抱歉,如果这已经发布了,但我已经看到了很多,并试图使用它们来获得解决方案,但没有一个一直为我工作 以下是我认为正确的方法(没有其他编码)。当触发F1时,应禁用单击。当触发IF2时,应启用: 1. 问题:单击事件侦听器未关闭 2. 问题:.primary未重新分配单击事件侦听器 3. 问题:错误:未捕获类型错误:对象[Object Object]没有方法“apply” 为了更好地说明我在做什么,我试图关闭一组附加了事件处理程序的lis,而不关闭其他的,只有在切换时才关闭 例如: <ul c
F1
时,应禁用单击。当触发IF2
时,应启用:
1.
问题:单击事件侦听器未关闭
2.
问题:.primary
未重新分配单击事件侦听器
3.
问题:错误:未捕获类型错误:对象[Object Object]没有方法“apply”
为了更好地说明我在做什么,我试图关闭一组附加了事件处理程序的li
s,而不关闭其他的,只有在切换时才关闭
例如:
<ul class="head">
<li class="sub1"></div>
<li class="sub2"></div>
<li class="sub3"></div>
</div>
-
-
-
当您单击任何一个li
时,会发生一些事情,然后.sub1
将删除其单击事件处理程序。然后,当您再次单击任何li
时,除了sub1
,操作被反转,并且sub1
再次变为可单击。您在所有三个处理程序中定义了F1()
和F2()
,但您没有调用它们,因此它们永远不会被执行。如果你想让他们跑,你需要打电话给他们。[编辑-OP已修复第一个问题-第二个问题仍然存在]
我也看不到您实际想要完成什么,因为在前两种情况下,F1()
函数删除了单击处理程序,但是F2()
函数没有安装新的工作处理程序,因为它没有事件处理程序回调。对于.on()
,回调函数不是可选的
我认为使用委托事件处理的想法可能是这里最简单的 安装.head3对象的事件处理程序时,不要直接在对象上安装它们。而是将它们安装在父对象上。然后,您可以从目标对象中添加或删除类,以启用或禁用事件处理程序:
// the click handlers for .head3 objects
// these will only fire if the .head3 object does not have the disabled class on it
$(document.body).on('click', '.head3:not(.disabled) > .primary', function() {
// your .head3 click handler code goes here
});
// then, turn an event handler on or off, you just add or remove the disabled class
// from it
$('.head2, .head3').click(function(event) {
var object = $(this).siblings('.head4');
function F1() {
object.siblings('.head3').children('.primary').addClass("disabled");
}
function F2() {
object.siblings('.head3').children('.primary').removeClass("disabled");
}
if (something) F1();
if (somethingelse) F2();
});
现在,您还没有显示任何HTML,也没有完全描述您真正想要做的事情,但这说明了总体思路。感谢jfriend00和sabithpocker的持续帮助 我把变量
func
放错位置了。我把它设置为函数,而不是侦听器
$('.head2 li, .head3 li').click(func = function(event) {
var object = $(this).parent().siblings('.head4');
if (something) F1();
if (somethingelse)) F2();
function F1() {
object.siblings('.head3').children('.primary').off('click');
}
function F2() {
object.siblings('.head3').children('.primary').on('click', func);
}
});
活动代表团
$('body').on('click','li',function(){
//do the logic for all li elements
});
$('body').on('click','li.active',function(){
//do the logic for active buttons here
});
现在切换li元素上的活动类以启用/禁用自定义零件
使用单事件侦听器,您可以执行以下操作
$('body').on('click','li',function(){
//do common stuff
if($(this).hasClass('active')){
//do stuff
}
else{
//do other stuff
}
});
对于这两种情况
$(elem).toggleClass('active')
将切换自定义零件的运行
你的情况是:
$('.head2, .head3').click(function(event) {
var object = $(this).siblings('.head4');
if (something) object.siblings('.head3').children('.primary').addClass('active');
if (somethingelse)object.siblings('.head3').children('.primary').removeClass('active');
});
是否关闭单击仅禁用它或删除相应的EventListener,如果它删除,则在执行“打开”时是否会返回?@sabithpocker-
.off()
将完全删除事件处理程序。您必须从头开始重新安装.on()
,包括事件处理程序函数。您可以在中看到,事件处理程序不是可选参数。@jfriend00他可能需要从body中委托,然后切换类以启用/取消,对吗?@AaronWalker-因此,现在您正在调用它们,您必须修复.on()
调用,以便在其中包含所需的事件处理程序。您不能只调用()上的.on
。如果我们能更好地了解您真正想要做的事情,那么我们可能会建议一种更优雅的方法。@AaronWalker在您的第三次尝试中,func的值应该是对应于$('.head2 li,.head3 li')的jQuery对象,而不是您可能猜到的单击事件处理程序,正如jfriend00所建议的,请澄清这个问题,你仍然在艰难地完成它seems@sabithpocker哈哈。否则会怎么样?
$('body').on('click','li',function(){
//do the logic for all li elements
});
$('body').on('click','li.active',function(){
//do the logic for active buttons here
});
$('body').on('click','li',function(){
//do common stuff
if($(this).hasClass('active')){
//do stuff
}
else{
//do other stuff
}
});
$('.head2, .head3').click(function(event) {
var object = $(this).siblings('.head4');
if (something) object.siblings('.head3').children('.primary').addClass('active');
if (somethingelse)object.siblings('.head3').children('.primary').removeClass('active');
});