1

我试图在单击按钮时在li's 和 combineeach()和方法之间携带一个类。eq()我对上一个和下一个按钮使用相同的代码,i+1i-1它返回给我不同的问题。

这是要检查的jsFiddle。

html:

<span class="prev">prev</span>
<ul>
    <li>0</li>
    <li>1</li>
    <li class="active">2</li>
    <li>3</li>
    <li>4</li>
</ul>
<span class="next">next</span>

jQuery:

var li = $('li');

$('.prev').click(function() {
    li.each(function(i) {
        if ( $(this).hasClass('active') ) {
            console.log(i);
            //this returning current true value = 2

            li.removeClass('active');
            li.eq(i-1).addClass('active');
            //this is working better
            //problem is: not selecting 4
        }
    });
});

$('.next').click(function() {
    li.each(function(i) {
        if ( $(this).hasClass('active') ) {
            console.log(i);
            //this returning current true value = 2

            //problem starts:
            //li.removeClass('active');
            //when this is active; all active classes are gone

            li.eq(i+1).addClass('active');
            //try to select next 'li' here
            //but it is selecting all li's bigger than current value
        }
    });
});
4

5 回答 5

4

我会尝试使用更像:

这是工作的jsFiddle。

$(".next").click(function(){
    if($("li.active").next().length > 0){
        $("li.active").removeClass("active").next("li").addClass("active");
    }
});
$(".prev").click(function(){
    if($("li.active").prev().length > 0){
        $("li.active").removeClass("active").prev("li").addClass("active");
    }
});​

使用“下一个”选择器:Jquery Next

我尽可能避免数学。数数很难:-)。也就是说,我认为您上面的问题可能与索引有关。很难说。在处理这样的列表时,我会避免使用像“li”这样的选择器。尝试在它的“ul”部分放置一个类,并将你的 li 寻址为:“.myList li”

于 2012-08-13T13:06:17.730 回答
1

你应该return false;在找到你的第一类之后:http active: //jsfiddle.net/ufomammut66/np4Pt/

发生的事情是您迭代前进的元素并按顺序更改每个元素。因此,当您遍历每个案例时,您将按顺序设置下一个为活动状态,这反过来又使下一个$(this).hasClass('active')检查为真。这就是 prev 事件起作用的原因,我们以循环的相反顺序移动。所以我们只需要在找到我们的活动案例后停止迭代我们的集合。

编辑 1

您可以.length在任何选定对象上使用来获取返回的数量。因此,在您提供的示例代码中,我们可以使用li.length来获取页面上有多少个 li 元素。您可能希望使用类选择器来确保不使用其他 li 元素来计算您的上限。我已经更新了 jsFiddle 以反映这些变化。

于 2012-08-13T13:05:10.850 回答
1

如果由于某种原因您需要索引,您总是可以这样做:

$('.prev').on('click', function() {
    var i = $(".active").index();
        i--;
    $(".active").removeClass('active');
    $('li').eq(i).addClass('active');
});

$('.next').on('click', function() {
    var i = $(".active").index();
        i = i >= $('li').length-1 ? 0 : i+1;
    $(".active").removeClass('active');
    $('li').eq(i).addClass('active');
});​

小提琴

如果不 :

$('.prev, .next').on('click', function() {
    if ($(".active")[$(this).attr('class')]().index()!=-1)
    $(".active").removeClass('active')[$(this).attr('class')]().addClass('active');
});

小提琴

于 2012-08-13T13:10:47.977 回答
0

你甚至可以试试这个:

$('.prev').click(function() {
    var el = $.find('li[class=active]'); 
    //check if are prev li
    if(!$(el).prev().is(':first')) $(el).removeClass('active').prev().addClass('active');
});

$('.next').click(function() {
    var el = $.find('li[class=active]'); 
    //check if are next li
    if(!$(el).next().is(':last')) $(el).removeClass('active').next().addClass('active');
});
于 2012-08-13T13:11:27.463 回答
0

尝试以下更新的 jsFiddle

var li = $("li");

$(".prev").click(function() {
    var activeLI = $("li.active");
    var index = $(activeLI).index();

    $(activeLI).removeClass('active');

    if (index > 0) {
        $(activeLI).prev().addClass('active');
    } else {
        $(li).last().addClass('active');
    }
});

$(".next").click(function() {
    var activeLI = $("li.active");
    var index = $(activeLI).index() + 1;

    $(activeLI).removeClass('active');

    if (index < li.length) {
        $(activeLI).next().addClass('active');
    } else {
        $(li).first().addClass('active');
    }
});

这将循环到最后一个活动元素(如果前一个在第一个)和第一个元素活动(如果下一个在最后一个)。

于 2012-08-13T13:21:14.073 回答