【问题标题】:JavaScript generated code and screen readersJavaScript 生成的代码和屏幕阅读器
【发布时间】:2016-04-20 21:04:13
【问题描述】:

我请你帮帮我,我完全被这个问题困住了。

我想让我的代码可以通过键盘导航并适用于屏幕阅读器设备。但我有几个问题。

这是我在 JS 中的代码:

function changeText()
{
 document.getElementById('div1').innerHTML = '<input id="btn2" type="button" onclick="changeText2()" value="Change Text2" />';
 document.getElementById('btn1').setAttribute("aria-hidden",true);
 document.getElementById('div1').focus();
}
function changeText2()
{
 document.getElementById('div1').innerHTML = '<input id="btn3" type="button" onclick="changeText()" value="Change Text" />';
 document.getElementById('btn1').setAttribute("aria-hidden",true);
}

和 HTML:

<div id="div1">
<input id="btn1" type='button' onclick='changeText()' value='Change Text'/>
</div>

当我在仅使用键盘(带有选项卡)的窗口中导航到 btn1 然后按回车键(或空格)时,按钮已更改,但它失去了焦点。如您所见,我尝试将其集中在 JS 上,但没有结果。我也尝试使用tabindex 标签,但也没有帮助。我希望它在按下时能够聚焦,这样屏幕阅读器更容易导航和访问。

请帮忙!

编辑

Focus 已使用 James Long 解决方案在按钮上进行了测试,并且可以正常工作!

但是,btn.setAttribute('aria-hidden', true); 应该被删除。

最终编辑

我刚刚知道了,哈哈!为了让我的示例正常工作,我应该关注btn2 而不是btn1。这太愚蠢了!所以,它是这样的:

function changeText()
{
 document.getElementById('div1').innerHTML = '<input id="btn2" type="button" onclick="changeText2()" value="Change Text2" />';
 document.getElementById('btn2').focus();
}
function changeText2()
{
 document.getElementById('div1').innerHTML = '<input id="btn1" type="button" onclick="changeText()" value="Change Text" />';
 document.getElementById('btn1').focus();
}

我为自己感到骄傲:)

【问题讨论】:

  • 如果您希望屏幕阅读器可以访问该按钮,我看不出将 aria-hidden 属性设置为 true 的意义。
  • 对亚当来说,我是为 btn1 做的,同时显示 btn2。因为我真的不知道屏幕阅读器是否会读取由 JS 生成的默认(硬编码)btn1btn2(或btn3)。但是在 James Long 的回答中有 'aria-hidden',我认为这并不重要,因为即使我能理解它也应该被删除(而且我是新的 :))对于 Alteyss,你怎么能编辑我的题?如果焦点对您不起作用,请考虑在下面编辑您的答案,因为 James Long 的答案有焦点。

标签: javascript accessibility wai-aria screen-readers wcag2.0


【解决方案1】:

把焦点放在你的按钮上:

$("#btn1").focus();

在纯 JS 中:

document.getElementById('btn1').focus();

【讨论】:

  • 我忘了提,但我试过了。我尝试了很多变化,比如 btn2(相对)而不是 btn1,但没有结果。
【解决方案2】:

我手头没有屏幕阅读器,因此测试它很棘手,但你可能会更幸运地更改按钮而不是替换它并专注于按钮本身。

<div id="div1">
    <button type="button" id="btn1">Change Text</button>
</div>

然后是你的 JS:

document.addEventListener('DOMContentLoaded', function () {

    function changeText(btn) {

        btn.textContent = btn.textContent === 'Change Text'
            ? 'Change Text2'
            : 'Change Text';
        btn.setAttribute('aria-hidden', true);
        btn.focus();

    }

    document.getElementById('btn1').addEventListener('click', function (e) {
        changeText(e.target);
    }, false);

}, false);

【讨论】:

  • 您能否编辑您的答案以便它可以工作,因为我尝试过但没有。此外,尝试使用它,并没有太大帮助。文字不变
  • @jfanderson - 好的,试试看。我已将其放入 fiddle,以便您可以看到它正在工作
  • 谢谢! :) 完美运行!
猜你喜欢
  • 2016-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-28
  • 1970-01-01
  • 2016-11-11
  • 2015-08-16
  • 2019-05-16
相关资源
最近更新 更多