javascript - Javascript:选择其他人
问题描述
我正在开发一个 API,计划是用户在发出 POST 请求之前填写一个包含多个选项的简短清单。对于每个部分,用户可以获得多个选项/按钮,但只能选择其中一个。
选定的按钮将获得类marked
(将背景颜色更改为绿色),而其他按钮保持白色(除非单击其中一个,在这种情况下它变为绿色而其他变为白色)
我尝试了两种不同的 Javascript 函数,但到目前为止,它们都无法使这种行为起作用。
尝试1:
function Label(self, group) {
// mark button
let btns = document.getElementsByClassName(group);
for (el in btns) {
btns[el].classList.remove('marked')
}
self.classList.add('marked');
}
尝试 2(更明确的检查是否self
涉及)
function Label(self, group) {
// mark button
let btns = document.getElementsByClassName(group);
for (el in btns) {
if (btns[el] !== self) {
btns[el].classList.remove('marked')
}
}
self.classList.add('marked');
}
我的推理是首先.marked
从所有元素中删除类,然后在this
元素上设置它。由于在 HTML 中使用命令调用该函数,onclick
它知道它是哪个元素。
<div class="group1">
<button onclick="Label(this, pt_toggle)" class="pt_toggle">Incorrect</button>
<button onclick="Label(this, pt_toggle)" class="pt_toggle">Partially correct</button>
<button onclick="Label(this, pt_toggle)" class="pt_toggle">Correct</button>
</div>
但是,这些功能并没有像我希望的那样运行。它引发Uncaught TypeError: Cannot read property 'remove' of undefined
错误并且未设置类。
有谁知道我做错了什么?
解决方案
您遇到了for..in
循环语法的一个特性。当你执行:
for (el in btns) {
if (btns[el] !== self) {
btns[el].classList.remove('marked');
}
}
对象中的每个属性都btns
将被迭代,包括length
您无法从中删除类名的属性btns["length"]
。
如果您切换到使用作为限制的普通for
循环btns.length
,您将不会迭代对象中的非按钮元素属性:
for (var el = 0; el < btns.length; el++) {
if (btns[el] !== self) {
btns[el].classList.remove('marked');
}
}
推荐阅读
- android - Recyclerview反向布局起始滚动位置问题
- angular - 如何使用 rxjs 6 在 Angular 8 中实现滚动动画?
- ios - 将变量传递到 Firestore 文档路径
- swift - iOS13导航栏大标题不覆盖状态栏
- python - 如何使用 Selenium 单击无法检查的按钮?
- c++ - 从向量中提取不包含0的字符串
> - javascript - 在另一个网站中加载 HTML 和 JS 元素
- perl - (variable) = @_ 和 variable = @_ 有什么区别
- c++ - 如果二维数组不是双指针,那么为什么会发生这种情况?
- excel - Excel VBA:在函数中转置向量和矩阵乘法