【问题标题】:Prev and next buttons to change divs用于更改 div 的上一个和下一个按钮
【发布时间】:2016-12-22 13:41:00
【问题描述】:

我正在尝试在 jQuery 中创建一个代码,将活动类添加到下一个 div 并将其从前一个 div 中删除,反之亦然。这一切都记住了我想稍后添加的动画。

如果您想查看带有 HTML 和 CSS 的代码: http://codepen.io/salman15/pen/kXVmRG?editors=1010

$(document).ready(function() {
    $('#next').click(function() {
        var location = $(this).parent().parent();
        $('.active').removeClass('active');
        $('div').next('#case').addClass('active');
    });

    $('#prev').click(function() {
        var location = $(this).parent().parent();
        $('.active').removeClass('active');
        $(this).prev('#case').removeClass('active');
    });
});

【问题讨论】:

  • 您能详细描述一下您遇到了什么问题吗?
  • 该代码不会将活动类的代码添加到下一个div,而是添加到所有div。并且根本不将类添加到前一个类中
  • 您的 HTML 无效 - 您多次重复了 #case#tX 元素。 id 属性必须是唯一的
  • 但是我如何将活动类传递给下一个兄弟姐妹呢?

标签: jquery html css


【解决方案1】:

您不应该为您的div 元素提供相同的id 值:这是无效的HTML。而是使用 "case" 作为 class 值。

要应用 active 类,您可以链接到 removeClass 方法,找到下一个 div,然后应用 addClass元素。

这是一个简化的 sn-p:

$(document).ready(function(){
  $('#next').click(function(){
    if ($('.active').next('.case').length) {
        $('.active').removeClass('active')
                    .next('.case')
                    .addClass('active');
    }
  });
  $('#prev').click(function(){
    if ($('.active').prev('.case').length) {
        $('.active').removeClass('active')
                    .prev('.case')
                    .addClass('active');
    }
  });
});
.active { background: yellow; border: 1px solid }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="next">
  <h1>next</h1>
</div>
<div id="prev">
  <h1>prev</h1>
</div>
<div class="case active">content 1</div>
<div class="case">content 2</div>
<div class="case">content 3</div>

【讨论】:

  • 谢谢,为什么用同一个id不好?
  • HTML 标准规定它必须是唯一的。 DOM 方法期望这条规则为真。如果你不遵守这条规则,你会得到意想不到的结果。因此,例如,$('#case') 永远不会返回超过一个匹配项,即使您提供了更多相同 id 的元素。
  • 感谢分享知识!
  • 如果您不介意我还有一个问题,在编辑您的代码时我遇到了错误。当我点击最后一个 div codepen.io/salman15/pen/rLRZrJ 时,我可以继续按 next 和 prev
  • 条件($('.in1,.in2,.in3').next('.t1,.t2,.t3').length) 在(例如).in2 有一个t3 作为下一个兄弟时也为真,在这种情况下你需要为假。您应该只测试其中一个,如下所示:($('.in1').next('.t1').length)。如果您有更多这样的问题,我可以建议您为此创建一个新问题吗?这样一来,您将有更多的人关注它,并且您和回答的人也会得到一些奖励。
【解决方案2】:

正如@rory-mccrossan 在 cmets 中指出的那样,您的 HTML 和 JS 存在很大缺陷。

这是一个非常简单的例子。

$(function() {
    var nextBtn = $("#next"),
        prevBtn = $("#prev");
  
    nextBtn.on('click', function(e) {
        var active = $(".active");
        var next = active.next('.case');
        if (next.length) {
            active.removeClass('active');
            next.addClass('active');
        }
    });
    prevBtn.on('click', function(e) {
        var active = $(".active");
        var prev = active.prev('.case');
        if (prev.length) {
            active.removeClass('active');
            prev.addClass('active');
        }
    });
});
.active {
  background-color: red;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul>
  <li class="case active">One</li>
  <li class="case">Two</li>
  <li class="case">Three</li>
  <li class="case">Four</li>
</ul>
<button id="prev">Prev</button>
<button id="next">Next</button>

next.lengthprev.length 检查在那里,因此当您到达列表末尾时,它不会超过它。

【讨论】:

    【解决方案3】:
    //file
     $(document).ready(function(){
    
      $('.d1 li.s1').click(function(){
       $('li').removeClass("active");
      $(this).addClass("active");
      });
      $('ul.ddd li.ggg').click(function(){
        $('li').removeClass("active");
        $(this).addClass("active");
    });
     $(".next").click(function(){
     i=1
                var $toHighlight = $('.active').next().length > 0 ? $('.active').next() : $('#MainMenu li.s1').first();
                $('.active').removeClass('active');
                $toHighlight.addClass('active');
                });
    
    
             $(".previous").click(function(){
                var $toHighlight = $('.active').prev().length > 0 ? $('.active').prev() : $('ul.mainmenu1 li.s1').last(); 
    
                $('.active').removeClass('active');
                $toHighlight.addClass('active');
            });
    });
    

    【讨论】:

      【解决方案4】:
      1. 向要更改的 div 添加自定义类,例如 div-1、div-2。
      2. 添加一个计数器来指示哪个 div 处于活动状态。
      3. 点击 NEXT 或 PREV 增加或减少此计数器,从所有 div 中删除活动类并将其添加到具有 div-{counter} 类的项目。
      4. 记得在计数器大于 div 数时禁用 NEXT 按钮,当计数器小于 1 时禁用 PREV 按钮。

      【讨论】:

        【解决方案5】:
        $('.ggg').click(function(){
           $('.ggg,.sss').removeClass("active");
          $(this).addClass("active");
          $(this).next();
          });
        
         var x22 = $( "#MainMenu" ).find( ".ggg" ).length;
         //alert(x22);
        
         var i = 118;
            var hrefa2;
              $(".previous").click(function () {
        
              hrefa = $( "#MainMenu").find(".ggg").eq(i).attr("alt");
               //hrefa3 = $("#MainMenu").find(".ggg").eq(0);
             i--;
            //alert(hrefa);
             $('.ggg').removeClass("active");
            $( "#MainMenu" ).find( ".ggg" ).eq(i).addClass("active");
         });
        
          var i = 0;
            var hrefa;
              $(".next").click(function () {
        
              hrefa = $( "#MainMenu").find(".ggg").eq(i).attr("alt");
              //hrefa1 = $("#MainMenu").find(".ggg").eq(0);
             i++;
            //alert(hrefa);
             $('.ggg').removeClass("active");
            $( "#MainMenu" ).find( ".ggg" ).eq(i).addClass("active");
         });
        

        【讨论】:

        • 请添加解释支持您的答案。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-09
        • 2015-07-09
        • 2021-12-25
        • 2017-12-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多