聚焦标签索引中的下一个元素

IT技术 javascript jscript.net
2021-01-31 23:34:38

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

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

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

当然 nextElementByTabIndex 是这个工作的关键部分。如何在选项卡序列中找到下一个元素?该解决方案需要基于使用 JScript 而不是类似 JQuery 的东西。

6个回答

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

先试试这个

首先,我会看看您是否可以简单地为当前具有焦点的元素上的 Tab 键触发一个keypress事件对于不同的浏览器,可能有不同的方法来执行此操作。

如果这不起作用,你将不得不更加努力......

引用 jQuery 实现,您必须:

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

1. 听 Tab 和 Shift+Tab

听 Tab 和 Shift+Tab 可能在网络上的其他地方都有很好的介绍,所以我会跳过那部分。

2. 知道哪些元素是可制表的

知道哪些元素可以制表是比较棘手的。基本上,如果一个元素是可聚焦的并且没有tabindex="-1"设置属性,则它是可选项卡的那么我们必须询问哪些元素是可聚焦的。以下元素是可聚焦的:

  • inputselecttextareabuttonobject未禁用的元素。
  • aarea具有href或具有tabindex集合数值的元素
  • 任何具有tabindex集合数值的元素

此外,一个元素只有在以下情况下才是可聚焦的:

  • 它的祖先都不是display: none
  • 的计算值visibilityvisible这意味着要visibility设置的最近祖先的值必须为visible如果没有visibility设置祖先,则计算值为visible

更多细节在另一个Stack Overflow 答案中

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

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

tabindex文档顺序是:1, 2, 3, ..., 0。

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

我想知道同样的事情😅不知道哪个修复是正确的
2021-03-18 23:34:38
82 票没有任何评论来表明哪些建议的解决方案实际上有效?
2021-03-22 23:34:38

这是我为此目的构建的东西:

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
  • 适用于所有现代浏览器
  • 快速轻便
好方法,但它应该允许任何类型的输入hidden,也包括textareaselect
2021-03-20 23:34:38
这是最有效和资源友好的解决方案。谢谢!这是我的完整工作脚本:stackoverflow.com/a/40686327/1589669
2021-04-01 23:34:38
最好的 !必须是复杂的:在nextElementSibling可能是不可作为焦点,则下一个可选择的可能不是一个兄弟姐妹。
2021-04-02 23:34:38
我在下面添加了一个片段,包括按显式 TabIndex 排序 focussable.sort(sort_by_TabIndex)
2021-04-03 23:34:38

没有 jquery:首先,在您的可选项卡元素上,添加class="tabable"这将使我们稍后选择它们。(不要忘记下面代码中的“.”类选择器前缀)

var lastTabIndex = 10;
function OnFocusOut()
{
    var currentElement = $get(currentElementId); // ID set by OnFOcusIn
    var curIndex = currentElement.tabIndex; //get current elements tab index
    if(curIndex == lastTabIndex) { //if we are on the last tabindex, go back to the beginning
        curIndex = 0;
    }
    var tabbables = document.querySelectorAll(".tabable"); //get all tabable elements
    for(var i=0; i<tabbables.length; i++) { //loop through each element
        if(tabbables[i].tabIndex == (curIndex+1)) { //check the tabindex to see if it's the element we want
            tabbables[i].focus(); //if it's the one we want, focus it and exit the loop
            break;
        }
    }
}
class="tabbable" 而不是使用 name 属性
2021-03-14 23:34:38
var tabbables = document.querySelectorAll("input, textarea, button") // IE8+ ,在不修改 HTML 的情况下获取对所有 tabbables 的引用。
2021-03-18 23:34:38
请注意,使用 flexbox 元素的顺序在 DOM 中与在浏览器中的视觉效果不同。当您使用 flexbox 更改元素的顺序时,仅选择下一个可选项卡元素不起作用。
2021-03-20 23:34:38
一种无需为每个元素添加名称的解决方案(因为如果可行,有很多方法可以制作)将是理想的。
2021-03-30 23:34:38
好的,这是表格吗?如果你想要的所有元素的输入元素,可以更换线var tabbables = document.getElementsByName("tabable");var tabbables = document.getElementsByTagName("input");替代
2021-04-10 23:34:38

我创建了一个简单的 jQuery 插件,它就是这样做的。它使用 jQuery UI 的 ':tabbable' 选择器来查找下一个 'tabbable' 元素并选择它。

用法示例:

// Simulate tab key when element is clicked 
$('.myElement').bind('click', function(event){
    $.tabNext();
    return false;
});
这是迄今为止最好的解决方案。
2021-03-19 23:34:38
对于不想安装插件的人的简短预览:var selectables = $(':focusable'); var currentIndex = selectables.index($(':focus')); selectables.eq(currentIndex + 1).focus(); 该插件具有错误检查和更多选项。
2021-04-01 23:34:38

答案的核心在于找到下一个元素:

  function findNextTabStop(el) {
    var universe = document.querySelectorAll('input, button, select, textarea, a[href]');
    var list = Array.prototype.filter.call(universe, function(item) {return item.tabIndex >= "0"});
    var index = list.indexOf(el);
    return list[index + 1] || list[0];
  }

用法:

var nextEl = findNextTabStop(element);
nextEl.focus();

请注意,我不关心优先级tabIndex

@MattPennington 它将被忽略。过滤器是(尝试)加快搜索速度,请随意适应。
2021-03-16 23:34:38
是的,那会更“符合规范”。我不确定边缘情况,关于父元素等
2021-03-22 23:34:38
如果 tabindex 顺序与文档顺序相反怎么办?我认为数组必须按 tabindex 编号然后按文档顺序排序
2021-03-24 23:34:38
如果不是这些标签之一的项目具有 tabindex 属性怎么办?
2021-04-01 23:34:38