复选框不是't检查到正确的值

Checkbox isn't checking to the correct value

本文关键字:检查 复选框      更新时间:2023-09-26

我有应该是简单的代码,但由于某种原因,我没有了解正确设置复选框的逻辑有什么问题。我使用本地存储,以便在会话之间保持选中状态。

这是我的密码。由于某种原因,即使console.log在应该为false时打印出false,或者在应该为true时打印出true,无论哪种方式,复选框都会被选中。

var checkboxElement = document.getElementById("checkbox").getElementsByTagName('input')[0]
    checkboxElement.addEventListener('click', function() {
        console.log(checkboxElement.checked)
        if (localStorage != undefined) {
            localStorage.setItem("checkbox", checkboxElement.checked)
        }
    });
    if(localStorage != undefined)
    {
        console.log("Local storage supported.");
        //set defaults
        if (localStorage.getItem("checkbox") == undefined) {
            localStorage.setItem("checkbox", false)
        }
        var isChecked = localStorage.getItem("checkbox")
        checkboxElement.checked = isChecked
        console.log(isChecked)
    }

因为localStorage将值存储为字符串,所以当您有false时,它实际上存储为'false',这是一个真实的值,所以即使取消选中复选框,它也会标记为已选中。

var isChecked = localStorage.getItem("checkbox") === 'true';
checkboxElement.checked = isChecked;
console.log(isChecked)

演示:Fiddle

检查底部的第三行。checkboxElement.checked需要一个布尔值。如果没有提供布尔值,它会通过遵循一些规则将值强制为布尔值(很多时候这种转换/强制会产生奇怪的结果)。

isChecked包含"true"/"false"(字符串形式)。我使用了一个三元运算符来生成字符串"true"/"false"的正确布尔表示。

var checkboxElement = document.getElementById("checkbox").getElementsByTagName('input')[0]
checkboxElement.addEventListener('click', function () {
    console.log(checkboxElement.checked)
    if (localStorage != undefined) {
        localStorage.setItem("checkbox", checkboxElement.checked)
    }
});
if (localStorage != undefined)
{
    console.log("Local storage supported.");
    //set defaults
    if (localStorage.getItem("checkbox") == undefined) {
        localStorage.setItem("checkbox", false)
    }
    var isChecked = localStorage.getItem("checkbox");

    // .checked property needs boolean value. Thats why the following line is re-coded to produce a boolean.
    checkboxElement.checked = isChecked === "false" ? false : true;
    console.log(isChecked);
}