【问题标题】:Jquery class changing works, but doesn't effect another function like it shouldJquery 类更改有效,但不会影响其他功能
【发布时间】:2010-04-08 13:25:07
【问题描述】:

所以我的内容框会在您单击箭头时关闭和展开。内容框有两个类来判断它是打开还是关闭(.box_open、.box_closed)。为 box_open 分配了一个悬停功能,因此当它打开并且您将鼠标悬停在标题上时,会出现箭头。但是,我不希望在盒子关闭时发生这种情况,因为我希望箭头在盒子关闭时保持可见。当盒子关闭时,box_open 类被删除,但分配给该类的功能仍然有效。

这是两个函数的 jquery 代码。您还可以在下面的演示标题中看到它们。

    // Display Arrow on Box Header Hover

        $(".box_open").hover(
            function () {
                $(this).find('a').show();
            }, 
            function () {
                $(this).find('a').hide();
            }
        );

    // Open and Close Boxes:

        $(".box_header a").click(
            function () {
                $(this).parent().next('.box_border').stop().toggle();
                $(this).parent().toggleClass("box_open");
                $(this).parent().toggleClass("box_closed");
                return false;
            }
        );

谁能看看是什么问题?

这是演示网址:Demo Url

【问题讨论】:

    标签: jquery html css class hover


    【解决方案1】:

    事件处理程序分配给元素,而不是类标签。因此,一旦分配,删除类名不会使处理程序消失。

    您可以将事件分配给“box_header”并检查您的hover() 代码中是否存在“box_open”类。

    $('.box_header').hover(
    function() {
        $(this).find('a').show();
    },
    function() {
        if($(this).hasClass('box_open'))
            $(this).find('a').hide();
    });
    

    编辑:添加缺少的右括号。马虎我!

    【讨论】:

    • 我对 if 语句的语法有点困惑。 Aptana 正在标记它,但我一辈子都看不出有什么问题。我了解我的方法有什么问题,以及为什么这应该有效,但是语法让我很生气,哈哈
    【解决方案2】:

    Patrick 的回答是正确的,但有一个更好的方法:使用 jQuery.live(),它可以让您“将处理程序附加到与当前选择器匹配的所有元素的事件,现在或将来。”

    所以,这应该或多或少地得到你想要的:

    $('.box_open').live('hover', function (event) {
        if(event.type === 'mouseenter') {
            $(this).find('a').show();
        }
        else {
            $(this).find('a').hide();
        }
    });
    

    几乎直接来自the jQuery docs

    【讨论】:

    • 但是每次关闭盒子时都需要取消绑定事件。这比简单的if() 声明要多得多。
    • 我看过 .live(),但它似乎导致的问题比它修复的要多。 if 语句运行良好,我理解逻辑,所以我会坚持使用它 =) 为帮助人员干杯 =)
    • @patrick:如果我正确理解了这个问题,那么当盒子关闭时,事件就不必解除绑定,因为 - 我假设 - 关闭盒子意味着删除 box_open 类并应用box_close 班级。我错了吗?
    • +1 你是对的。我在想live() 在修改接收事件的元素上的选择器方面更像bind()。你的方法有效。我仍然倾向于测试一个标志(例如 box_open 类),因为我认为它是一种资源消耗较少的方法,如果您要依赖事件冒泡,live() 可能会出现问题。
    【解决方案3】:

    把它放在你的css文件中。

    .box_closed a {
        display: inline !important;
    }
    

    【讨论】:

    • 这没有什么区别,因为 .box_hover inst 类即使在使用中。
    • @Qwibble 对不起,我的意思是 .box_closed :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-13
    • 2018-01-26
    • 2018-02-13
    • 2020-11-15
    • 1970-01-01
    • 2020-07-23
    • 1970-01-01
    相关资源
    最近更新 更多