【问题标题】:Get next element with class which is not sibling获取具有非同级类的下一个元素
【发布时间】:2016-07-23 08:15:36
【问题描述】:

我想遍历pages 并通过它们切换active 类。我应该如何不使用set

HTML

<div class="page active"></div>
<div class="set">
    <div class="page"></div>
    <div class="page"></div>
</div>
<div class="page"></div>

jQuery

$('.active').toggleClass('active').toggle().nextAll('.page').toggleClass('active');

【问题讨论】:

  • 你为什么不这样做$('.page').toggleClass('active') 它会将所有内容切换到相反的方向。
  • 为什么不使用.parent().closest() 然后使用find('.active')
  • 您正在使用toggleClass()toggle() 我认为有更好的方法,您可以省略两者之一。
  • @Trix 你想排除一页吗?为什么不使用:not('.page .active')
  • 您可以使用当前的.page.active索引,例如:jsfiddle.net/wdw4t0he

标签: javascript jquery siblings nextsibling


【解决方案1】:

我假设“遍历”是指您想按特定顺序一个接一个地切换.page div。 如果是这种情况,请编写一个遍历树的算法:给定一个根,如果它是 .page,则切换,并递归处理其每个子节点

function traverse(root){
  if(!root) return;
  if(root.hasClass('page')) root.toggle('active');
  root.children().forEach(function(child){
    traverse(child);
  });

  //lets say you want to bind to click event on every div
  $('div').click(function(){
    traverse($(this));
  });
}

【讨论】:

    【解决方案2】:

    不幸的是,我们没有直接的方法来找到下一个非同级元素,但我们可以使用 jquery 函数以多种方式处理这种情况。我刚刚尝试实现您的目标,请查看this working fiddle,如果您需要任何说明,请告诉我,还添加了一些内联 cmets 以供您理解。

    HTML:

    <div class="page active">div 1</div>
    <div class="page">div 2</div>
    <div class="set">
        <div class="page">set 1 - div 1</div>
        <div class="page">set 1 - div 2</div>
        <div class="page">set 1 - div 3</div>
    </div>
    <div class="page">div 5</div>
    <div class="set">
        <div class="page">set 2 - div 1</div>
        <div class="page">set 2 - div 2</div>
    </div>
    <div class="page">div 6</div>
    <button class="next-btn">Next</button>
    

    CSS:

    .active {
      color: red;
    }
    .next-btn {
      cursor: pointer;
    }
    

    Javascript:

    $(function() {
      $('button').click(function() {
        var elem = $(".page.active").toggleClass('active'); // current active element
        var nextElem = elem.next(); // next element
    
        // go above one level and get next element
        // if no next element exists, means end of the child level
        if (!nextElem.length) {
            nextElem = elem.parent().next();
        }
    
        // if next element has some PAGE children then update the first child element 
        if (nextElem.children('.page').length > 0 ) {
            nextElem.children('.page:first-child').toggleClass('active');
        } else if (nextElem.hasClass('page')) {
            nextElem.toggleClass('active');
        }
      });
    });
    

    这种方法处理具有一个子级别的场景,您可以使用递归函数将其扩展到多个级别,我认为这有助于您相应地处理您的场景。

    【讨论】:

      【解决方案3】:

      Working fiddle

      您可以使用索引来获取 DOM 中的下一个元素,使用活动的索引 +1 然后激活它,我认为以下是您正在寻找的内容:

      var getActiveIndex = function(){
          var active_index;
          $('.page').each(function(i){
              if ( $(this).hasClass('active') )
                  active_index = i;
          })
          return active_index;
      }
      
      $('body').on('click', '.next', function(){
          var active_page_index = getActiveIndex(); //Get active page index
          var new_index = active_page_index+1; //Set the next page index
          var next_page = $('.page:eq('+new_index+')'); //Get the next page
      
          $('.page').removeClass('active');
      
          if(next_page.length)
            next_page.addClass('active');
          else
            $('.page:first').addClass('active');
      })
      

      我希望这会有所帮助。

      var getActiveIndex = function(){
        var active_index;
        $('.page').each(function(i){
          if ( $(this).hasClass('active') )
            active_index = i;
        })
        return active_index;
      }
      
      $('body').on('click', '.next', function(){
        var active_page_index=getActiveIndex();
        var new_index = active_page_index+1;
        var next_page = $('.page:eq('+new_index+')');
      
        $('.page').removeClass('active');
      
        if(next_page.length)
          next_page.addClass('active');
        else
          $('.page:first').addClass('active');
      })
      .active{
        background-color: red; 
        color: white;
      }
      <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
      <div class="page active">page</div>
      <div class="set">
        <div class="page">- Set page</div>
        <div class="page">- Set page</div>
      </div>
      <div class="page">page</div>
      <div class="page">page</div>
      <div class="page">page</div>
      <div class="set">
        <div class="page">- Set page</div>
        <div class="page">- Set page</div>
      </div>
      <div class="page">page</div>
      <br>
      <button class='next'>Active the next page</button>

      【讨论】:

      • Tnx 给你时间和答案,但请不要像我说的那样清楚,我不想在sets 内跳过pages。我想遍历所有pages,无论是在set 内还是外。
      • @Trix 不是你要找的吗?
      • @A 提供了使用索引。 Cmets 中的 Wolff,但我认为这就像一种变通方法,应该有其他明确的方法来做到这一点。
      • 这只是评论中的一个闪光点,通过单击活动链接(我在你的 OP 中找不到)来工作,这让它变得有点容易.. 它可能是一种解决方法,因为 jquery还没有提供可以顺利完成这个技巧的功能,所以 IMO 这只是实现您想要的结果的可能方法......祝你好运。
      猜你喜欢
      • 2017-02-01
      • 2013-09-27
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多