2015-05-09 9 views
7

Ho un elenco di elementi che voglio attraversare da qualsiasi punto in qualsiasi direzione. Voglio anche aggirare l'elenco, cioè se finisco sull'ultimo elemento dell'elenco e clicco su Avanti, voglio che il prossimo elemento sia il primo elemento dell'elenco. La mia pagina è semplice, solo una lista non ordinata di 5 elementi, 2 pulsanti (uno per il precedente e uno per il successivo) e una textarea che visualizza i risultati. Qui è il mio codice:Attraversare un elenco con 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>

Come si siede, quando scatto sopra o avvicino l'ultima voce, premendo il pulsante accanto cancella la textarea e rende entrambi i pulsanti non rispondono. Logicamente, so che ci deve essere una dichiarazione if se si afferma che l'elemento corrente è l'ultimo elemento, quindi l'elemento successivo deve essere il primo elemento. Non riuscivo a capire come codificarlo. Ecco l'jsfiddle:

jsfiddle

risposta

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

Quando si raggiunge a durare o prima fare elemento successivo impostando come l'ultimo e il primo risolverà il problema.

Per il prossimo:

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

Per precedente:

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

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

0

Non sono sicuro se questo aiuta, ma qui è un plugin jQuery sono arrivato fino a riordinare un elenco di elementi a partire da un indice di dotazione:

$.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() { ... 

Nel Ad esempio, chiamando .reorder(3) si sposteranno tutti gli elementi oltre il terzo indice nella parte anteriore dell'array, consentendo quindi di eseguire iterazioni sulla collezione con $.each nell'ordine previsto.

2

Basandosi sulla cima del vostro codice, è possibile verificare se l'elemento corrente è l'ultimo o il primo elemento, e mettere alcune condizioni come questo:

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

È possibile utilizzare selectedItem.is(':first-child') e selectedItem.is(':last-child') selettori da trovare se hai raggiunto l'inizio o la fine della lista. Quindi è possibile selezionare il primo o l'ultimo elemento della lista andando al genitore e trovare il primo/ultimo figlio con selectedItem.parent().find('li:first') o 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

Prova utilizzando id di button in testo ciclo 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>

Problemi correlati