在 Angular 中单击按钮后,使 NVDA 屏幕 reader 提醒用户的最佳方法是什么?

What is the best approach to make NVDA screen reader to alert the user after a button has been clicked in Angular?

我在 Angular 有申请。在其中一个屏幕中,我可以搜索一些基于数据过滤的数据。有一个重置按钮可以清除过滤器。我想提醒 NVDA 屏幕中的用户 reader 单击重置按钮后搜索已重置。

我试过下面的方法。但我有一些问题。请帮助或建议一些更好的方法。我将代码简化如下。

<div>
    <a href="javascript:void(0);" aria-label="Reset search" (click)="resetSearch()"> Reset search
    </a>
    <span id="resetAlert">Search has been reset</span>
</div>

我正在制作一个跨度元素,其中包含我希望 NVDA 读取的消息。 但是这个元素不应该被屏幕 reader 检测到。所以我设置显示 none.

单击重置按钮后,将执行以下方法。

resetSearch() {
    // Making display block so that screen reader can find the element in DOM
    document.getElementById('resetAlert').style.display = 'block';

    // Removing existing attribute 
    document.getElementById('resetAlert').removeAttribute('role');

    // Setting role attribute so that screen reader alerts as "alert Search has been reset" 
    document.getElementById('resetAlert').setAttribute('role', 'alert');

}

以上逻辑运行良好。但是随后元素停留在 DOM 中。如果我使用 Tab 键和箭头键滚动页面,屏幕 reader 会检测到该元素并再次读取它。 (我希望它只在单击重置按钮时读取)。

我试图将显示更改回 none。但它不起作用。

resetSearch() {
    
    document.getElementById('resetAlert').style.display = 'block';

    
    document.getElementById('resetAlert').removeAttribute('role');

    
    document.getElementById('resetAlert').setAttribute('role', 'alert');


    // This line doesn't work. May be I am missing something. Please help
    document.getElementById('resetAlert').style.display = 'none';

}

帮助我在单击按钮时切换此 span 元素以制作显示块并立即将其更改为显示 none 或者为我的用例建议更好的方法。

我找到了解决办法。我在 span 元素上使用了 aria-live。 我保持 span 元素的颜色与父元素的背景颜色相同。 我将 span 元素的内容保留为空。 单击重置按钮后,内容设置为我希望屏幕 reader 读取的内容。然后我在 2 秒后删除了内容,以便在使用选项卡滚动页面时,屏幕 reader 不会再次读出它。

<span aria-live="polite" id="test" class="landing-page__alert"></span>


resetSearch() {
    document.getElementById('resetAlert').innerHTML = 'Search has been reset';

    setTimeout(() => {
       document.getElementById('resetAlert').innerHTML = '';
    }, 2000);
}