javascript - 更改 DOM 中复选框的选中属性不适用于 event.preventDefault()
问题描述
我知道,如果您更改 DOM 中的某些属性,它会反映在 UI 中,并且 event.preventDefault() 函数会阻止默认更改。现在在这个脚本中我更改了 DOM 并停止了默认操作,但它没有反映在交互中?
let check = document.getElementById('check');
check.onclick = function(event) {
event.target.checked = !event.target.checked;
event.preventDefault();
}
<input id="check" type="checkbox" /> Checkbox
解决方案
当然,在这个特定的示例中,您可能没有处理程序。但是您在评论中指出情况比问题中显示的更复杂。
您必须先让事件完成处理,然后才能更改框的选中状态并保持该更改,例如使用旧setTimeout(..., 0)
技巧:
let check = document.getElementById('check');
check.addEventListener("click", function({target}) {
setTimeout(() => {
target.checked = !target.checked;
}, 0);
event.preventDefault();
});
<input id="check" type="checkbox" /> Checkbox
(只是像这样的微任务Promise.resolve().then(...)
不起作用,至少在 Chrome 上,显然你必须回到主事件循环。)
该示例还使用addEventListener
而不是onclick
和 ES2015+ 解构({target}
函数参数列表中的),因为您正在使用let
并且似乎正在使用 ES2015+。
但它也可以使用onclick
:
let check = document.getElementById('check');
check.onclick = function({target}) {
setTimeout(() => {
target.checked = !target.checked;
}, 0);
event.preventDefault();
};
<input id="check" type="checkbox" /> Checkbox
推荐阅读
- android - 在 Scrollview 中使用 Recyclerview 扩展 Listview
- java - Java方法覆盖,子类采用参数类型的超类型
- html - 为什么 svg 不透明度似乎会改变 RGB 值
- ios - 反复表示collectionView的cell的frame会导致内存增长?
- database - 返回 CrateDB 中插入的 ID
- html - 如何使 3 个不同的文本框高度相同(处于响应状态)
- javascript - Bootstrap/jQuery 单选按钮在 Firefox/Safari 上不起作用
- python - Numpy随机选择分布错误
- javascript - 在 Electron 上将正文添加到 ClientRequest
- java - 从地图对象中查找范围内的元素数