jQuery切换列表菜单问题

时间:2015-03-18 06:05:27

标签: javascript jquery html css toggle

当我点击该部分内的跨度时,应该只切换该部分内的列表。但是会发生的是每个部分中的每个列表都被切换,而不仅仅是属于我点击的部分的列表。

HTML:

<section class="tutorial-box">
  <p>
    <a href="#">Link #1</a>
    <br />
    Some text.
    <br />
    <span class="view-contents plus-sign">Click Here</span>
  </p>

  <ul class="tutorial-box-list">
    <li><a href="#">link</a></li>
    <li><a href="#">link</a></li>
  </ul>

  <div class="clear"> </div> <!-- end div class clear -->
</section> <!-- end section class tutorial-box -->

<section class="tutorial-box">
  <p>
    <a href="#">Link #2</a>
    <br />
    Some more text.
    <br />
    <span class="view-contents plus-sign">Click Here</span>
  </p>

  <ul class="tutorial-box-list">
    <li><a href="#">link</a></li>
    <li><a href="#">link</a></li>
  </ul>

  <div class="clear"></div> <!-- end div class clear -->

</section> <!-- end section class tutorial-box -->

CSS:

.tutorial-box{
  clear: both;
  width: 100%;
  height: auto;
  margin: 5px 0 10px 0;
  padding: 0;
}
.tutorial-box p{
  margin: 5px 0;
  padding: 0;
}
.view-contents{
  margin: 0;
  padding: 0 0 0 20px;
  cursor: pointer;
}
.plus-sign{
  margin: 0;
  padding: 0 0 0 20px;
  background: url("../images/plus-icon.png") 0 0 no-repeat;
}
.minus-sign{
  margin: 0;
  padding: 0 0 0 20px;
  background: url("../images/minus-icon.png") 0 0 no-repeat;
}

jQuery / JavaScript:

$(document).ready(function(){
  $('.tutorial-box-list').hide();
  $('.view-contents').click(function() {
    if($('.tutorial-box span').hasClass('plus-sign')) {
      $('.tutorial-box-list').slideToggle('2000');
      $('.tutorial-box span').addClass('minus-sign').removeClass('plus-sign');
    }
    else {
      $('.tutorial-box-list').slideToggle('2000');
      $('.tutorial-box span').addClass('plus-sign').removeClass('minus-sign');
    }
  });

  $('.toggle').each(function(){
    $(this).find('.toggle-content').hide();
  });
});

任何帮助将不胜感激。

6 个答案:

答案 0 :(得分:1)

为什么因为您试图切换班级tutorial-box-list。您已为这两个内容分配了此类。所以,代码同时切换了两个内容。

只需使用

$(this).parent().next().slideToggle('2000');

无视

$('.tutorial-box-list').slideToggle('2000');

以下是 jsfiddle Demo

答案 1 :(得分:1)

你需要找到相对于被点击元素的元素,所以

jQuery(function ($) {
    $('.tutorial-box-list').hide();
    $('.view-contents').click(function () {
        var $this = $(this);
        $(this).closest('.tutorial-box').find('.tutorial-box-list').slideToggle('2000');
        $this.toggleClass('minus-sign plus-sign');
    });

    $('.toggle').each(function () {
        $(this).find('.toggle-content').hide();
    });
});

演示:Fiddle

答案 2 :(得分:1)

道歉考虑我在移动设备上。问题看起来就像每次使用$('.tutorial-box span')时,它会使用它在页面上找到的所有元素。 如果您只想影响该元素,请使用

$(this) 

它只会影响被点击的那个。如果您想访问父节,请使用

$(this).closest('.tutorial-box') 

如果你喜欢我可以旋转我的笔记本电脑并为你创造一个小提琴。

答案 3 :(得分:0)

尝试此点击事件

$('.view-contents').click(function() {
      var section = $(this).closest('section');
      var sectionSpan =section.find('.tutorial-box span');
      var sectionList = section.find('.tutorial-box-list');
    if(sectionSpan.hasClass('plus-sign')) {
     sectionList.slideToggle('2000');
     sectionSpan.addClass('minus-sign').removeClass('plus-sign');
    }
    else {
      sectionList.slideToggle('2000');
     sectionSpan.addClass('plus-sign').removeClass('minus-sign');
    }
  });

答案 4 :(得分:0)

您可以尝试下面的代码,您可以使用toggleClass同时添加/删除'plus-signminus-sign。并使用closest让父tutorial-box找到tutorial-box-list来切换它。

$('.view-contents').click(function() {
      $(this).closest('.tutorial-box').find('.tutorial-box-list').slideToggle('2000');
      $(this).toggleClass('plus-sign minus-sign');
  });

<强> JSFiddle Demo

答案 5 :(得分:0)

你可以更新你的js