【发布时间】:2020-09-05 01:29:45
【问题描述】:
以下适用于 Firefox 80.0 和 Chromium 84.0.4147.89。
const fieldset = document.getElementById("fieldset");
const toggle = document.getElementById("toggle");
toggle.addEventListener("change", () => {
if (fieldset.hasAttribute("disabled")) {
fieldset.removeAttribute("disabled");
} else {
fieldset.setAttribute("disabled", true);
}
});
<form action="#">
<fieldset id="fieldset">
<legend>
<label>toggle <input id="toggle" type="checkbox" /></label>
</legend>
<input />
</fieldset>
</form>
但是,当我尝试在 React 中做类似的事情时,它在 Firefox 中不起作用。禁用字段集后,onChange 事件似乎不会触发。
function App() {
const [disabled, setDisabled] = React.useState(false);
const toggleDisabled = React.useCallback(() => {
setDisabled((disabled) => !disabled);
}, []);
return (
<form action="#">
<fieldset disabled={disabled}>
<legend>
<label>
toggle <input onChange={toggleDisabled} type="checkbox" />
</label>
</legend>
<input />
</fieldset>
</form>
);
}
ReactDOM.render(<App />, document.getElementById("root"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.0/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.0/umd/react-dom.production.min.js"></script>
<div id="root"></div>
[当 fieldset 元素被禁用时] 注意
<legend>元素内的表单元素不会被禁用。
W3C (Example B) 和WHATWG 还提到不应禁用<legend> 的内容。
所以我相信这两段代码的行为方式应该相同:我应该能够使用复选框切换disabled 属性。
如何在 React on Firefox 80.0+ 上实现同样的效果?
【问题讨论】:
标签: javascript html reactjs firefox dom