使用选项卡而不是移动到第二个表单时,请将焦点循环放在表单的输入上

Keep focus looping on inputs of form when using tab instead of moving to second form

我想在按下 tab 时将焦点限制在一个表单上。
我的意思是关注表单 1 的选项卡索引 1、2 和 3,然后在同一表单内移回 1,然后是 2,等等,永远不会形成 2 的输入。我也不想更改标签索引。

<form style="background-color:red">
    <input tabindex="01"/>
    <input tabindex="02"/>
    <input tabindex="03"/>
</form>

<form style="background-color:blue">
    <input tabindex="01"/>
    <input tabindex="02"/>
    <input tabindex="03"/>
</form>

这不是一个好的做法,所以不要这样做,除非确实有 这样做的充分理由...


但是没有内置的 HTML 方法来执行此操作,因此我们需要使用一些 JavaScript 以及自定义 data attribute.

我认为对 parent<form>)使用数据属性最简单,这样我们就不必添加它每个输入单独。我将我的命名为 data-tabgroup.

然后我们需要一些 JS:

// Select the tab groups based on the data attribute we added
var tabgroups = document.querySelectorAll("[data-tabgroup]");

// Loop through each to attach the listeners we need
for (var i = 0; i < tabgroups.length; i++) {
  var inputs = tabgroups[i].querySelectorAll("[tabindex]");

  // Loop through all of the elements we want the tab to be changed for
  for (var j = 0; j < inputs.length; j++) {

    // Listen for the tab pressed on these elements
    inputs[j].addEventListener("keydown", function(myIndex, inputs, e) {
      if (e.key === "Tab") {
        // Prevent the default tab behavior
        e.preventDefault();

        // Focus the next one in the group
        if (inputs[myIndex + 1]) {
          inputs[myIndex + 1].focus();
        } else { // Or focus the first one again
          inputs[0].focus();
        }
      }
    }.bind(null, j, inputs)) // Make a copy of the variables to use in the addEventListener
  }
}
<form style="background-color: red" data-tabgroup>
  <input tabindex="01" />
  <input tabindex="02" />
  <input tabindex="03" />
</form>

<form style="background-color: blue" data-tabgroup>
  <input tabindex="01" />
  <input tabindex="02" />
  <input tabindex="03" />
</form>

就是这样!这是 demo.


一些注意事项:

  • 当前的实现忽略组内 tabindex 的值(它只选择 HTML 中的下一个值)。考虑到这一点,您只需要将元素按其 tabindex 的顺序放入数组中,或者在将它们添加到数组后按 tabindex 对它们进行排序。
  • 当前的实施要求将 tabindex 应用于您希望其影响的 children。如果您希望它默认应用于所有输入,只需将 inputsquerySelectorAll 值更改为 input。如果您想要更复杂的东西,则必须根据需要进行更改。
<input type="text" class="first-index"/>

<input type="text" />

<button type="button" class="last-index">save</button>
<script>
    $(document).on('blur','.last-index',function() {
      $('.first-index').focus();
    });
</script>