本当の問題はHazMatによって言及されました.あなたは間違った要素に焦点を合わせていました$("button:first").trigger('focus');
.
keydownliSelected.trigger('focus');
ハンドラーの最後で呼び出し、他の呼び出しを削除する$("button:first").trigger('focus');
と、問題が解決します。
あなたはまた別の問題を抱えています
$("button:eq(1)").click(function () {
// Why are you calling this? Remove this line
$("button:eq(0)").trigger('click');
update($("span:last"));
});
これが実際の例です
また、jsfiddle は素晴らしいですが、コード関連のコードもここに投稿する必要があります。
改善提案
あなたが投稿したコードは、脆弱なクエリ、内部カップリングに苦しんでいます。つまり、HTML 構造の変更に対してあまり柔軟ではありません。より良い形になるように、コードを作り直しました。主な機能はこちら
- タブしても壊れない
- 必要な数のボタンに対応
- 最初または最後の div のハードコーディングなし (スマート ラップ アラウンド)
- n 番目にクリックされたボタンであるという事実に依存することで、すべて 1 か所で処理される出力 div のハードコーディングはありません。
- 上/右で前進、下/左で後退
- 自分で要素を追跡する必要はありません。それがdocument.activeElementの目的です
- コードの各セクションは分離されています
- 選択したボタンにクラスを追加します (CSS のみ) (したがって、「選択した」クラスをボタンに追加する必要はありません。
- 出力の更新
- 次のボタンにフォーカスを設定する
これがコードです
var buttons = $('button');
var spans = $('span');
// Update the span when button is clicked
buttons.click(function(e){
var span = $(spans[Array.prototype.indexOf.call(buttons, document.activeElement)]);
span.text(parseInt(span.text(), 10) + 1);
});
// Handle the navigation, set focus on the next element
$(window).keydown(function(e){
var isLeft = e.which === 38 || e.which === 37,
isRight = e.which === 40 || e.which === 39;
if(isLeft || isRight){
var currentButtonIndex = Array.prototype.indexOf.call(buttons, document.activeElement);
var nextButtonIndex;
if (currentButtonIndex === -1) {
nextButtonIndex = 0;
} else {
var toAdd = isLeft ? -1 : 1;
nextButtonIndex = (currentButtonIndex + toAdd + buttons.length) % buttons.length;
}
buttons[nextButtonIndex].focus();
}
});