焦点选项卡索引中的下一个元素

2022-08-30 04:08:59

我正在尝试根据具有焦点的当前元素将焦点移动到选项卡序列中的下一个元素。到目前为止,我还没有在搜索中发现任何东西。

function OnFocusOut()
{
    var currentElement = $get(currentElementId); // ID set by OnFocusIn 

    currentElementId = "";
    currentElement.nextElementByTabIndex.focus();
}

当然,nextElementByTabIndex是它工作的关键部分。如何在 Tab 键序列中找到下一个元素?该解决方案需要基于JScript,而不是像JQuery这样的东西。


答案 1

我从来没有实现过这个,但我研究过类似的问题,这就是我会尝试的。

引用 jQuery 实现时,您必须:

  1. 侦听 Tab 和 Shift+Tab
  2. 了解哪些元素是可制表符的
  3. 了解 Tab 键顺序的工作原理

1.侦听选项卡和Shift + Tab

监听Tab和Shift+ Tab可能在网络上的其他地方得到了很好的覆盖,所以我将跳过这一部分。

2. 了解哪些元素是可制表符的

知道哪些元素是可制表符的,这比较棘手。基本上,如果元素是可聚焦的并且没有设置属性,则该元素是可制表符的。因此,我们必须问哪些元素是可聚焦的。以下元素是可聚焦的:tabindex="-1"

  • input、、、和未禁用的元素。selecttextareabuttonobject
  • a和具有 set 的数值或具有数值的元素。areahreftabindex
  • 具有 set 的数值的任何元素。tabindex

此外,仅当以下情况时,元素才可聚焦:

  • 它的祖先都不是。display: none
  • 的计算值为 。这意味着要设置的最近祖先必须具有 值 。如果未设置上级,则计算值为 。visibilityvisiblevisibilityvisiblevisibilityvisible

更多详细信息在另一个堆栈溢出答案中。

3. 了解 Tab 键顺序的工作原理

文档中元素的 Tab 键顺序由属性控制。如果未设置任何值,则为 有效 。tabindextabindex0

文档的顺序为:1、2、3、...、0。tabindex

最初,当元素(或没有元素)具有焦点时,Tab 键顺序中的第一个元素是最低的非零。如果多个元素具有相同的元素,则按文档顺序进行,直到到达具有 该 元素的最后一个元素。然后,您将移动到下一个最低点,该过程将继续。最后,以零(或空)结束这些元素。bodytabindextabindextabindextabindextabindex


答案 2

以下是我为此目的构建的内容:

function focusNextElement () {
    //add all elements we want to include in our selection
    var focussableElements = 'a:not([disabled]), button:not([disabled]), input[type=text]:not([disabled]), [tabindex]:not([disabled]):not([tabindex="-1"])';
    if (document.activeElement && document.activeElement.form) {
        var focussable = Array.prototype.filter.call(document.activeElement.form.querySelectorAll(focussableElements),
        function (element) {
            //check for visibility while always include the current activeElement 
            return element.offsetWidth > 0 || element.offsetHeight > 0 || element === document.activeElement
        });
        var index = focussable.indexOf(document.activeElement);
        if(index > -1) {
           var nextElement = focussable[index + 1] || focussable[0];
           nextElement.focus();
        }                    
    }
}

特征:

  • 可配置的可聚焦元素集
  • 无需 jQuery
  • 适用于所有现代浏览器
  • 快速和轻量级