【问题标题】:How to implement navigation between <span> with the arrow keys?如何使用箭头键实现 <span> 之间的导航?
【发布时间】:2012-04-14 03:13:53
【问题描述】:

我正在制作我自己的组合框,以获得比&lt;select&gt; 标签更好的设计。

顺便说一下,我想知道,如何使用键盘的箭头键在&lt;span&gt;(或其他&lt;p&gt;...)之间进行导航,并使用“tab”键显示建议.就像&lt;select&gt; 标签的&lt;option&gt;

这是我想让它工作的地方:

HTML

<input type="text" id="myInput" value=""/>
<div id="myDiv">
    <span>Value 1</span>    
    <span>Value 2</span>
    <span>Value 3</span>
</div>

​ CSS

#myDiv {display:none;border:1px solid #000;}
span  {display:block;background:#EDEDED;cursor:pointer;}
span:hover {background:#555;color:#FFF;}

JS

$(document).ready(function(){
    $('#myInput').focus(function(){
        $('#myDiv').slideDown();
    });    

    $('span').click(function(){
         $('#myInput').val($(this).html());
         $('#myDiv').slideUp();
    });
});​

你可以在这里测试它:http://jsfiddle.net/eHpKX/2/

编辑示例:例如,在输入中单击或制表符,然后使用箭头键导航...不起作用。

我们将不胜感激。

【问题讨论】:

标签: javascript jquery html forms


【解决方案1】:

我为uparrowdownarrow 编写了一个keydown 处理程序,就像选择下拉菜单一样。但是tab 键在切换到下一个字段时具有特定的作用,所以我不想prevtDefault 浏览器行为。请参阅下面的代码,您可以从那里构建更多内容,

DEMO

CSS:

span.active {background:#555;color:#FFF;}

JS:

$(document).ready(function() {
    $('#myInput').focus(function() {
        if ($('#myDiv span.active').length == 0) {
            $('#myDiv span:first').addClass('active');
        }
        $('#myDiv').slideDown();
    }).focusout(function() {
        $('#myDiv').slideUp();
    });
    $('span').click(function() {
        $('#myInput').val($(this).html());
    }).mouseenter(function() {
        $('#myDiv span').removeClass('active');
    }).keydown(function(e) {
        alert(e.which);

    });

    //keydown event
    $('#myInput').keydown(function(e) {
        var $actvOpt = $('#myDiv span.active');
        if (e.which == 13) { //enter key
            if ($actvOpt.length != 0) {
                $(this).val($actvOpt.text());
                $('#myDiv').slideUp();
            }
            return;
        }

        var actvIndex = $actvOpt.removeClass('active').index();
        var optCount = $('#myDiv span').length;

        if (e.which == 40) { //keydown
            actvIndex += 1;
        } else if (e.which == 38) { //keydown
            actvIndex -= 1;
        }

        if (actvIndex < 0) actvIndex = optCount - 1;
        else if (actvIndex >= optCount) actvIndex = 0;

        $('#myDiv span:eq(' + actvIndex + ')').addClass('active');

        $actvOpt = $('#myDiv span.active');
        $(this).val($actvOpt.text());        
    });
});

【讨论】:

  • 太棒了!但是跨度没有得到任何关注,所以我认为无法使用回车键更新输入。对于制表,我找到了一个带有输入的解决方案......,我已经在你的解决方案中实现了它,但是标签和箭头不一样,请看这里:jsfiddle.net/eHpKX/6
  • @Valky 不建议使用输入字段作为选项。我们可以为输入键做一些事情。让我看看。顺便说一句,你希望tab 表现如何。在常规选择框中,选项卡不会跳转到下一个选项。它会跳转到下一个输入字段。
  • 是的,你是对的,我有点疯了! Tab 只需要显示 div 就像单击主输入一样,并使用箭头来选择一个字段。然后单击或输入键,将值发送到主输入。
  • @Valky 查看 Enter 按键的更新代码,并且 keydown/keyup 将动态更新文本框值。
  • 完美,我现在可以更改它的一些功能。非常感谢。我还更改了主题的标题...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-26
  • 2011-10-14
  • 1970-01-01
  • 2015-07-21
相关资源
最近更新 更多