使用更少的代码行添加和删除 类

Add & remove classes with fewer lines of code

我正在尝试学习如何缩短我的 jQuery 代码。任何建议或提示都很棒:

jQuery(document).ready(function($){ 

  $('#checkout_timeline #timeline-4').click(function() {
    if ($('#checkout_timeline #timeline-4').hasClass('active')) {
      $('#checkout-payment-container').addClass('cpc-visible');
    } 
  });

  $('#checkout_timeline #timeline-1, #checkout_timeline #timeline-2, #checkout_timeline #timeline-3').click(function() {
    $('#checkout-payment-container').removeClass('cpc-visible');
  });

});

为避免混乱,请在此处找到可用版本: My JSFiddle Code

我知道我可以使用 .show().hide() 但由于其他 CSS 考虑,我想申请 .cpc-visible.

试试这个:您可以使用 jquery 选择器与 timelineactive class 绑定单击事件处理程序,您可以在其中添加所需的 class。相同的选择器,但没有 active class 来删除 class.

这在您添加/删除元素时会很有用,并且会更加灵活。

jQuery(document).ready(function($){ 
  $('#checkout_timeline .timeline.active').click(function() {
      $('#checkout-payment-container').addClass('cpc-visible');
  });
  $('#checkout_timeline .timeline:not(.active)').click(function() {
     $('#checkout-payment-container').removeClass('cpc-visible');
  });
});

JSFIddle

这是其中一种方法,您可以使用 :not() 来缩短此代码。此外,使用元素比总是通过 JQuery 引用和获取它们更好。

jQuery(document).ready(function($) {
  var showHideContainer = $('#checkout-payment-container');
  $('#checkout_timeline .timeline.active').click(function() {
    showHideContainer.addClass('cpc-visible');
  });

  $('#checkout_timeline .timeline:not(.payment)').click(function() {
    showHideContainer.removeClass('cpc-visible');
  });

});

试试这个代码,它与 fiddle

一起工作正常
   $('.timeline').click(function() {
        if ($(this).hasClass('active') && $(this).attr("id") == "timeline-4")
          $('#checkout-payment-container').addClass('cpc-visible');
        else
         $('#checkout-payment-container').removeClass('cpc-visible');
      });

这将是我的方法,因为您仍然需要 add/remove 在每个 li 之间激活 class。

jQuery(document).ready(function($) {

  $('ul li').click(function() {
    $('ul li.active').removeClass('active');
    $(this).closest('li').addClass('active');

    k();
  });

  var k = (function() {
    return $('#timeline-4').hasClass('active') ? $('#checkout-payment-container').addClass('cpc-visible') : $('#checkout-payment-container').removeClass('cpc-visible');
  });

});
#checkout-payment-container {
  float: left;
  display: none;
  background: red;
  color: white;
  height: 300px;
  width: 305px;
  padding: 5px;
}

ul {
  list-style: none;
  width: 100%;
  padding: 0 0 20px 0px;
}

li {
  float: left;
  padding: 5px 11px;
  margin-right: 5px;
  background: gray;
  color: white;
  cursor: pointer;
}

li.active {
  background: black;
}

.cpc-visible {
  display: block !important;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul id="checkout_timeline">
  <li id='timeline-1' class='timeline billing'>Billing</li>
  <li id='timeline-2' class='timeline shipping'>Shipping</li>
  <li id='timeline-3' class='timeline confirm'>Confirm</li>
  <li id='timeline-4' class='timeline payment'>Payment</li>
</ul>


<div id='checkout-payment-container'>
  This is the container to show and hide.
</div>

你的代码看起来很棒,我也会这样写的。 有点确定它有多大帮助,但如果你愿意,你可以像这样使用内联:

$(document).ready(function(){ 
  $('#B').click(function() { (!$('#B').hasClass('active')) ? 
  $('#A').addClass('active') : ''; });          
  $('#C').click(function() { $('#A').removeClass('active'); });
});

Link 举个例子: jsFiddle

这里有一些您可以改进的地方。首先,你过度指定了。 ID 是唯一的。不需要 select #checkout_timeline #timeline-4#timeline-4 就可以了。但为什么每个 li 都有 ID?您可以使用 :nth-child(n) select 或按编号引用它们。或者更好的是,您已经为它们指定了特定于应用程序的 class 名称,例如 billingshipmentpayment。用那些!我们把原来的内容精简为:

<ul id="checkout_timeline">
  <li class='billing'>Billing</li>
  <li class='shipping'>Shipping</li>
  <li class='confirm'>Confirm</li>
  <li class='payment active'>Payment</li>
</ul>

<div id='checkout-payment-container' class='cpc-visible'>
  This is the container to show and hide.
</div>

注意我离开了activeclass,确实进一步初始化了结帐 div 和 cpc-visible 以反映付款已激活的情况。通常我会保持 HTML 尽可能简单,并将 "starting positions" 初始化放在代码中。但是 "in for a penny, in for a pound." 如果我们从付款活动开始,不妨通过该决定,并以一致的状态启动相关 div。

现在,修改了JavaScript:

jQuery(document).ready(function($) { 
  $('#checkout_timeline li').click(function() {
    // make clicked pane active, and the others not
    $('#checkout_timeline li').removeClass('active');
    $(this).addClass('active');

    // show payment container only if payment pane active
    var paymentActive = $(this).hasClass('payment');
    $('#checkout-payment-container').toggleClass('cpc-visible', paymentActive);
  });
});

此代码不太特定于项目。它不会尝试为不同的 tabs/panes 添加单独的点击处理程序。他们都得到相同的处理程序,从而做出一组统一的决定。首先,无论单击哪个窗格,都将其激活,而其他窗格则不激活。它通过删除所有 active classes,然后将 active 放在当前 selected 窗格上来实现。其次,它询问 "is the current pane the payment pane?" 并使用 toggleClass API 相应地设置 cpc-visible class。通常这样的 "set class based on a boolean condition" 逻辑比尝试配对适当的 addClassremoveClass 调用更简单、更可靠。

我们完成了。 a JSFiddle 展示了这一点。