3

我想遍历pages 并通过它们切换active类。我应该如何在不使用setclass的情况下做到这一点?

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');
4

3 回答 3

0

工作小提琴

您可以使用索引来获得 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>

于 2016-07-23T09:12:09.310 回答
0

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

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');
    }
  });
});

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

于 2016-07-23T11:07:24.100 回答
0

我假设通过“遍历”你的意思是你想以.page一定的顺序一个接一个地切换 div。如果是这种情况,请编写一个遍历树的算法:给定一个根,如果它是 a 则切换.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));
  });
}
于 2016-07-23T08:39:15.423 回答