这是一个不使用任何全局 JavaScript 状态的解决方案。这使得它比使用这种状态的解决方案更简单,因为在这里我们检查标记以找到它的当前状态。因此,该解决方案在某些方面更加稳健(没有数据冗余,不能有不同步状态)。
正如您所说,您必须跟踪当前选定的元素。但是,如果您使用专用的 CSS 类进行突出显示,则 CSS 类本身可以用作指示当前突出显示的元素的标记。
以下分别用于上下移动的函数应该可以解决问题。只需从每个按键处理程序中调用正确的处理程序。当前突出显示的列表项假定具有 CSS 类highlighted
。我使用了一个辅助函数moveBy
来实现最大的代码重用。
已编辑:使用 jQuery 重写了示例index
,以实现对向上、向下页面等的更直接的支持。
var moveUp = function(list) { moveBy(-1, list); };
var moveDown = function(list) { moveBy(+1, list); };
var pageUp = function(list) { moveBy(-10, list); };
var pageDown = function(list) { moveBy(+10, list); };
var first = function(list) { moveBy(-$(list).children().length, list); };
var last = function(list) { moveBy(+$(list).children().length, list); };
var moveBy = function(delta, list) {
list = $(list);
var count = list.children().length;
var current = list.children('.highlighted');
if (!current.length) {
// There are no highlighted items.
// Highlight the first or the last, depending on whether
// delta is up (negative), or down (positive).
list.get(delta > 0 ? 0 : count - 1).addClass('highlighted');
} else {
// Find the next element according to delta. Do not wrap around.
var nextIndex = current.index() + delta;
nextIndex = Math.max(0, Math.min(count - 1, nextIndex));
var next = list.get(nextIndex);
// Switch highlighting.
current.removeClass('highlighted');
next.addClass('highlighted');
}
};