【问题标题】:Jquery issue with changing classes更改类的Jquery问题
【发布时间】:2013-05-29 10:30:58
【问题描述】:

我正在我的一个页面上创建一个小框,它将根据活动选项卡在 3 个不同的输出之间切换。我将最左侧的选项卡设置为在加载时处于活动状态,当单击其他选项卡时,此活动选项卡变为普通选项卡,单击的选项卡变为活动选项卡。我创建了两个类,一个名为activeBoxTabboxTab,正如您在下面的jsfiddle 中看到的那样,它们可以在它们之间切换。我的问题是,无论哪个选项卡设置为默认活动,一旦单击另一个选项卡就变得无用,而其他两个选项卡可以来回单击。

http://jsfiddle.net/rxYB7/2/

HTML:

<div id="boxTabs">
    <p class="boxTab" id="deliveryTab">Tab 1</p>
    <p class="activeBoxTab" id="returnTab">Tab 2</p>
    <p class="boxTab" id="careTab">Tab 3</p>
</div>

JS:

$(document).ready(function () {
    $(".boxTab").click(function () {
        $(this).siblings(".activeBoxTab").attr('class', 'boxTab');
        $(this).attr('class', 'activeBoxTab');
        return false;
    });
});

【问题讨论】:

  • 我看不到你的 jsfiddle 的链接...
  • 一些代码看看你尝试了什么?
  • 哎呀!我忘了包括链接..现在添加!
  • 您的小提琴不起作用,因为您没有包含 jQuery。这是一个“工作”演示:jsfiddle.net/rxYB7/3.
  • 我很确定我有?

标签: jquery css dom


【解决方案1】:

您只能将事件处理程序绑定到类 boxTab 的元素。但是在您的 HTML 中,“选定”元素只有 activeBoxTab 类。事件处理程序永远不会绑定到该元素,因此当您单击它时不会发生任何事情!

也给它boxTab 类:

<p class="activeBoxTab boxTab" id="returnTab">Tab 2</p>

并将您的事件处理程序更改为:

$(this).siblings('.activeBoxTab').removeClass('activeBoxTab');
$(this).addClass('activeBoxTab');

【讨论】:

  • 我会将此标记为正确,因为这几乎是我现在所做的。为此干杯,同样作为 jQuery/JavaScript 的新手,我不知道我需要在加载时绑定事件处理程序,这就解释了为什么我找不到解决方法。
  • 是的,事件处理程序只能绑定到存在的元素。 $(".boxTab") 将找到所有具有boxTab 类的元素,然后.click 将事件处理程序绑定到所有找到的元素。稍后将类添加到元素并不会神奇地添加事件处理程序。由于事件在浏览器中的工作方式,您可以使用 事件委托 来处理在绑定处理程序时可能尚不存在的元素上的事件。但是在这种情况下,您不是将处理程序直接绑定到元素,而是绑定到它们的祖先。看看:learn.jquery.com/events.
  • 啊,我明白了,我确实觉得在使用选项卡的情况下,添加使选项卡与适用于所有选项卡的通用样式类一起突出的类要容易得多。让您更容易了解我在此过程中在做什么。
  • 当然可以。没有理由不从一开始就包含boxTab 类,因为它毕竟是一个选项卡(并且另外它被选中了)。编码愉快!
【解决方案2】:

您只是将点击处理程序绑定到 boxTab 选项卡,而最初的活动选项卡不是 boxTab。您需要将点击处理程序绑定到两者:

$(document).ready(function () {
    $(".boxTab, .activeBoxTab").click(function () {
        $(this).siblings(".activeBoxTab").attr('class', 'boxTab');
        $(this).attr('class', 'activeBoxTab');
        return false;
    });
});

固定小提琴:http://jsfiddle.net/rxYB7/4/

但是,这确实意味着当您重新单击当前活动的选项卡时,单击处理程序将触发。如果你想避免这种情况,你可以在点击处理程序中检查和中止,或者使用使用“.on”的实时事件检查来根据当前类为包含 div 中的所有元素动态设置点击处理程序。

【讨论】:

    【解决方案3】:

    您的第一个 activeBoxTab 没有点击事件。这就是为什么它不起作用。您必须添加两个类 boxTab activeBoxTab 来处理该选项卡中的事件。然后您必须删除或添加activeBoxTab 类。

    <div id="boxTabs">
        <p class="boxTab" id="deliveryTab">Tab 1</p>
        <p class="boxTab activeBoxTab" id="returnTab">Tab 2</p>
        <p class="boxTab" id="careTab">Tab 3</p>
    </div>
    <div id="productInfoBox">
        <p class="activeBoxInfo" id="deliveryInfo"></p>
    </div>
    
    $(document).ready(function () {
        $(".boxTab").click(function () {
            $('.activeBoxTab').each(function(index, value) {
                $(value).removeClass('activeBoxTab');
            });
            $(this).addClass('activeBoxTab');
    
            return false;
        });
    });
    

    Working demo

    【讨论】:

    • 您不必使用.each。你可以做$('.activeBoxTab').removeClass('activeBoxTab');
    • 虽然很简单,但他原来的类处理确实有效。并且 IMO 您应该只从容器中的同级选项卡中删除该类,而不是在整个页面中全局删除。
    • 如果你做.each,你可以做更具体的事情,比如if (index % 2 === 0){...}。例如,更改背景颜色或任何您想要的(更改文本等)。我认为这是一个更好的工作功能。回答你,Rup,你可以更具体。这只是一个例子。
    • 当然你可以做更多的事情,但是这里不需要。不要让它变得过于复杂。
    • 我们可以同意不同意。我发现$('.activeBoxTab').removeClass('activeBoxTab');$('.activeBoxTab').each(function() { ... }); 更容易理解。而且由于 jQuery 无论如何都会调用.each internally,因此无需显式调用它。但每个人都有自己的风格。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-28
    • 1970-01-01
    • 1970-01-01
    • 2012-08-10
    • 2014-09-21
    相关资源
    最近更新 更多