Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery 如何重新打开以前的侦听器?_Jquery_Events_Click_Listener - Fatal编程技术网

Jquery 如何重新打开以前的侦听器?

Jquery 如何重新打开以前的侦听器?,jquery,events,click,listener,Jquery,Events,Click,Listener,很抱歉,如果这已经发布了,但我已经看到了很多,并试图使用它们来获得解决方案,但没有一个一直为我工作 以下是我认为正确的方法(没有其他编码)。当触发F1时,应禁用单击。当触发IF2时,应启用: 1. 问题:单击事件侦听器未关闭 2. 问题:.primary未重新分配单击事件侦听器 3. 问题:错误:未捕获类型错误:对象[Object Object]没有方法“apply” 为了更好地说明我在做什么,我试图关闭一组附加了事件处理程序的lis,而不关闭其他的,只有在切换时才关闭 例如: <ul c

很抱歉,如果这已经发布了,但我已经看到了很多,并试图使用它们来获得解决方案,但没有一个一直为我工作

以下是我认为正确的方法(没有其他编码)。当触发
F1
时,应禁用单击。当触发I
F2
时,应启用:

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');
});