我用this example之后的复选框标签做了一个切换按钮.用户应该能够用他们的鼠标/touch 板和键盘来控制切换按钮.鼠标/touch 板控制运行良好,用户可以使用键盘上的Tab键聚焦/ Select 切换按钮.我想不出怎么按空格键和Enter键来切换按钮.

我搜索了Stack Overflow,并try 了使用输入和/或标签元素上的按键和按键事件的事件处理程序来触发toggleContent函数的解决方案.我还try 了一个在触发toggleContent函数之前判断Enter(13)键代码的解决方案.由于似乎什么都不起作用,我恢复到最后一个工作代码,该代码允许用户使用Tab键 Select 切换按钮,但不允许使用空格键或Enter键切换按钮.

这是我的HTML码:

<div>
     <input type="checkbox" id="toggle" class="toggle" name="checkbox">
     <label for="toggle" id="label" tabindex="0"></label>
</div>

这是我的JS:

const checkbox = document.getElementById("toggle");

const basic = document.getElementById("basic");
const professional = document.getElementById("professional");
const master = document.getElementById("master");

function toggleContent () {
  if (this.checked) {
    basic.innerHTML = "19.99";
    professional.innerHTML = "24.99";
    master.innerHTML = "39.99";
  } else {
    basic.innerHTML = "199.99";
    professional.innerHTML = "249.99";
    master.innerHTML = "399.99";
  }  
}

checkbox.addEventListener('change', toggleContent);

完整的代码和部署可以在here找到.

如何允许用户使用空格键和键盘上的Enter键与切换按钮交互?

推荐答案

创建切换按钮的一种常见方法是使用aria-pressed属性.它表示按钮的当前状态.在文档中,这被描述为:

向具有按钮角色的元素添加aria-按住组合键可将 按钮转换为切换按钮.咏叹调按下的属性仅 与切换按钮相关.它表示按钮的电流 "按下"状态.

我们还需要确保按钮有一个可访问的名称,这样我们才能知道它切换的是什么.为此,我们可以使用aria-label.

使用<button>元素还会带来额外的好处,即它会自动与空格键和Enter键配合使用.

const button = document.getElementById("toggle");

function toggleContent () {
  const isToggled = button.getAttribute('aria-pressed') === 'true';
  button.setAttribute('aria-pressed', !isToggled);
  
  if(isToggled) {
    // Show monthly prices
  } else {
    // Show annual prices
  }
}

button.addEventListener('click', toggleContent);
#toggle {
  background: lightblue;
  width: 4.4rem;
  height: 2.4rem;
  border: none;
  border-radius: 2rem;
  cursor: pointer;
}

#toggle .inner {
  background: white;
  width: 2rem;
  height: 2rem;
  border-radius: 50%;
  transition: transform 0.2s ease-out;
}

#toggle[aria-pressed="true"] .inner {
  transform: translateX(calc(100% - 0.4rem));
}
<button id="toggle" type="button" aria-pressed="false" aria-label="Show monthly prices">
     <div class="inner"></div>
</button>

Javascript相关问答推荐

主要内部的ExtJS多个子应用程序

如何修复内容安全策略指令脚本-SRC自身错误?

根据总价格对航班优惠数组进行排序并检索前五个结果- Angular HTTP请求

在贝塞尔曲线的直线上找不到交叉点:(使用@Pomax的bezier.js)

GrapeJS -如何保存和加载自定义页面

类型脚本中只有字符串或数字键而不是符号键的对象

使用复选框在d3.js多折线图中添加或删除线条

JQuery. show()工作,但. hide()不工作

如何添加绘图条形图图例单击角形事件

使用LocaleCompare()进行排序时,首先使用大写字母

编剧如何获得一个div内的所有链接,然后判断每个链接是否都会得到200?

我可以使用使用node.js创建的本地主机来存储我网站上提交的所有数据吗?没有SQL或任何数据库.只有HTML语言

VUE 3捕获错误并呈现另一个组件

在HTML语言中调用外部JavaScript文件中的函数

使用getBorbingClientRect()更改绝对元素位置

DOM不自动更新,尽管运行倒计时TS,JS

Reaction Redux&Quot;在派单错误中检测到状态Mutations

我想使用GAS和HTML将从Electron 表格中获得的信息插入到文本字段的初始值中

基于产品ID更新条带产品图像的JavaScript命中错误

在JS/TS中将复杂图形转换为数组或其他数据 struct