如何使用不同的选择器简化重复的jQuery代码

时间:2014-11-17 03:57:50

标签: javascript jquery

所以我有数百个列表,它们分为30多个类别。

我所做的是我将列表显示为:none,每个类别都有一个click.slideToggle()函数,还有slideUp其他列表除了单击列表外,问题是我必须为每个列表编写重复的非常长的代码列表。

我需要有人建议我更好地编写这些javascript行,所以这里有更清晰图片的代码。

<span id='categoryA'>
<div id='listA' class='list'>

<span id='categoryB'>
<div id='listB' class='list'>

<span id='categoryC'>
<div id='listC' class='list'>

<span id='categoryD'>
<div id='listD' class='list'>

<!-- there are around 25 more of similar lists -->

CSS:

.list {
    display: none;
}

JavaScript的:

$(document).ready(function() {
  $("#categoryA").click(function() {
    $("#listA").slideToggle(function() {
      $("#listB,#listC,#listD").slideUp();
    });
  });

   $("#categoryB").click(function() {
    $("#listB").slideToggle(function() {
      $("#listA,#listC,#listD").slideUp();
    });
  });

   $("#categoryC").click(function() {
    $("#listC").slideToggle(function() {
      $("#listA,#listB,#listD").slideUp();
    });
  }); 

   $("#categoryD").click(function() {
    $("#listD").slideToggle(function() {
      $("#listA,#listB,#listC").slideUp();
    });
  });
});

关键是我希望每次点击#categoryA时,它都会滑动切换#listA,如果我点击#categoryB,则会滑动切换#listB并滑动任何其他列表目前是slideDown。

我有超过30个类别。如何使代码更简单,更高效?有没有人有更明智的方法来做到这一点?

5 个答案:

答案 0 :(得分:3)

<span class='category' id='categoryA'>Title A</span>
<div id='listA' class='list'>...</div>

<span class='category' id='categoryB'>Title B</span>
<div id='listB' class='list'>...</div>

<span class='category' id='categoryC'>Title C</span>
<div id='listC' class='list'>...</div>

<span class='category' id='categoryD'>Title D</span>
<div id='listD' class='list'>...</div>

$(function() {
    $(document).on("click", ".category", function () {
        $(this).next(".list").slideToggle(function () {
            $(".list").not(this).slideUp();
        };
    });
});

说明:

  • 使用CSS类(而不是HTML ID)对类似元素进行分组。请注意我的代码不需要ID ,你可以放弃它们,除非你真的需要它们用于别的东西。
  • 这使用event delegation
  • .not()从jQuery中的列表中排除了一个元素。
  • this的“完整”回调中的.slideToggle()是指动画元素(因此,每个动画元素调用一次“完整”回调,而不是在所有选定元素完成滑动后调用 - 当你在某个时刻动画多个元素时要记住的事情)

答案 1 :(得分:1)

这是一个非常简单的功能,使用jQuery.on委托事件,.next.not功能可以在用户点击触发器时过滤选择。

/**
* @param [jQuery] $obj - the jQuery selection we want to accordionize
* @param [Object] opt  - optional settings
* @return [jQuery] $obj
*/
function accordionize($obj, opt){
    opt = $.extend({
        triggers: 'dt',
        content: 'dd'
    }, opt || {});

    // bind the click events to all elements that match our trigger selection
    $obj.on('click', opt.triggers, function(e){
        // Get the associated content element
        var $target = $(this).next(opt.content);
        $target.slideDown(function(){
            $obj.find(opt.content).not($target).slideUp();
        });    
    });
    // Create a custom event to setup accordion.
    // hides all content elements except the first.
    $obj.on('accordionize.reset', function(){
        $obj.find(opt.content).hide().first().show();
    });

    return $obj.trigger('accordionize.reset');
}

它要求您将内容包装在元素中:

<dl class="accordion">
    <dt>Topic One</dt>
    <dd>Ipsum loren</dd>
    <dt>Topic two</dt>
    <dd>Some fun facts about topic two</dd>
    <dt>Topic three</dt>
    <dd>Some fun facts about topic three</dd>
</dl>

<div class="accordion">
    <h3 class="trigger">Topic One</h3>
    <div class="content">Ipsum loren</div>
    <h3 class="trigger">Topic two</h3>
    <div class="content">Some fun facts about topic two</div>
    <h3 class="trigger">Topic three</h3>
    <div class="content">Some fun facts about topic three</div>
</div>

第一个示例使用description list,非常适合列表类别。

然后像这样调用函数:

accordionize($('dl.accordion'));
accordionize($('div.accordion'), {
  triggers: '.trigger',
  content: '.content'
});

答案 2 :(得分:0)

让我们使用它。

html :

<span id='A' class="category">
<div id='listA' class='list'>

<span id='B'class="category">
<div id='listB' class='list'>

<span id='C'class="category">
<div id='listC' class='list'>

<span id='D' class="category">
<div id='listD' class='list'>

//there are around 25 more of similar lists//

css :

.list {
    display: none;
}

javascript :

$(document).ready(function() {
  $(".category").click(function(){
      id = jQuery(this).attr("id");
      $(".list").slideUp();
      $("#list"+id).slideToggle();
  });
});

希望这可以按预期工作..

答案 3 :(得分:0)

我的理解是,无论何时点击类别,相应的列表都会向下滑动,而其他类别的列表会向上滑动。如果是这种情况,则无论何时单击任何类别,然后向上滑动所有列表并仅向下滑动属于类别的列表。

$(".category").click(function(){
      $(".list).slideUp();
      $(this).find('.list').slideDown();    
});

答案 4 :(得分:0)

你可以试试这样的东西

 $("span").on("click", function(){
  var that = $(this)
  that.slidToggle(function(){
  $("#listA,#listC,#listD").slideUp();});

});