【问题标题】:Is there a way to make all onclick elements navigateable by keyboard?有没有办法让所有的 onclick 元素都可以通过键盘导航?
【发布时间】:2011-09-12 12:16:06
【问题描述】:

通过链接和表单字段,您可以使用tab 循环并激活它们。

然而,在我的代码中,我使用了很多元素,它们具有 onclick 属性来执行不同的操作。例如table,其中每个tr 都可以点击并在点击时展开。

现在我希望我的页面也只能通过键盘浏览。

我正在考虑在每个 tr 上设置 tabindex,这在 Firefox 中有效(我可以通过标签浏览项目,但不能点击它们),但在 Chrome 中却没有。

如何使用键盘循环浏览所有包含 onclick 的元素?如果不是纯 HTML,也许是 JQuery。

【问题讨论】:

    标签: jquery html accessibility tabindex keyboard-navigation


    【解决方案1】:

    我建议您将元素简单地包装在锚标记 (<a>) 中。

    【讨论】:

      【解决方案2】:

      fiddle。 Tabindex 适用于我的 chrome 12。

      你的实际问题是什么?

      【讨论】:

      • 有趣的是,你提到它在 12.0.742.91 上对我有用。 (检查控制台 Ctrl+Shift+J 并通过单击将焦点放在 iframe 上以“引导”它。这不是作弊,因为他的页面不会在 iframe 中)。这也是win7 64bit
      • 是的,检查过了。还是行不通。还有Win7 64位。 IE 9 和 FF 4 中的结果相同(非)。无法解释为什么它对你有用而不对我有用。我点击“c1”并按“Tab”键尝试将焦点设置为“c2”。
      • @CraigStuntz 当你有焦点时你需要点击空格;)它确实允许你在 IE9/FF4/Chrome 中对它们进行制表符和焦点。但随后它进入 jsfiddle 界面。
      • 确实,它适用于 chrome,我喜欢它,它很简单。不得不修改您的解决方案以不听输入元素“if (e.target.nodeName != 'INPUT')”,因为我在 tr 中有一个输入字段,我无法再在其中输入空格。我将所有 tabindex 设置为“0”,因此它们只是被添加到现有的。
      • 但也许它不是浏览器安全的......需要在更多浏览器中测试它
      【解决方案3】:

      您可以做的是跟踪当前元素并选中 onclick,并且每次用户点击 - 比如说 ~ 按钮 - 它会移动到下一个,当他点击 Enter 时 - 只需触发该元素的.click();

      我在 jsfiddle 上设置了一个示例:http://jsfiddle.net/dvirazulay/4kJnM/

      这是对 tabindex 的一种重新实现,您可以做得更好,并根据自己的喜好更改实际的选择器...

      【讨论】:

      • 访问者通常不习惯按~而不是tab。所以我更喜欢一种让它与标签一起工作的方法。
      • @JochenJung:您可以将其更改为使用 TAB,但我相信浏览器的选项卡功能会搞砸一切。
      【解决方案4】:

      类似this fiddle?

      jQuery

      ​​>
      var currentRow = -1;
      $lastTd = jQuery();
      
      $(document).keyup(function(event) {
          if ($.inArray([38, 40], event.keyCode)) {
              var $rows = $('table > tbody > tr');
              var newRow = currentRow + (event.keyCode == 40 ? 1 : -1);
              if (newRow > $rows.length - 1 || newRow < 0) return;
              
              currentRow = newRow;
              
              $lastTd.find('>div').hide();
              $lastTd.find('>span.indicator').remove();
              
              $lastTd = $rows.eq(currentRow)
                      .find('>td')
                      .prepend('<span class="indicator">&gt; </span>');
              
              // Show the content div
              $lastTd.find('div').fadeIn();
          }
      });
      

      【讨论】:

      • 小提琴应该做什么?什么是 38 和 40?
      • 按向下箭头和向上箭头键。当您在搜索结果中向下箭头时,这与 Google 使用的方法相同
      【解决方案5】:

      为什么不在该行上放置一个按钮,该按钮将执行与该行的 onclick 相同的操作?

      屏幕阅读器也会读取按钮(或链接)。

      【讨论】:

      • 确实是一个解决方案。但这会浪费一些空间。
      【解决方案6】:

      我希望这样的东西可能对你有用,(它不适合我,我不擅长 JS)。你可以编辑它,你会得到一个不可见的按钮填充表格元素的背景,并告诉用户哪个被选中你可以有边框。

      <!DOCTYPE HTML>
      <html>
          <head>
              <title>Nav</title>
              <style>
                  table#sample {
                      border-width: 1px;
                      border-spacing: 2px;
                      border-style: outset;
                      border-color: gray;
                      border-collapse: separate;
                      background-color: white;
                  }
                  table#sample th {
                      border-width: 1px;
                      padding: 1px;
                      border-style: inset;
                      border-color: gray;
                      background-color: white;
                      -moz-border-radius: ;
                  }
                  table#sample td {
                      border-width: 1px;
                      padding: 1px;
                      border-style: inset;
                      border-color: gray;
                      background-color: white;
                      -moz-border-radius: ;
                  }
      
              </style>
          </head>
          <body>
              <table id="sample">
                  <tr>
                      <th>Sample</th>
                      <th>Sample</th>
                  </tr>
                  <tr>
                      <td ="section1">1</td>
                      <td id="section2">2</td>
                  </tr>
                  <tr>
                      <td id="section3">3</td>
                      <td id="section4">4</td>
                  </tr>
                  <tr>
                      <td id="section5">5</td>
                      <td id="section6">6</td>
                  </tr>
                  <tr>
                      <td id="section7">7</td>
                      <td id="section8">8</td>
                  </tr>
              </table>
              <script>
                  var sec;
                  var inside;
                  for (var i=1; i < 9; i++) {
                      sec = "section" + i;
                      inside = "<input type='button' tabindex='" + i + "' />"
                      document.getElementById(sec).innerHTML = inside;
                  };
              </script>
          </body>
      </html>
      

      【讨论】:

        【解决方案7】:

        使用tabindex="0" 允许您使用制表键导航并将焦点移动到元素/行。但是,没有办法通过键盘触发onclick事件。

        为了克服这个问题,添加一个触发onclick 事件的onkeydown 事件:

        <tr
          onclick="doYourStuff();"
          onkeydown="if(event.keyCode == 13 || event.keyCode == 32){event.target.click()}"
          tabindex="0">
        

        在模拟点击时,您需要过滤除space(32) 和enter(13) 之外的其他按键。

        这个监听器最好放在脚本中而不是内联,但我只是在这里演示这个概念。

        【讨论】:

          猜你喜欢
          • 2016-04-24
          • 2019-10-25
          • 1970-01-01
          • 2022-01-04
          • 2015-04-18
          • 1970-01-01
          • 1970-01-01
          • 2020-12-10
          • 2011-08-01
          相关资源
          最近更新 更多