【发布时间】:2018-10-04 09:19:43
【问题描述】:
使用aria-live 动态显示表单字段验证错误。一切正常,除了使用向下箭头键/选项卡从一个字段移动到另一个字段时,只有在选择下一个文件标签后才会宣布验证错误,并读取下一个标签名称然后宣布前一个字段验证错误。
代码:
{!label ? null : <label htmlFor={`input-${model}`} className={classnames('inputLabel', `${model.toLowerCase()}-label`)}>{label} <i className={ classnames('fa','fa-asterisk', { 'isRequired' : requiredField }, { 'invisible' : !requiredField || !showAsterisk } )} aria-hidden='true'></i></label>}
{!label ? null : <br />}
<OverlayTrigger ref={(input) => { this.refPopOver = input; }} trigger={trigger} placement={popoverPlacement} overlay={popover} shouldUpdatePosition={true}>
<InputComponent model={`.${model}`}
{...extraProps} />
</OverlayTrigger>
<div id='errorRegion' aria-atomic="true" aria-live="assertive">
<Errors
className={classnames('errorText', 'error', model.toLowerCase())}
model={`.${model}`}
wrapper={ErrorWrapper}
show="touched"
messages={validators.messages}
/>
</div>
编辑: slugolicious-感谢您的更新。是的,我正在使用 aria-live 来宣布错误。使用选项卡浏览可聚焦元素时效果很好。但是当使用向下箭头的浏览模式时,宣布错误和下一个标签的顺序混淆了,我也试过你的建议,但结果还是一样;它宣布下一个标签,然后是前一个字段的错误消息。在下面使用 Firefox (59.0.2 x64) 添加 NVDA(v2017.4 & v2018.1) 日志-
NVDA speech viewer log 第二次编辑:在活动区域被填充之前
<form style="position: relative;" autocomplete="off">
<div class="row">
<div class="col-sm-12">
<div class="id-form-errors" aria-live="assertive" aria-atomic="true">
<!-- react-empty: 170 -->
</div>
</div>
</div>
<div class="row">
<div class="col-xs-12 col-sm-12" style="margin-bottom: 20px;">
<div style="position: relative;">
<label class="inputLabel firstname-label" for="input-firstName">
<!-- react-text: 175 -->First name
<!-- /react-text -->
<!-- react-text: 176 -->
<!-- /react-text -->
<i class="fa fa-asterisk isRequired" aria-hidden="true"></i>
</label>
<br>
<input name="appForms.identify.firstName" class="field fullWidth firstname-field" id="input-firstName" aria-required="true"
aria-describedby="firstname-popover" type="text" placeholder="First name" value="">
<div id="errorRegion" aria-live="assertive" aria-atomic="true">
<!-- react-empty: 181 -->
</div>
</div>
</div>
<div class="col-xs-12 col-sm-12" style="margin-bottom: 20px;">
<div style="position: relative;">
<label class="inputLabel lastname-label" for="input-lastName">
<!-- react-text: 185 -->Last name
<!-- /react-text -->
<!-- react-text: 186 -->
<!-- /react-text -->
<i class="fa fa-asterisk isRequired" aria-hidden="true"></i>
</label>
<br>
<input name="appForms.identify.lastName" class="field fullWidth lastname-field" id="input-lastName" aria-required="true"
aria-describedby="lastname-popover" type="text" placeholder="Last name" value="">
<div id="errorRegion" aria-live="assertive" aria-atomic="true">
<!-- react-empty: 191 -->
</div>
</div>
</div>
<div class="row">
<div class="col-xs-12 col-sm-12">
<button class="submitButton fullWidth disabledButton next-btn" aria-disabled="true" type="submit">Next</button>
</div>
</div>
</form>
生成错误区域后的HTML:
<div class="row">
<div class="col-xs-12 col-sm-12" style="margin-bottom: 20px;">
<div style="position: relative;">
<label for="input-firstName" class="inputLabel firstname-label">
<!-- react-text: 226 -->First name
<!-- /react-text -->
<!-- react-text: 227 -->
<!-- /react-text -->
<i class="fa fa-asterisk isRequired" aria-hidden="true"></i>
</label>
<br>
<input type="text" class="field fullWidth firstname-field" placeholder="First name" id="input-firstName" aria-describedby="firstname-popover"
aria-required="true" name="appForms.identify.firstName" value="">
<div id="errorRegion" aria-atomic="true" aria-live="assertive">
<!-- react-empty: 232 -->
</div>
</div>
</div>
<div class="col-xs-12 col-sm-12" style="margin-bottom: 20px;">
<div style="position: relative;">
<label for="input-lastName" class="inputLabel lastname-label">
<!-- react-text: 236 -->Last name
<!-- /react-text -->
<!-- react-text: 237 -->
<!-- /react-text -->
<i class="fa fa-asterisk isRequired" aria-hidden="true"></i>
</label>
<br>
<input type="text" class="field fullWidth lastname-field" placeholder="Last name" id="input-lastName" aria-describedby="lastname-popover"
aria-required="true" name="appForms.identify.lastName" value="">
<div id="errorRegion" aria-atomic="true" aria-live="assertive">
<!-- react-empty: 242 -->
</div>
</div>
</div>
</div>
第三次编辑-仍在等待可行的解决方案。需要帮助!
【问题讨论】:
-
请添加您的代码,以便我们为您提供帮助。谢谢!
标签: html wai-aria screen-readers nvda