2015-05-09 3 views
7

У меня есть список элементов, которые я хочу пройти через любую точку в любом направлении. Я также хочу, чтобы цикл вокруг списка, то есть, если я попаду в последний элемент списка и нажмите дальше, я хочу, чтобы следующий элемент был первым элементом в списке. Моя страница проста, просто неупорядоченный список из 5 элементов, 2 кнопки (один для предыдущего и один для следующего) и текстовое поле, которое отображает результаты. Вот мой код:Перемещение списка с помощью 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>

Как он сидит, когда я нажимаю или подойти последний элемент, нажав на кнопку рядом очищает текстовое поле и делает обе кнопки не реагирует. Логически, я знаю, что должен быть оператор if, указывающий, является ли текущий элемент последним, тогда следующий элемент должен быть первым элементом. Я просто не мог понять, как его кодировать. Вот jsfiddle:

jsfiddle

ответ

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

Когда он достигнет до последнего или первого сделать следующий параметр в качестве элемента последний и первый, это решит проблему.

Для следующего:

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

Для предыдущего:

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

Демо: https://jsfiddle.net/763x97qb/1/

0

Не уверен, если это поможет, но вот плагин JQuery я придумал, чтобы изменить порядок списка элементов, начиная от поставки индекса:

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

В Например, вызов .reorder(3) будет перемещать все элементы за третьим индексом в фронт массива, что позволит вам затем перебрать вашу коллекцию с $.each в ожидаемом порядке.

2

здание на верхней части вашего кода, вы можете проверить, если текущий элемент является последним или первым элементом, и поставить некоторые условия, как это:

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

Вы можете использовать selectedItem.is(':first-child') и selectedItem.is(':last-child') селекторы, чтобы найти, если вы достигли начала или конца списка. Затем вы можете выбрать первый или последний элемент списка, перейдя к родителю и нахождение первого/последнего ребенка с selectedItem.parent().find('li:first') или 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

Попробуйте используя id из button к тексту цикла 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>

Смежные вопросы