【问题标题】:jquery toggleClass only works oncejquery toggleClass 只工作一次
【发布时间】:2014-04-02 23:32:30
【问题描述】:

这个脚本使得当你点击一个<div> 时,另一个<div> 出现通过添加类log_in_box_dd#big_ul_hide。一旦#big_ul_hide 拥有该类,单击任意位置(#big_ul_hide 除外)将删除该类,从而将其隐藏。 因此,您单击以查看弹出的 div,然后单击该 div 应隐藏的任何位置。

这整件事有效,但只有一次。在那之后它变得非常奇怪。
添加然后删除后, 检查元素将读取<div id="big_ul_hide" class="">。我无法让课程重新添加。

我已经添加了setTimeout 函数,所以当点击.lin_und 时它不会立即删除该类。

那么,为什么不让我重新添加课程?如果我在.toggleclass 之后alert(...) 它每次都会发出警报,但仍然不应用课程。

小提琴:http://jsfiddle.net/NQxAC/

<script>
$('.lin_und').click(function() {
    $('#big_ul_hide').toggleClass('log_in_box_dd');
});
setTimeout(function() {      
    $('html').click(function() {
        if($('#big_ul_hide').hasClass('log_in_box_dd')) {
            $('#big_ul_hide').removeClass('log_in_box_dd');
        }
    });
    $('#big_ul_hide').click(function(event) {
        event.stopPropagation();
    });
}, 2000);
</script>

【问题讨论】:

  • 为什么setTimeout里面有点击处理程序。请把它们从废话中取出
  • 为什么要在这里嵌套处理程序? (至少在你的 jsFiddle 中......)
  • 这就是jsfiddle.net/j08691/NQxAC/2之后的内容吗?
  • @j08691 是的,请发布一个带有描述的答案,我会尝试一下,然后接受。
  • 为什么被标记下来了?我符合要求。

标签: javascript jquery toggleclass


【解决方案1】:

您首先需要停止事件冒泡并将html 上的点击事件处理程序从内部点击处理程序中移出,以便它存在于它自己的一个(否则您会重复绑定点击事件)。尝试使用:

$('.lin_und').click(function (e) {
    e.stopPropagation();
    $('#big_ul_hide').toggleClass('log_in_box_dd');
    $('#big_ul_hide').click(function (event) {
        event.stopPropagation();
    });
});
$('html').click(function () {
    $('#big_ul_hide').removeClass('log_in_box_dd');
});

jsFiddle example

【讨论】:

    【解决方案2】:

    如果您不停止在 .lin_und 上冒泡并冒泡到 html,这将触发其点击事件处理程序。你不需要setTimeout。我会尝试这样的事情:

    $('.lin_und').on('click', function (evt) {
    
        evt.stopPropagation();
        $('#big_ul_hide').toggleClass('log_in_box_dd');
    
    });
    
    $('html').on('click', function () {
    
        $('#big_ul_hide').removeClass('log_in_box_dd');
    
    });
    
    $('#big_ul_hide').on('click', function (evt) {
    
        evt.stopPropagation();
    
    });
    

    在这里看到它的工作:Demo

    您希望蓝色框成为唯一显示隐藏 div 的框吗?如果是这样,那么在 html 点击处理程序上将 .toggleClass() 更改为 .removeClass()

    【讨论】:

    • 我没有嵌套事件处理程序的原因是你每次点击都会设置事件监听器
    【解决方案3】:

    我不太确定我是否完全理解您的要求,但请看一下: http://jsfiddle.net/NQxAC/1/

    $('.lin_und').click(function() {                
        $('#big_ul_hide').toggleClass('log_in_box_dd');             
    });
    $('body').click(function(e) {
        if (!$(e).target().is('.lin_und'))
            $('#big_ul_hide').removeClass('log_in_box_dd');                 
    });
    

    点击上方的 div 将切换下方的 div。 点击其他任何地方都会隐藏第一个。

    【讨论】:

    • 不完全,单击 div 隐藏/显示。如果 div 有类点击任何地方,但 div 将删除类(隐藏 div)。
    • 嗯,是的。但这就是现在发生的事情。或者我不明白你的意思:/
    • 在您的示例中,您必须单击触发器 div 才能隐藏新的 div。我希望它这样做,但也可以通过单击其他任何地方来隐藏它。请参阅已接受的答案以了解我要完成的工作。不过谢谢! :-D
    猜你喜欢
    • 2011-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多