我使用 ReactJS 编写具有可访问性的应用程序。
我对 NVDA 和 FireFox 有疑问 - NVDA 无法正确读取数字。
我找到了解决方案(使用延迟为 0 的 setTimeout),但我认为这样可以做得更好。
我创建了概念证明来显示问题:
HTML:
<body>
<div id="root"></div>
</body>
JavaScript:
function generateRandomNumber(min = 0, max = 9, toFixed = 2) {
const number = (Math.random() * (max - min) + min).toFixed(toFixed);
return number;
};
function getRandomNumber(min = 0, max = 9, toFixed = 2) {
return generateRandomNumber(101, 400, 2);
};
class Work extends React.Component {
constructor(props) {
super(props);
this.state = {
number: 0,
showElement: true
};
}
randomNumber() {
this.setState({
showElement: false,
number: getRandomNumber()
});
setTimeout(() => {
this.setState({
showElement: true
});
}, 0);
}
render() {
return (
<div>
<div aria-live="polite">
{this.state.showElement &&
<p>{this.state.number}</p>}
</div>
<button onClick={() => this.randomNumber()}>Random me!</button>
</div>
);
}
}
class NotWork extends React.Component {
constructor(props) {
super(props);
this.state = {
number: 0
};
}
randomNumber() {
this.setState({
number: getRandomNumber()
});
}
render() {
return (
<div>
<div aria-live="polite">
<p>{this.state.number}</p>
</div>
<button onClick={() => this.randomNumber()}>Random me!</button>
</div>
);
}
}
class App extends React.Component {
render(){
return (
<div className="App">
<div>
<div aria-live="polite">
<h3>Works example:</h3>
<Work />
<hr />
<h3>Not works example:</h3>
<NotWork />
</div>
</div>
</div>
)
}
}
React.render( < App / > ,
document.getElementById('root')
);
用于运行的 JSFiddle:
https://jsfiddle.net/IceManSpy/1bxu6aau/1/
重现 - 悲伤的路径:
- 在 FireFox 上运行 jsfiddle
- 运行 NVDA(您可以打开语音查看器)
- 有时点击随机我!在无效示例中
- 检查结果 - 第一个值可以,但接下来不行。
- 有时会是(fe. 345.67):
- 345
- 67
- 但有时(它缺少第一个数字):
- 45
- 67
重现 - 快乐的道路:
- 在 FireFox 上运行 jsfiddle
- 运行 NVDA(您可以打开语音查看器)
- 有时点击随机我!在作品示例中
- 检查结果 - 每个值都可以。
没有 setTimeout 怎么解决这个问题?