我有一个 html 表单。
- 它使用键盘导航(带有箭头键)在字段之间移动,包括“输入”键。
- 它需要定期提示用户接受信息。
- 回车键在按钮和表单域中都被拾取。
问题:当用户在接受按钮上点击“ENTER”时,它会在我的表单中触发双重事件。移动焦点 2 个字段而不是 1 个。
我有代码可以准确地演示我在这里谈论的内容:
原帖http://jsfiddle.net/mcraig_brs/UgUUr/1/
修改后的帖子http://jsfiddle.net/mcraig_brs/UgUUr/2/
这是示例 HTML:
<button id="myButton">Press Enter On Me</button><br>
<input type="text" id="text1" class="tInput" data-index="0"><br>
<input type="text" id="text2" class="tInput" data-index="1"><br>
<input type="text" id="text3" class="tInput" data-index="2"><br>
<div id="log"></div>
这是示例JS:
function log ( data ) {
$('#log').append(data + "<br>");
}
function focusOn(index) {
log("focusOn(index): " + index);
$('input.tInput').eq(index).focus();
}
function focusNext( currentIndex ) {
log("focusNext(currentIndex):" + currentIndex);
focusOn(currentIndex + 1);
}
function focusPrevious (currentIndex) {
log('focusPrevious(currentIndex):' + currentIndex);
focusOn(currentIndex - 1);
}
$('#myButton').on('click', function(e) {
log("event:click #myButton");
focusOn(0);
});
$('input.tInput').on('keyup', function(e) {
switch (e.which) {
case 13:
log("event:ENTER key in input.tInput");
focusNext($(this).data('index'));
break;
case 38:
log("event:UP ARROW key in input.tInput");
focusPrevious($(this).data('index'));
break;
case 40:
log('event:DOWN ARROW key in input.tInput');
focusNext($(this).data('index'));
break;
}
});
当我在焦点位于当前代码中的按钮上时按“ENTER”时,我在日志 div 中得到以下输出:
event:click #myButton
focusOn(index): 0
event:ENTER key in input.tInput
focusNext(currentIndex):0
focusOn(index): 1
(目前在 jsFiddle 中,我可以访问该按钮的唯一方法是关注第一个文本字段并将“shift+tab”返回到它以便它具有焦点,以便我可以按“ENTER”。但是在实时代码,它会自动为用户聚焦。)
问题:如何防止这种类型的双重事件触发?我试过 e.stopPropagation() 但这并没有产生我想要的结果。当用户按下“ENTER”时,我希望焦点只前进 1 个字段。
我已经为此苦苦挣扎了几天,所以任何帮助将不胜感激。请注意,如果用户用鼠标单击按钮,它会正常工作,只有 ENTER 键会触发双重事件。
注意:我不得不稍微修改我的问题以更好地传达约束。