【问题标题】:How do you make the $(this) selector focus on current element?如何让 $(this) 选择器关注当前元素?
【发布时间】:2013-03-28 17:48:04
【问题描述】:

如何让$(this) 选择器关注当前元素?在这个 jsfiddle 中,我已经将它安装在一个指定的元素中,所以你不能按 enter 来激活你“所在”的按钮。 http://jsfiddle.net/mathzarro/gd6Ep/1/

这是棘手的部分:$("button:first").trigger('focus');

附言。我已经说过我作为一种表情安装了!最初的编码员是伊恩,这是链接..谢谢@Ian! http://jsfiddle.net/Vtn5Y/

【问题讨论】:

  • ps。向上和向下箭头浏览按钮
  • $("button:first") 显然永远是第一个按钮。为什么不liSelected.trigger('focus')
  • 您有非li 元素作为ul 的子元素。这是不允许的。
  • @Joqus 有一点改进,但​​是硬编码有两个按钮的事实仍然不是很好,如果你点击也仍然不起作用。请参阅jsfiddle.net/GQv26/2,您可以拥有任意数量的按钮
  • @Joqus 有时,当我看到糟糕的代码还有很大的改进空间时,我会很兴奋。其中有很多技术,每个人在自己处理键盘导航时都可以使用。希望少数人能从中学到一些技巧

标签: javascript navigation focus this hotkeys


【解决方案1】:

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"));
});

Here's a working example

此外,jsfiddle 很棒,但您也应该在此处发布代码相关代码。

Improvement suggestion

您发布的代码存在brittle queries,内部耦合,即更改HTML结构不是很灵活。我已经重新编写了您的代码,使其处于更好的状态。以下是主要功能

  • Tab 键不会中断
  • 适用于您需要的任意数量的按钮
  • 第一个或最后一个 div 没有硬编码(智能环绕)
  • 输出 div 没有硬编码,全部在一个地方处理,依赖于它是第 n 个被单击的按钮这一事实。
  • 上/右前进,下/左后退
  • 无需自己跟踪元素,这就是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();
    }
});

【讨论】:

  • Muchas gracias Juan,太棒了!我独立开发了一个支持键盘的 openerp 版本,它将帮助很多买不起触摸屏硬件的人。你介意看看我的另一个问题并告诉我如何将这个问题的 jsfiddle 连接到另一个提到的 xml 文件题?谢谢! stackoverflow.com/questions/15683251/…
  • @matt_zarro 我看了另一个问题,它又指向了这个问题???我真的不明白你想要什么与这里不同。请不要在这里再问这个问题,解决这个问题,添加你从这个问题中获得的知识。这就是帖子在 SO 中保持有用的方式。如果我试图专门解决您的问题(通过此处的 cmets),这些帖子对其他人的用处不大。
  • 这很了不起@Juan,很抱歉造成混乱。我会更好地解释情况。我们正在使用的 openerp 的主文件是一个 xml。我添加了一个 html 和一个脚本标签来输入到目前为止开发的脚本。现在我也尝试了你的最后一个出色的代码,但它在 xml 上下文中不起作用。我认为,如果您查看 xml 文件,您将对正在发生的事情有更好的了解。这是:matheus25.site90.net/pos.xml
  • 另外,如果您想使用“检查元素”,这就是销售点。 demo1.openerp.com/…
  • @matt_zarro 当我转到该页面时,它被视为 XML,而不是 HTML,我只能看到它的源代码。您将遇到的问题是元素必须能够接收焦点。因此,您可以将tabindex="-1" 用于按钮之类的标签,以便字段可聚焦。见jsfiddle.net/Vtn5Y/391
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-26
  • 2015-05-09
  • 1970-01-01
  • 2012-02-27
  • 2015-12-06
  • 2011-01-24
  • 2011-05-04
相关资源
最近更新 更多