如何使用 vanilla javascript 从数组中删除最后一个复选框
How can I remove the last checkbox from an array using vanilla javascript
这是一个带有一堆复选框 (16) 的电子邮件首选项表单,允许用户 subscribe/unsubscribe。
我有一组这样的复选框;
var checkboxes = document.querySelectorAll('input[type="checkbox"]');
我有一个 按钮,单击它会 select 页面上的所有复选框,然后取消 select unsubscribeAll 复选框;
getAllButton.addEventListener("click", function () {
selectAll();
});
function selectAll() {
for (var i = 0; i < checkboxes.length; i++) {
if (checkboxes[i].type == "checkbox") checkboxes[i].checked = true;
}
// un-check the unsubscribeAll checkbox
unsubscribeAll.checked = false;
}
我有一个复选框,单击(选中)时会取消select页面上的所有其他复选框;
var unsubscribeAll = document.getElementById("unsubscribeAll");
unsubscribeAll.addEventListener("click", function () {
// un-check this box if already checked
if (this.checked !== true) {
this.checked = false;
} else {
deselectAll();
}
});
function deselectAll() {
for (var i = 0; i < checkboxes.length; i++) {
if (checkboxes[i].type == "checkbox") checkboxes[i].checked = false;
}
unsubscribeAll.checked = true;
}
一切正常。但是,我的问题是,如果选中了 unsubscribeAll 复选框,然后用户 select 有一个订阅电子邮件的复选框,我想取消 select unsubscribeAll 复选框,但我正在努力实现这一目标.
我想我可以 运行 另一个函数,它会取消 select 那个复选框,像这样;
for (var i = 0; i < checkboxes.length; i++) {
checkboxes[i].addEventListener("click", deselectUnsubscribeAll);
}
function deselectUnsubscribeAll() {
if (unsubscribeAll.checked === true) {
unsubscribeAll.checked = false;
}
}
当然,这不行,因为unsubscribeAll
包含在checkboxes[]
数组中。
接下来,我想我可以创建一个排除 unsubscribeAll
的新复选框数组,所以我尝试了这个,因为它是该数组中的最后一个元素;
var unsubscribeAll = document.getElementById("unsubscribeAll");
var getAllButton = document.getElementById("select-all");
var checkboxes = document.querySelectorAll('input[type="checkbox"]');
console.log(checkboxes.length); // 16
var popped = checkboxes.pop(); // Uncaught TypeError: checkboxes.pop is not a function
如您所见,这会产生一个错误,但我不明白为什么。这看起来像笨重的代码,但它几乎可以工作。
这是我为解决问题而参考的页面之一;
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/pop#examples
请给我一些指导。
你说它是那个数组中的最后一个元素,那你为什么循环遍历数组的末尾而不使用 for (var i = 0; i < checkboxes.length - 1; i++)
?
然后你可以单独添加一个事件监听器。
您还可以使用 Element.matches() API 检查单击的复选框是否为 unsubscribeAll
和 运行 相应的功能。但第一种方法更有效,因为您不需要在每次点击事件时检查元素。
这是一个带有一堆复选框 (16) 的电子邮件首选项表单,允许用户 subscribe/unsubscribe。 我有一组这样的复选框;
var checkboxes = document.querySelectorAll('input[type="checkbox"]');
我有一个 按钮,单击它会 select 页面上的所有复选框,然后取消 select unsubscribeAll 复选框;
getAllButton.addEventListener("click", function () {
selectAll();
});
function selectAll() {
for (var i = 0; i < checkboxes.length; i++) {
if (checkboxes[i].type == "checkbox") checkboxes[i].checked = true;
}
// un-check the unsubscribeAll checkbox
unsubscribeAll.checked = false;
}
我有一个复选框,单击(选中)时会取消select页面上的所有其他复选框;
var unsubscribeAll = document.getElementById("unsubscribeAll");
unsubscribeAll.addEventListener("click", function () {
// un-check this box if already checked
if (this.checked !== true) {
this.checked = false;
} else {
deselectAll();
}
});
function deselectAll() {
for (var i = 0; i < checkboxes.length; i++) {
if (checkboxes[i].type == "checkbox") checkboxes[i].checked = false;
}
unsubscribeAll.checked = true;
}
一切正常。但是,我的问题是,如果选中了 unsubscribeAll 复选框,然后用户 select 有一个订阅电子邮件的复选框,我想取消 select unsubscribeAll 复选框,但我正在努力实现这一目标. 我想我可以 运行 另一个函数,它会取消 select 那个复选框,像这样;
for (var i = 0; i < checkboxes.length; i++) {
checkboxes[i].addEventListener("click", deselectUnsubscribeAll);
}
function deselectUnsubscribeAll() {
if (unsubscribeAll.checked === true) {
unsubscribeAll.checked = false;
}
}
当然,这不行,因为unsubscribeAll
包含在checkboxes[]
数组中。
接下来,我想我可以创建一个排除 unsubscribeAll
的新复选框数组,所以我尝试了这个,因为它是该数组中的最后一个元素;
var unsubscribeAll = document.getElementById("unsubscribeAll");
var getAllButton = document.getElementById("select-all");
var checkboxes = document.querySelectorAll('input[type="checkbox"]');
console.log(checkboxes.length); // 16
var popped = checkboxes.pop(); // Uncaught TypeError: checkboxes.pop is not a function
如您所见,这会产生一个错误,但我不明白为什么。这看起来像笨重的代码,但它几乎可以工作。 这是我为解决问题而参考的页面之一; https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/pop#examples 请给我一些指导。
你说它是那个数组中的最后一个元素,那你为什么循环遍历数组的末尾而不使用 for (var i = 0; i < checkboxes.length - 1; i++)
?
然后你可以单独添加一个事件监听器。
您还可以使用 Element.matches() API 检查单击的复选框是否为 unsubscribeAll
和 运行 相应的功能。但第一种方法更有效,因为您不需要在每次点击事件时检查元素。