0

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

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

1.

$('.head2, .head3').click(function(event) {
    var object = $(this).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');
    }
});

ISSUE: 点击事件监听器没有关闭。

2.

$('.head2 li, .head3 li').click(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');
    }
});

ISSUE:.primary未重新分配单击事件侦听器

3.

func = $('.head2 li, .head3 li').click(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);
    }
});

问题:ERROR: Uncaught TypeError: Object [object Object] has no method 'apply'

为了更好地说明我在做什么,我试图关闭一组li附加了事件处理程序的 s 而不关闭其他的,仅当它被切换时。

例子:

<ul class="head">
    <li class="sub1"></div>
    <li class="sub2"></div>
    <li class="sub3"></div>
</div>

当您单击任何 时li,会发生一些事情,然后.sub1删除其单击事件处理程序。然后,当您li再次单击任何一个 EXCEPTsub1时,操作将反转并sub1再次变为可单击。

4

3 回答 3

1

事件委托

$('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');
});
于 2012-07-18T23:51:33.683 回答
0

您正在定义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,也没有完全描述您真正想要做的事情,但这说明了总体思路。

于 2012-07-18T23:19:16.610 回答
0

感谢 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);
    }
});
于 2012-07-18T23:43:08.630 回答