2015-05-09 13 views
7

Mam listę przedmiotów, które chcę przejść z dowolnego punktu w dowolnym kierunku. Chciałbym również pętli wokół listy, co oznacza, że ​​jeśli trafię na ostatni element listy i kliknij na następny, chcę, aby następny element był pierwszym elementem na liście. Moja strona jest prosta, zawiera tylko nieuporządkowaną listę 5 elementów, 2 przyciski (jeden dla poprzedniego i jeden dla następnego) oraz obszar tekstowy wyświetlający wyniki. Tu jest mój kodu:Przechodzenie do listy z jQuery

$(function() { 
 
    var prev = $("#prev"); // grabbing the prev button 
 
    var next = $("#next"); // grabbing the next button 
 
    var listItems = $("#listItems p"); // grabbing the p elements of the list items 
 
    var results = $("#results"); // grabbing the textarea 
 
    var itemText; // variable for holding the text node 
 
    var selectedItem; // variable for the current selected item 
 

 
    listItems.click(function() { // click event for any item 
 
    itemText = $(this).text(); // selects the text of the clicked list item 
 
    results.text(itemText); // adds text to textarea 
 
    selectedItem = $(this).parent(); // sets selected item as the li element of the selected p element 
 
    }); 
 

 
    next.click(function() { // click event for next button 
 
    var nextItem = selectedItem.next(); // setting the next item 
 
    itemText = nextItem.children("p").text(); // grabbing the text of the next item 
 
    results.text(itemText); // adds text to textarea 
 
    selectedItem = nextItem; // sets next item 
 
    }); 
 

 
    prev.click(function() { // click event for the prev button 
 
    var prevItem = selectedItem.prev(); // setting the prev item 
 
    itemText = prevItem.children("p").text(); // grabbing the text of the prev item 
 
    results.text(itemText); // adds text to textarea 
 
    selectedItem = prevItem; // sets prev item 
 
    }); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> 
 
<ul id="listItems"> 
 
     <li><p>First item</p></li> 
 
     <li><p>Item 2</p></li> 
 
     <li><p>Item 3</p></li> 
 
     <li><p>Item 4</p></li> 
 
     <li><p>Last item</p></li> 
 
</ul> 
 
<button id="prev">Prev</button> 
 
<textarea name="results" id="results" cols="30" rows="1"></textarea> 
 
<button id="next">Next</button>

Jak się siedzi, gdy kliknę lub zbliżyć się do ostatniego elementu, naciskając przycisk Dalej czyści textarea i czyni oba przyciski odpowiadać. Logicznie, wiem, że musi istnieć instrukcja if stwierdzająca, czy bieżący element jest ostatnim elementem, to następny element musi być pierwszym elementem. Po prostu nie mogłem wymyślić, jak to zakodować. Oto jsfiddle:

jsfiddle

Odpowiedz

0
$(function() { 
    var prev = $("#prev"); 
    var next = $("#next"); 
    var listItems = $("#listItems p"); 
    var results = $("#results"); 
    var itemText; 
    var selectedItem; 

    listItems.click (function() { 
     itemText = $(this).text(); 
     results.text(itemText); 
     selectedItem = $(this).parent(); 
    }); 

    next.click (function() { 
     var nextItem = selectedItem.next(); 
     if(nextItem.length==0){ 
      nextItem = $("#listItems li").first(); 
     }    
     itemText = nextItem.children("p").text(); 
     results.text(itemText); 
     selectedItem = nextItem; 
    }); 

    prev.click (function() { 
     var prevItem = selectedItem.prev(); 
     if(prevItem.length==0){ 
      prevItem = $("#listItems li").last(); 
     } 
     itemText = prevItem.children("p").text(); 
     results.text(itemText); 
     selectedItem = prevItem; 
    }); 
}); 

Kiedy dotrze do ostatniego lub pierwszego uczynić następny element ustawienia jako ostatni i pierwszy to rozwiąże problem.

Na następny:

if(nextItem.length==0){ 
     nextItem = $("#listItems li").first(); 
    } 

Na ostatnich:

if(prevItem.length==0){ 
     prevItem = $("#listItems li").last(); 
    } 

Demo: https://jsfiddle.net/763x97qb/1/

0

Nie wiem, czy to pomoże, ale tutaj jest jQuery plugin wymyśliłem aby uporządkować listę elementów począwszy od doprowadzonej index:

$.fn.reorder = function(head) { 
    var arr = this; 
    var rest = arr.splice(head, arr.length - head); 
    return rest.concat(Array.prototype.slice.call(arr, 0)); 
}; 

// make the array start from the 3rd element 
$.each(listItems.reorder(3), function() { ... 

W na przykład wywołanie .reorder(3) spowoduje przeniesienie wszystkich elementów poza trzeci indeks do przodu tablicy, co umożliwi ci powtórzenie kolekcji w kolejności od $.each w oczekiwanej kolejności.

2

Opierając się na górnej części kodu, można sprawdzić, czy bieżący element jest ostatnim lub pierwszym elementem, i umieścić kilka warunków, takich jak ten:

next.click (function() { // click event for next button 
    var nextItem = ''; 
    if(selectedItem.index() == listItems.length -1){//if the last element 
     nextItem == listItems[0]; 
    }else{ 
    nextItem = selectedItem.next(); // setting the next item 
    itemText = nextItem.children("p").text(); // grabbing the text of the next item 
    results.text(itemText); // adds text to textarea 
    selectedItem = nextItem; // sets next item 
    } 
}); 

prev.click (function() { // click event for the prev button 
    var prevItem = ''; 
    if(selectedItem.index() == 0){//if the first element 
     prevItem == listItems[listItems.length-1] 
    }else{ 
    prevItem = selectedItem.prev(); // setting the prev item 
    itemText = prevItem.children("p").text(); // grabbing the text of the prev item 
    results.text(itemText); // adds text to textarea 
    selectedItem = prevItem; // sets prev item 
    } 
}); 
0

Można użyć selectedItem.is(':first-child') i selectedItem.is(':last-child') selektorów znaleźć, jeśli osiągnąłeś początek lub koniec listy. Następnie można wybrać pierwszy lub ostatni element listy wchodząc do rodzica i znalezienie pierwszego/ostatniego dziecka z selectedItem.parent().find('li:first') lub selectedItem.parent().find('li:last')

$(function() { 
    var prev = $("#prev"); 
    var next = $("#next"); 
    var listItems = $("#listItems p"); 
    var results = $("#results"); 
    var itemText; 
    var selectedItem; 

    listItems.on('click', function() { 
     itemText = $(this).text(); 
     results.text(itemText); 
     selectedItem = $(this).parent(); 
    }); 

    next.on('click', function() { 
     var nextItem; 
     //if i'm the last child, go to the parent and find the first child 
     if (selectedItem.is(':last-child')) 
      nextItem = selectedItem.parent().find('li:first'); 
     else 
      nextItem = selectedItem.next(); 
     itemText = nextItem.children("p").text(); 
     results.text(itemText); 
     selectedItem = nextItem; 
    }); 

    prev.on('click', function() { 
    var prevItem; 
    //if im the first child, go to the parent to find the last 
    if (selectedItem.is(':first-child')) 
     prevItem = selectedItem.parent().find('li:last'); 
    else 
     prevItem = selectedItem.prev(); 
    itemText = prevItem.children("p").text(); 
    results.text(itemText); 
    selectedItem = prevItem; 
    }); 
}); 
0

Spróbuj wykorzystując id o button do tekstu cyklu next, prev

var results = $("#results"); 
 
var items = $("#listItems li") 
 
// show first `li p` text 
 
results.text(items.eq(0).addClass("active").find("p").text()); 
 

 
function cycle(idx) { 
 
    var active = $(".active") 
 
    // cycle through `next` , `prev` `li` elements 
 
    , next = active[idx]().is("*") 
 
      ? active[idx]() 
 
      : idx === "prev" 
 
      ? active.siblings().eq(active.index("li") - 1) 
 
      : active.siblings().addBack().eq(0); 
 

 
    active.removeClass("active"); 
 
    // set text of `results` with `next` , `prev` `li p` text 
 
    results.text(next.addClass("active").find("p").text()); 
 
}; 
 

 
$("button").on("click", function(e) { 
 
    cycle(this.id) 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
 
<ul id="listItems"> 
 
    <li> 
 
    <p>First item</p> 
 
    </li> 
 
    <li> 
 
    <p>Item 2</p> 
 
    </li> 
 
    <li> 
 
    <p>Item 3</p> 
 
    </li> 
 
    <li> 
 
    <p>Item 4</p> 
 
    </li> 
 
    <li> 
 
    <p>Last item</p> 
 
    </li> 
 
</ul> 
 
<button id="prev">Prev</button> 
 
<textarea name="results" id="results" cols="30" rows="1"></textarea> 
 
<button id="next">Next</button>

Powiązane problemy