【问题标题】:Disabling tab focus on form elements禁用选项卡焦点在表单元素上
【发布时间】:2011-04-10 14:45:49
【问题描述】:

我在同一个表单中有多个divs。我要做的是禁用表单中divs 之一中的 Tab 键,而不禁用同一表单中其他divs 中的选项卡。

示例表格:

  • div1 - 禁用 Tab
  • div2 - Tab 工作
  • div3 - Tab 工作

【问题讨论】:

  • 当焦点在那个 div 上时你想禁用 tab 键吗?
  • 你的意思是,你不希望tab键导致浏览器跳转到那个div?
  • 感谢您的回复.. 是的,我正在使用灯箱效果.. 所以我希望 tab 键只能在最顶部打开的 div 上工作。
  • 选项卡焦点从顶层开始,当我继续使用选项卡时,它会转到底层.. 我需要选项卡只集中在顶部 div 上
  • @jAndy:但它可以!只需为其添加一个 tabindex 即可。

标签: javascript html


【解决方案1】:

您必须禁用或启用各个元素。我就是这样做的:

$(':input').keydown(function(e){
     var allowTab = true; 
     var id = $(this).attr('name');

     // insert your form fields here -- (:'') is required after
     var inputArr = {username:'', email:'', password:'', address:''}

     // allow or disable the fields in inputArr by changing true / false
     if(id in inputArr) allowTab = false; 

     if(e.keyCode==9 && allowTab==false) e.preventDefault();
});

【讨论】:

    【解决方案2】:

    与 Yipio 类似,我将notab="notab" 作为属性添加到我也想禁用选项卡的任何元素。然后我的 jQuery 是一行。

    $('input[notab=notab]').on('keydown', function(e){ if (e.keyCode == 9)  e.preventDefault() });
    

    顺便说一句,keypress 不适用于许多控制键。

    【讨论】:

    • 有人试过这个吗?这样做是为了防止标签 远离 元素,而不是 它。
    • @Timwi 我刚试过,它就像一个魅力。这实际上可以用来解决 OP 的问题 - 他只需将 notab="notab" 属性添加到他的“禁用选项卡”<div> 中的每个输入中,或者更新 jQuery 选择器以仅针对该 <div> 中的输入.
    【解决方案3】:
    $('.tabDisable').on('keydown', function(e)
    { 
      if (e.keyCode == 9)  
      {
        e.preventDefault();
      }
    });
    

    将 .tabDisable 放入所有选项卡禁用 DIV 喜欢

    <div class='tabDisable'>First Div</div> <!-- Tab Disable Div -->
    <div >Second Div</div> <!-- No Tab Disable Div -->
    <div class='tabDisable'>Third Div</div> <!-- Tab Disable Div -->
    

    【讨论】:

      【解决方案4】:

      一个简单的方法是把 tabindex="-1" 放在你不想被标签到的字段中。 例如

      <input type="text" tabindex="-1" name="f1">
      

      【讨论】:

      • 这不适用于我希望防止在 TABLE 中切换到 TD 的情况。
      【解决方案5】:

      在 Terry 的简单回答的基础上,我把它变成了一个基本的 jQuery 函数

      $.prototype.disableTab = function() {
          this.each(function() {
              $(this).attr('tabindex', '-1');
          });
      };
      
      $('.unfocusable-element, .another-unfocusable-element').disableTab();
      

      【讨论】:

      • 这不适用于我的情况:一张带有 TD 的表格,每个表格下面都有一个 DIV。
      • @mikerodent – 并非所有 HTML 元素都可以接收焦点。可以看到this answer
      • @ - Reggie Pinkham 很有趣。不过,TD 和 DIV 都可以:请看我的回答...
      【解决方案6】:

      如果您正在处理输入元素,我发现将指针焦点设置为返回本身很有用。

      $('input').on('keydown', function(e) { 
          if (e.keyCode == 9) {
              $(this).focus();
             e.preventDefault();
          }
      });
      

      【讨论】:

      • 我不明白...这可以防止跳出。
      【解决方案7】:

      我的情况可能不典型,但我想做的是让TABLE 中的某些列完全“惰性”:无法进入它们,也无法选择其中的任何内容。我从其他 SO 答案中发现类“不可选择”:

      .unselectable {
          -webkit-touch-callout: none;
          -webkit-user-select: none;
          -khtml-user-select: none;
          -moz-user-select: none;
          -ms-user-select: none;
          user-select: none;
      }
      

      这实际上阻止了用户使用鼠标将焦点放在TD ...但我无法在 SO 上找到防止标签进入单元格的方法。我的TABLE 中的TDs 实际上每个都有一个DIV 作为他们唯一的孩子,并且使用console.log 我发现实际上DIVs 会获得焦点(没有焦点首先由@987654329 获得@)。

      我的解决方案涉及跟踪“先前关注的”元素(页面上的任何位置):

      window.currFocus = document;
      //Catch any bubbling focusin events (focus does not bubble)
      $(window).on('focusin', function () {
        window.prevFocus = window.currFocus;
        window.currFocus = document.activeElement;
      });
      

      如果没有这种机制,我真的看不出你会怎么过...对各种用途都非常有用...当然,将它转换为最近的堆栈也很简单重点元素,如果你想要...

      最简单的答案就是这样做(对每个新创建的TD 中唯一的DIV 孩子):

      ...
      jqNewCellDiv[ 0 ].classList.add( 'unselectable' );
      jqNewCellDiv.focus( function() {
          window.prevFocus.focus();
      });         
      

      到目前为止一切顺利。应该清楚的是,如果您只有一个 TD(没有 DIV 孩子),这将起作用。 小问题:这只是停止在其轨道上死板。显然,如果表格在该行或下面的行中有更多单元格,您想要的最明显的操作是使制表符选项卡到下一个不可选择的单元格......在同一行上,或者,如果有其他行,在下面的行上。如果它是表格的最后,它会变得更加棘手:即标签应该去哪里。但一切都很好干净的乐趣。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-03-22
        • 1970-01-01
        • 2012-10-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-02
        相关资源
        最近更新 更多