如何使$(this)
选择器专注于当前元素?在这个jsfiddle,我已经安装它只进入指定的元素,所以你不能按Enter键来激活你所在的按钮。 http://jsfiddle.net/mathzarro/gd6Ep/1/
这是一个棘手的部分:$("button:first").trigger('focus');
聚苯乙烯。我已经说过我作为一个表达!最初的编码器是Ian,这里是链接..谢谢@Ian! http://jsfiddle.net/Vtn5Y/
答案 0 :(得分:2)
HazMat提到了真正的问题,你专注于错误的元素(总是使用$("button:first").trigger('focus');
的第一个按钮。
在你的keydown处理程序结束时调用liSelected.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很棒但你也应该在这里发布代码相关的代码。
您发布的代码受到brittle queries内部耦合的影响,也就是说,它对于更改HTML结构不是很灵活。我已经重新编写了你的代码,以便它的形状更好。以下是主要功能
这是代码
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();
}
});