如何创建tabindex组?

2023-11-25

我正在尝试创建 tabindex 组,其中按组中的选项卡它总是在该组中旋转,直到另一个组通过 javascript 或手动聚焦。

问题:是否可以在没有 JavaScript 的情况下做到这一点,如果不能,我该如何实现这一点?

Here is jsFiddle

HTML代码:

<fieldset>
    <input tabindex="1"/>
    <input tabindex="2"/>
</fieldset>

<fieldset>
    <input tabindex="1"/>
    <input tabindex="2"/>
</fieldset>

EDIT:我希望 iframe 作为解决这个问题的最后手段,在我的应用程序的开发阶段很难实现 iframe。


这就是我想到的

这是相当混乱的代码,但这就是我想到的。添加data-tabgroup and data-tabgroupindex to input元素将正确地标记它们而不会脱离组。

As steveax指出在这条评论不建议没有键盘的用户或在任何常规 HTML 表单情况下这样做,因为这并不是真正必要的。

示例中jsFiddle
使用的库:

  • 洛达什.js
  • jquery 1.8.3

HTML 代码:

<div>
    <input data-tabgroup="first" data-tabgroupindex="1" />
    <input data-tabgroup="first" data-tabgroupindex="2" />
    <input data-tabgroup="first" data-tabgroupindex="3" />
    <input data-tabgroup="first" data-tabgroupindex="4" />
</div>
<div>
    <input data-tabgroup="second" data-tabgroupindex="1" />
    <input data-tabgroup="second" data-tabgroupindex="3" />
    <input data-tabgroup="second" data-tabgroupindex="2" />
    <input data-tabgroup="second" data-tabgroupindex="4" />
</div>

JavaScript 代码:

function isNumber(n) {
    return !isNaN(parseFloat(n)) && isFinite(n);
}
$(document).on('keydown', '[data-tabgroup]', function (e) {
    // TODO
    // Get elements tabgroup [DONE]
    // Find element position by tabgroupindex
    // Check if pressed shift+tab or tab
    // Check if it's first or the last element
    // Check which is next element to focus
    // Focus appropriate element

    if (e.which === 9) {

        var indexNode = $(e.target);
        var nodeIndex = indexNode.data("tabgroupindex");
        var tabgroup = indexNode.data("tabgroup");
        var tabgroupNodes = $("[data-tabgroup='" + tabgroup + "']");
        var tabgroupIndexes = [];
        _.each(tabgroupNodes, function (item) {
            tabgroupIndexes.push(+$(item).data("tabgroupindex"));
        });
        tabgroupIndexes = _(tabgroupIndexes).compact()
            .sortBy(function (num) {
            return num;
        }).value();
        if (isNumber(nodeIndex)) {
            if (e.which === 9) if (e.shiftKey) {
                var nextElement = tabgroupIndexes[tabgroupIndexes.indexOf(nodeIndex) - 1];
                if (typeof(nextElement) === "undefined") {
                    $("[data-tabgroup='" + tabgroup + "'][data-tabgroupindex='" + tabgroupIndexes[tabgroupIndexes.length - 1] + "']").focus();
                    console.log($("[data-tabgroup='" + tabgroup + "'][data-tabgroupindex='" + tabgroupIndexes[tabgroupIndexes.length - 1] + "']").get(0));
                } else {
                    $("[data-tabgroup='" + tabgroup + "'][data-tabgroupindex='" + nextElement + "']").focus();
                }
            } else {

                var nextElement = tabgroupIndexes[tabgroupIndexes.indexOf(nodeIndex) + 1];

                if (typeof(nextElement) === "undefined") {
                    console.log("Im in ")
                    $("[data-tabgroup='" + tabgroup + "'][data-tabgroupindex='" + tabgroupIndexes[0] + "']").focus();
                    console.log($("[data-tabgroup='" + tabgroup + "'][data-tabgroupindex='" + tabgroupIndexes[0] + "']").get(0))
                } else {
                    $("[data-tabgroup='" + tabgroup + "'][data-tabgroupindex='" + nextElement + "']").focus();
                }
            }

        } else {
                $("[data-tabgroup='" + tabgroup + "'][data-tabgroupindex='" + tabgroupIndexes[0] + "']").focus();

        }
        e.preventDefault();
    }
});

JQuery UI 有一个:tababble选择器可以帮助你在这里。

  1. 选择组中所有最后一个选项卡可选元素。
  2. 捕获选项卡输入。
  3. 手动选择第一个选项卡可选同级。
  4. (对于第一个选项卡可选元素上的 Shift + Tab 也是如此。)

JSFiddle

JavaScript

$(function(){
    // Listen for TAB on last child.
    $('fieldset :tabbable:last-child').on('keydown', function(e) {
        if (e.which == 9) {
            e.preventDefault();
            $(this).siblings(':tabbable').eq(0).focus();
        } 
    });

    // Listen for SHIFT + TAB on first child.
    $('fieldset :tabbable:first-child').on('keydown', function(e) {
        if (e.shiftKey && e.which == 9) {
            e.preventDefault();
            $(this).siblings(':tabbable').eq(-1).focus();
        } 
    });
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何创建tabindex组? 的相关文章

随机推荐

  • 使用 Toolkit 时 Windows Phone 7 页面转换非常慢

    我遇到的问题是 每当我使用 Windows Phone 7 Toolkit 中的页面转换时 转换速度非常慢 并且整个应用程序似乎有框架掉落 动画 结结巴巴 还有其他人遇到过这种情况吗 我正在使用TransitionFrame类作为 Root
  • django 过滤器 icontains 仅匹配整个单词

    我正在使用过滤器 icontains 来搜索单词 但我只希望它匹配整个单词 例如如果我寻找肝脏 我不希望它返回 我的查询看起来像这样 MyModel objects filter title icontains search word 我见
  • 如何动态创建可在父作用域中访问的函数?

    这是一个例子 function ChildF Creating new function dynamically DynFEx function DynF Hello DynF Invoke Expression DynFEx Callin
  • 计算运输箱尺寸的粗略估计

    我正在尝试找到计算运输所需的箱子尺寸的最佳方法 我有 3 个不同尺寸的集装箱 我在数据库中定义了产品的宽度 长度 深度和质量 我想知道如何找到需要运输的最小箱子数量 以及考虑到购物车中的物品数量 这些箱子的最小尺寸 我当前的 想法 是找到整
  • 常数的哪一个性质使其不可改变?

    今天我面临一次面试 其中有一个问题对我来说非常棘手 面试官说 如何让常数能够改变它的值 我回答 使用指针 并向他展示了一个例子 int main void const int a 3 int ptr ptr int a printf A d
  • PHP、Postgres 帮助使用 RETURNING

    我想我了解 PostgreSQL 和 RETURNING 的工作原理 我找到了很多很多资源 如果我明白的话 它会看起来像 INSERT INTO table column2 column3 VALUES value1 value2 RETU
  • 如何在 Windows 上设置 cmake CXX 变量

    我收到以下错误 正在使用 Microsoft Windows 版本 6 1 7601 ErrorS CMake Warning at CMakeLists txt 4 project To use the NMake generator c
  • Android:打开活动而不保存到堆栈中

    我有 2 个活动 主要活动和列表活动 从 Main 你可以打开 List 从列表中您可以打开Main 我希望列表的每次打开都能如此not被保存到 历史 中 所以 从 Main 返回cannot返回列表 是否可以 当开始你的清单时Activi
  • libc.so.6 在 Linux 内核中的相关性 [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我的问题是Linux内核是否包含libc so 6 经过谷歌搜索并浏览不同的链接后 我们发现libc so 6 不是 Linux 内核的一部分 因为内核在内核空间中为自己的使用而实现
  • JUnit 测试类未显示在 JMeter 中

    我正在尝试使用 JMeter 2 7 运行 JUnit 测试 但是 当在 JUnit 采样器的下拉列表中选择测试类时 它们不会显示 据我发现 这是因为测试类是从另一个类扩展的 AbstractJUnit4SpringContextTests
  • String 中的 Java Date 对象无法正常工作

    我遇到了一个似乎无法解决的顽固问题 我在 stackoverflow 上寻找解决方案 并找到了很多关于 Java 日期格式化的帖子 但没有具体针对我遇到的问题 基本上 我需要将日期字符串转换为 java util Date 对象 我正在使用
  • mongoDB中字符串字段值长度

    该字段的数据类型是String 我想获取字段名称字符长度大于 40 的数据 我尝试了这些查询但返回错误 1 db usercollection find where this name length gt 40 limit 2 output
  • 使用 Core Data 检索唯一结果集

    我有一个基于核心数据的应用程序 用于管理一堆实体 我希望能够执行以下操作 我有一个实体 SomeEntity 其属性为 名称 类型 等级 foo1 foo2 现在 如果我们严格按照 SQL 术语来讲 SomeEntity 有几行 我想要完成
  • ?android:attr/selectableItemBackground 与另一个现有背景

    我有一个 9patch 设置为布局的背景 但是我仍然想通过使用提供触摸反馈selectableItemBackground attr 我尝试过使用
  • 如何使用 bash 或 jq 检查 json 是否为空?

    我有一个函数可以检查 json 文件内的对象中保存的重复值 当发现重复项时 该函数返回如下内容 Basket1 Apple Orange Basket2 Apple Orange 如果没有找到重复项 则返回空列表 目前我正在使用 s在 ba
  • Perl 调试器可以将 ReadLine 历史记录保存到文件中吗?

    我暂时停止使用 lib ReadLine 和 lib Perl Readline 然而 Perl 调试器拒绝保存会话命令行历史记录 因此 每次调用调试器时 我都会丢失以前的所有历史记录 有谁知道如何让 Perl 调试器保存并希望附加类似于
  • CRecordset::snapshot 在 VS2012 中不再工作 - 有什么替代方法吗?

    显然 在 VS2012 中 SQL CUR USE ODBC 已被弃用 更新 光标库似乎已从 VS2012 中完全删除 MFC 的 CDatabase 不再使用它 而它是 VS2010 和早期版本的 MFC 的默认值 而是使用 SQL CU
  • 在 r 中按日期和时间对数据帧进行排序和排名

    我有一个数据框如下 最初它只是两列 变量 时间戳 包含日期和时间 和 演员 我将 时间戳 变量分解为 日期 和 时间 然后将 时间 进一步分解为 小时 和 分钟 然后给出以下结构 dataf lt structure list hours
  • Java/GWT 和 Scala/Lift 哪个框架更好?

    我想开始一个新的 Web 应用程序项目 但我对 GWT Java 或 Lift Scala 这两个框架感到困惑 所以我想听听您的意见我选择哪一个 根据我的项目要求 两者都很好 那么根据框架比较 请告诉我哪个好 我发现 GWT 对于客户端来说
  • 如何创建tabindex组?

    我正在尝试创建 tabindex 组 其中按组中的选项卡它总是在该组中旋转 直到另一个组通过 javascript 或手动聚焦 问题 是否可以在没有 JavaScript 的情况下做到这一点 如果不能 我该如何实现这一点 Here is j