以下适用于 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
使用复选框来切换属性。
如何在 Firefox 80.0+ 上的 React 中实现相同的效果?