【问题标题】:Close <div> When I've Tabbed out of It当我退出时关闭 <div>
【发布时间】:2019-06-12 20:26:16
【问题描述】:

我有一个带有列表的面板,单击按钮即可打开:

<button id="menuButton">Menu</button>
<div id="menuPanel">
    <ul>
        <li>Name</li>
        <li>Role</li>
        <li>Profile</li>
        <li>Management</li>
    </ul>
</div>

按钮点击使用 JavaScript 添加一个 CSS 类来显示它。对于键盘用户,我希望能够在他们通过 .

JavaScript:

(function ready(fn) {
    if (document.attachEvent ? document.readyState === 'complete' : document.readyState !== 'loading') {
        fn();
    } else {
        document.addEventListener('DOMContentLoaded', fn);

        let panel = document.getElementById('menuPanel'),
            button = document.getElementById('menuButton');

        button.onclick = checkPanelOn;

        function checkPanelOn(e) {

            e.preventDefault();
            if (panel.classList.contains('on')) {
                panel.classList.remove('on');
            } else {
                panel.classList.add('on');
            }
        }
    }
}());

我正在寻找一个纯 JavaScript 解决方案(抱歉,不能在这个项目上使用 jQuery),但我正在努力寻找答案。你有什么建议吗?

【问题讨论】:

  • 请发布完整代码 :-) 你会使用焦点效果,但我需要完整代码才能真正提供帮助
  • @IslamElshobokshy 完成了,谢谢。
  • 所以如果我理解正确,当用户点击TAB 他们将能够通过列表,对吗?一旦它们在列表的最后一个元素中,下拉列表将删除 class=on?
  • @JoseCC 正确。他们浏览列表,如果他们跳过最后一项,我想删除该课程。
  • 在您关闭最后一个元素时隐藏菜单是一项很棒的功能。您应该可以使用onblur() 事件处理程序来做到这一点。如果按下 ESC,您还应该隐藏菜单

标签: javascript keyboard accessibility keyboard-events


【解决方案1】:

这是一种使用 tabindexfocusout 的方法:

let panel = document.getElementById('menuPanel'),
  button = document.getElementById('menuButton');

button.onclick = checkPanelOn;

panel.addEventListener('focusout', function(event) {
  if (panel.contains(event.relatedTarget)) {
    return;
  }
  checkPanelOn(event);
});

function checkPanelOn(e) {

  e.preventDefault();
  if (panel.classList.contains('on')) {
    panel.classList.remove('on');
  } else {
    panel.classList.add('on');
  }
}
.on {
  display: none;
}
<button id="menuButton">Menu</button>
<div id="menuPanel">
  <ul>
    <li tabindex="0">Name</li>
    <li tabindex="0">Role</li>
    <li tabindex="0">Profile</li>
    <li tabindex="0">Management</li>
  </ul>
</div>
<button>Outside button</button>

JSFiddle : https://jsfiddle.net/nzmtL1od/

【讨论】:

  • OP 在他们的问题上有accessibility 标签。因此,绝对不应使用大于 0 的 tabindex 值。它给键盘用户带来了糟糕的体验。请参阅 html 规范中 tabindex 的警告 - w3.org/TR/html53/editing.html#the-tabindex-attribute
  • @IslamElshobokshy 感谢演示。在我的示例中,我需要为键盘用户保留可访问性。设置 tabindex 会影响页面的其余部分。有没有办法在不设置任何元素的 tabindex 的情况下做到这一点?
  • @MattSmith 你不能在没有tabindex 的情况下进入li,但你可以做的是设置tabindex="0",这使得元素“可选项卡”而不影响页面流。
  • @slugolicious 在同样的逻辑中,我编辑了我的答案以拥有tabindex="0",这样它就可以工作,同时不会影响整个页面。请再次投反对票:-)
  • 仍然是一个可访问性问题。非交互元素(例如列表项)应该接收键盘焦点。如果列表项是链接,或者执行了一些操作,那么就可以了。但如果列表项执行了一项操作,则需要role 以便屏幕阅读器了解列表项在做什么。我认为问题可以追溯到 OP,也许他们需要更好地解释他们在做什么。如果他们正在创建菜单,那么键盘交互在w3.org/TR/wai-aria-practices/#keyboard-interaction-11 中得到了很好的定义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-14
  • 1970-01-01
  • 1970-01-01
  • 2019-05-24
  • 1970-01-01
  • 2013-10-28
  • 1970-01-01
相关资源
最近更新 更多