具有角色按钮的锚 link 内图像的可访问性:可点击元素必须是可聚焦的并且应该具有交互语义

accessibility for image inside an anchor link with role button: Clickable elements must be focusable and should have interactive semantics

我有以下标记:

<li class="remove-filter-key-list-item" data-id="{{this.id}}">
  <a
    href="#"
    class="remove-filter-key-button flx jst-cntr"
    role="button"
    tabindex=0
  >
    <img
      class="remove-filter-key-list-icon"
      src="{{this.icon}}"
      alt="{{this.statusText}} icon"
    />
    <span
      class="remove-filter-key-list-title"
    >{{this.statusText}}</span>
  </a>
</li>

在 firefox 可访问性检查器中触发 this error

据我所知,link 需要一个 onclick 侦听器、一个 keydown 侦听器、一个选项卡索引和两个事件的 prevent default。我试过添加这些,但错误仍然存​​在。 Firefox 似乎专注于锚 link 内的图像,而不是 link 本身,后者是可点击的东西。

我在 javascript 文件中添加监听器(我没有也不能在 html 中内联添加它们)如下:

function addStatusFilterListener(el) {
  el.addEventListener("click", onStatusFilterToggle);
  el.addEventListener("keydown", (e) => {
    e.preventDefault();
    if (e.keycode === 32) {
      //if spacebar
      onStatusFilterToggle(e);
    }
  });
}

虽然这似乎不起作用 - 空格键滚动页面,但我的事件没有被触发,而且辅助功能检查器似乎正在寻找包含的 img 标签上的事件。构建此结构以解决这些问题的正确方法是什么?

以下是我对您的代码的看法:

  • tabindex=0 是不必要的,因为 link 默认是可聚焦的。
  • 键盘处理程序是不必要的,因为按回车键已经触发了 link and/or 单击处理程序。它甚至可能是危险的,因为您使界面与用户对 link 或按钮的预期不同。
  • 将 tabindex=0 添加到 <img/><span> 或 link 中的任何内容都会造成麻烦;嵌套的可聚焦或可点击元素会造成混淆,因为它们没有被用户很好地理解并且触发的实际事件没有明确定义 and/or 很难处理好。
  • 该图片有替代文字,因此就辅助功能而言,您看起来一切都很好

为了节省大量变通方法和小提琴,最直接的解决方案是将图像包裹在按钮中,而不是试图让锚点表现得像按钮。

这意味着您不必担心不同的处理程序等,因为按钮上的 click 事件处理程序具有内置的所有行为!

在下面的示例中,我将您的代码更改为使用 <button> 并添加了 data-id 只是为了提醒单击了哪个项目。

您将看到您可以使用 EnterSpace 来激活该项目以及单击鼠标!

const removeBtn = document.querySelectorAll('.remove-filter-key-button');

removeBtn.forEach((element)  => {
   element.addEventListener('click', onStatusFilterToggle);
});

function onStatusFilterToggle(e){
  let el = e.currentTarget;  
  let itemID = el.getAttribute('data-id');
  alert("you pressed item: " + itemID);
}
button{
   border: 0px;
   background: transparent;
}
button:hover{
   cursor: pointer;
   opacity: 0.9;
}
<button class="remove-filter-key-button flx jst-cntr" data-id="1">
    <img
      class="remove-filter-key-list-icon"
      src="https://picsum.photos/100/100"
      alt="Some Alt Text icon"
    /><br>
    <span
      class="remove-filter-key-list-title"
    >Current Status</span>
  </button>
  <button class="remove-filter-key-button flx jst-cntr"  data-id="2">
    <img
      class="remove-filter-key-list-icon"
      src="https://picsum.photos/100/100"
      alt="Some Alt Text icon"
    /><br>
    <span
      class="remove-filter-key-list-title"
    >Current Status</span>
  </button>