javascript - 用户检查一次后未以编程方式检查复选框
问题描述
我遇到了一个有趣的问题,我无法用我正在开发的 Vue 应用程序解决。我想要的行为((取消)选中时的父复选框,(取消)选中所有子复选框)存在,但有问题。
当您单击一个复选框时,该复选框将被父复选框忽略。这意味着单击任何子复选框后,单击父复选框对先前单击的复选框没有影响;它只是保持它的价值。
这就是它变得奇怪的地方:我查看了 safari 中的元素选项卡,它说当父项被(未)选择时,单击的框正在更改值,但在视觉上它保持不变。
我知道该框已选中,因为应用程序的其他部分正在执行我期望的操作,但我无法弄清楚为什么它会说一个框有 class="checked" checked="checked",但在视觉上仍然未选中.
当您单击复选框时,是否还会发生其他事情,这使得我检查子复选框的方式在视觉上不正确?
相关HTML:
<template>
<div v-for=“(foo, bar) in foobar” :key=bar>
<div class=“root”>
<input id='checkbox' type="checkbox" class="checked" checked="checked" @click=“handleRootClick($event)">
</div>
<div class=“child 1”>
<div v-for=“(foo, bar) in foobar” :key=bar>
<div class=“child 1 header">
<input id='checkbox' type="checkbox" class="checked" checked="checked" @click=“handleChild1Click($event)">
</div>
<div class=“child 1”>
<div v-if=“foobar.length > 0">
<div class=“child 2 header">
<input id='checkbox' type="checkbox" class="checked" checked="checked" @click=“handleChild2Click($event)">
</div>
<div class="resource-dropdown-contents">
<div v-for=“(foo, bar) in foobar” :key=bar>
<div class=“child 3 header">
<input id='checkbox' type="checkbox" class="checked" checked="checked" @click=“handleChild3Click($event)">
</div>
<div class="compute-dropdown-contents">
<div v-for=“(foo, bar) in foobar” :key=bar>
<div class=“child 4 header">
<input id='checkbox' type="checkbox" class="checked" checked="checked" @click=“handleChild4Click($event)">
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
这是相关的打字稿代码:
public handleRootClick(e) {
const root = e.currentTarget.parentElement.parentElement;
const checkboxes = root.querySelectorAll('#checkbox');
const isChecked = checkboxes[0].classList.contains('checked');
if (isChecked) {
// ensure all children are unchecked
for (let i = 0; i < checkboxes.length; i++) {
if (checkboxes[i].classList.contains('checked')) {
checkboxes[i].classList.remove('checked');
checkboxes[i].removeAttribute('checked');
}
}
} else {
// ensure all children are checked
for (let i = 0; i < checkboxes.length; i++) {
if (!checkboxes[i].classList.contains('checked')) {
checkboxes[i].classList.add('checked');
checkboxes[i].setAttribute('checked', 'checked');
}
}
}
e.stopPropagation();
}
其他的handleChildxClick 函数与上述函数非常相似。
解决方案
推荐阅读
- c# - 购买播放器后切换角色不起作用
- python - 我无法访问存储桶中 Amazon S3 上的对象
- python - 根据 30 分钟间隔计算分钟差?
- swift - 有没有办法让文本字段快速只接受字母和空格
- c - “如何在函数内部使用带有指针(数组)的scanf”
- python-3.x - 任何人都可以从“codebat”中解释这段代码吗?
- c++ - 检查 Windows 激活状态返回错误值
- regex - 正则表达式提取两个斜杠之间的字符串和其中的指定字符串
- c# - AutoMapper 映射到 Enum 默认值,而不是在 null 时跳过
- javascript - Zapier Javascript: Unexpected token ] - 在 IDE、Repl.it 和 Node v6.3.1 中工作