【问题标题】:KeyBoard Navigation for menu using jquery使用 jquery 的菜单的键盘导航
【发布时间】:2009-09-11 06:01:38
【问题描述】:

我正在尝试将键盘导航添加到菜单(基于 ul li ) ,我已将 keydown 事件绑定到菜单(或者我应该将 keydown 绑定到文档吗?)

使用的处理函数如下所示

 KeyDown: function(e) {        

    var toFocus = false;


                  if (e.keyCode == 38) {
         toFocus = $((e.target/* li */).next()[0]);
      }
                          if (e.keyCode == 40) {
         toFocus = $((e.target).next()[1]);
      }
    if (toFocus) {
        $(e.target).attr('tabIndex', '-1');
        $(toFocus).attr('tabIndex', '0');
        toFocus.focus();
        return false;
        }
        }

这里我得到 e.target as html 而不是 li ?

你能建议任何其他方式来添加键盘导航吗?

【问题讨论】:

标签: javascript jquery keyboard-navigation


【解决方案1】:

尝试使用自定义属性来保持tabid的上下。

...KeyDown: function(e) {
    var Direction;
    if (e.keyCode == 38)
         Direction = "toUp";
    else Direction = "toDown";

    var Focus = $("li[tabid=\""$(e.target.id).attr(Direction)"\"]");
    Focus.focus();
}

---

<li ... tabid="1" toUp="-1" toDown= "2" />
<li ... tabid="2" toUp= "1" toDown= "3" />
<li ... tabid="3" toUp= "2" toDown= "4" />
<li ... tabid="4" toUp= "3" toDown="-1" />

上面的代码只是为了展示想法,现在已经很晚了,我没有时间测试它。所以请不要因为我不工作而投票给我。

希望有帮助

【讨论】:

    【解决方案2】:

    我只是想知道,与其自己做这件事,为什么不使用已经存在的插件?

    jQuery Keyboard Navigation

    演示page here

    我的演示:只是添加一个demo page 的示例

    【讨论】:

    • 我的插件很复杂,我只需要将焦点设置到我的菜单上,然后让e.target返回当前菜单项
    • 你在开玩笑吧?复杂的?伙计……请看我自己的例子,告诉我这一切有什么复杂的! :-)
    • 感谢演示,顺便说一句,我的意思是插件的使用很复杂,我提到插件关于 xy 位置 n 东西的复杂计算,我上面提到的代码唯一的问题就是它返回 html 作为 event.target ,我只需要找到当前有焦点的 li
    • 您以更简洁的方式执行所有这些代码行,并且对于未来的更新比查看您的代码要好得多;) - 只需一行代码,您就可以在导航中完成所有操作(init 行)其余的只是动画,向您展示一些不错的效果。
    • 底线是,为什么要重新发明轮子?代码重用是我们作为开发人员首先应该做的事情。
    【解决方案3】:

    HTML

    <body>
        <input type="text" id="target-box" >
        <ul class="list">
            <li class="selected">Hello</li>
            <li>World</li>
        </ul>
    </body>
    

    jQuery

    $(document).on('focus','#target-box', function() {
        var target_box = $(this);
    
        $(document).on('keyup', function(e) {
    
            if(e.which == 38){ // up arrow
                var selected_item = $('.selected');
                if(typeof selected_item.prev()[0] !== 'undefined') {
                    selected_item.prev().addClass('selected');
                    selected_item.removeClass('selected');
                }
            } else if (e.which == 40) { // down arrow
                var selected_item = $('.selected');
                if (typeof selected_item.next()[0] !== 'undefined') {
                    selected_item.next().addClass('selected');
                    selected_item.removeClass('selected');
                }
            }
    
            if (e.keyCode == 13) { // enter
                target_box.val($('.selected').html());
            }
        });
    });
    

    CSS

    .selected {
        width : 50px;
        background-color: gray;
    }
    

    【讨论】:

      猜你喜欢
      • 2011-03-29
      • 2011-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多