Моя проблема: я пытаюсь сделать функцию для перемещения классов ("prev", "current" и "next") из трех divs в следующие три div "menuItem" при нажатии клавиши со стрелкой вниз (код ключа 40), Единственная проблема заключается в том, как я могу ссылаться на следующие три div без создания объектов JS для каждого div и затем писать код для переключения классов между каждым div? В любом случае, я могу это сделать? jQuery UI имеет этот метод класса коммутатора, который поможет переключать классы. Я могу переключать классы среди div, которым присваиваются атрибуты класса "prev", "current" и "next", без проблем. Это переключает "следующий" класс на следующий div, что является проблемой. Я думал, что один из способов сделать это - ссылаться на индекс или, скорее, индекс элемента после div с атрибутом "next" класса, но не выяснили, как это сделать.
пример HTML:
<div class ="menu">
<div>content</div>
<div class ="menuItem prev">content</div>
<div class ="menuItem current">content</div>
<div class ="MenuItem next">content</div>
<div class="MenuItem">content</div>
<div class ="MenuItem">content</div>
<div>content</div>
</div>
пример JS:
function handleArrowKeydown(e){
event.preventDefault();
var scrollPos = menu.scrollTop();
var prevItem = $(".previous");
var currentItem = $(".current");
var nextItem = $(".next");
function classUpdater () {
prevItem.removeClass('previous');
currentItem.addClass('previous');
nextItem.addClass('current');
currentItem.removeClass('current');
return;
}
//code to execute on keydown of up arrow key
if (e.keyCode == '38'){
menu.animate({
"scrollTop":( scrollPos - 240)
}, 300);
}
//code to execute on keydown of down arrow key
else if (e.keyCode == '40'){
menu.animate({
"scrollTop":( scrollPos + 240)
}, 300);
console.log("down arrow pressed");
}
}
zoom.on({
"MozMousePixelScroll": handleMouseScroll,
"mousewheel": handleMouseScroll
});
window.addEventListener("keydown", handleArrowKeydown, false);
});
Вот рабочий стол, который использует селектора next()
и prev()
для перемещения классов между элементами. (Нажмите на панели результатов, затем используйте стрелки вверх и вниз. Это также повторяется, если вы удерживаете клавишу со стрелкой вниз.)
И вот код:
HTML
<div class ="menu">
<div>content</div>
<div class ="menuItem prev">content</div>
<div class ="menuItem current">content</div>
<div class ="menuItem next">content</div>
<div class="menuItem">content</div>
<div class ="menuItem">content</div>
<div>content</div>
</div>
JS
$(function() {
$(document).on("keydown", function(e) {
if (e.keyCode == 38) { //up arrow
e.preventDefault();
var menu = $("div.menu");
//get the current prev div
var prev = menu.find("div.prev");
//get the next prev div
var nextprev = prev.prev();
//see if we can move up any more
if (nextprev.length > 0) {
//move the prev class
prev.removeClass("prev");
nextprev.addClass("prev");
//move the current class
menu.find("div.current")
.removeClass("current")
.prev()
.addClass("current");
//move the prev class
menu.find("div.next")
.removeClass("next")
.prev()
.addClass("next");
}
}
if (e.keyCode == 40) { //down arrow
e.preventDefault();
var menu = $("div.menu");
//get the current next div
var next = menu.find("div.next");
//get the next next div
var nextnext = next.next();
//see if we can move down any more
if (nextnext.length > 0) {
//move the next class
next.removeClass("next");
nextnext.addClass("next");
//move the current class
menu.find("div.current")
.removeClass("current")
.next()
.addClass("current");
//move the prev class
menu.find("div.prev")
.removeClass("prev")
.next()
.addClass("prev");
}
}
});
});
CSS
.prev {
color: red;
}
.current {
color: blue;
font-weight: bold;
}
.next {
color: green;
}
Вы пытались использовать селектора jQuery?
$(this).next("div") // will return the next div
$(this).prev("div") // will return the previous div
$(this).next().next() // will return the element after the next element
В jQuery есть много полезных инструментов для перемещения DOM, таких как parent(), find(), child(), prev() и next(). Используйте их в своих интересах, но не забудьте включить jQuery, если вы еще этого не сделали.