グローバルな 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');
}
};