Перемещаться по списку с помощью клавиш со стрелками? (JavaScript / JQ)
Я не могу найти ответ на то, как это сделать, но это функция, которую я видел несколько раз. По сути, я повторяю список, и я хотел бы создать возможность выделить и выбрать эти элементы с помощью клавиш со стрелками/enter. Может ли кто-нибудь помочь мне понять, как я могу это сделать? Я знаю, как использовать keycodes (конечно), просто не как превратить это в функциональный код для выбора элементов в списке...
Я думал, может быть, мне нужно немного вид скрытого переключателя, чтобы отметить его как выбранный или нет... но даже тогда я не знаю, как бы я прыгал с одной радиокнопки на другую вверх и вниз по списку. Поэтому, если кто-нибудь может помочь мне с этим, я был бы очень признателен. Спасибо.
3 ответов
поскольку вы на самом деле не объяснили, с чем у вас проблемы, я просто создал общее решение. Надеюсь, это поможет:
var li = $('li');
var liSelected;
$(window).keydown(function(e) {
if(e.which === 40) {
if(liSelected) {
liSelected.removeClass('selected');
next = liSelected.next();
if(next.length > 0) {
liSelected = next.addClass('selected');
} else {
liSelected = li.eq(0).addClass('selected');
}
} else {
liSelected = li.eq(0).addClass('selected');
}
} else if(e.which === 38) {
if(liSelected) {
liSelected.removeClass('selected');
next = liSelected.prev();
if(next.length > 0) {
liSelected = next.addClass('selected');
} else {
liSelected = li.last().addClass('selected');
}
} else {
liSelected = li.last().addClass('selected');
}
}
});
JSFiddle: http://jsfiddle.net/Vtn5Y/
мой пример для родного JavaScript
var ul = document.getElementById('list');
var liSelected;
var index = -1;
document.addEventListener('keydown', function(event) {
var len = ul.getElementsByTagName('li').length-1;
if(event.which === 40) {
index++;
//down
if (liSelected) {
removeClass(liSelected, 'selected');
next = ul.getElementsByTagName('li')[index];
if(typeof next !== undefined && index <= len) {
liSelected = next;
} else {
index = 0;
liSelected = ul.getElementsByTagName('li')[0];
}
addClass(liSelected, 'selected');
console.log(index);
}
else {
index = 0;
liSelected = ul.getElementsByTagName('li')[0];
addClass(liSelected, 'selected');
}
}
else if (event.which === 38) {
//up
if (liSelected) {
removeClass(liSelected, 'selected');
index--;
console.log(index);
next = ul.getElementsByTagName('li')[index];
if(typeof next !== undefined && index >= 0) {
liSelected = next;
} else {
index = len;
liSelected = ul.getElementsByTagName('li')[len];
}
addClass(liSelected, 'selected');
}
else {
index = 0;
liSelected = ul.getElementsByTagName('li')[len];
addClass(liSelected, 'selected');
}
}
}, false);
function removeClass(el, className) {
if(el.classList) {
el.classList.remove(className);
} else {
el.className = el.className.replace(new RegExp('(^|\b)' + className.split(' ').join('|') + '(\b|$)', 'gi'), ' ');
}
};
function addClass(el, className) {
if(el.classList) {
el.classList.add(className);
} else {
el.className += ' ' + className;
}
};
li.selected {background:yellow}
<ul id="list">
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
<li>Item 4</li>
</ul>
Это может зависеть от браузера. Это, кажется, работает только если Радио входы находятся рядом друг с другом (лейбл тоже ок).
<input type="radio" ... />
<input type="radio" ... />
<input type="radio" ... />
но это нарушит радионавигацию в Firefox и, вероятно, других браузерах:
<div><input type="radio" ... /> ... </div>
<div><input type="radio" ... /> ... </div>
это раздражает, как только вы хотите сделать что-то немного сложнее, чем простой список (категории...).