保持选中复选框状态,直到用户取消选中

时间:2014-12-22 04:44:15

标签: javascript jquery jsp

目前,在移动页面时,我想保留我在上一页中检查的复选框的状态。 我也试过自己,抬头看着互联网。 我找到了一些解决方案,但它并不好。 以下是我发现的样本,但它只适用于Firefox,而不适用于Chrome。

<!DOCTYPE HTML>
<html><head>
<meta charset="utf-8">
<title>Persist checkboxes</title>
<style>
button {
    margin-top: 8px;
}
</style>
</head>
<body>
<div>
    <label for="option1">Option 1</label> <input type="checkbox"
        id="option1">
</div>
<div>
    <label for="option2">Option 2</label> <input type="checkbox"
        id="option2">
</div>
<div>
    <label for="option3">Option 3</label> <input type="checkbox"
        id="option3">
</div>
<button>Check all</button>



<script
    src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script
    src="http://cdn.jsdelivr.net/jquery.cookie/1.4.0/jquery.cookie.min.js"></script>

<script>
    function handleButtonClick(button) {
        if ($(button).text().match("Check all")) {
            $(":checkbox").prop("checked", true)
        } else {
            $(":checkbox").prop("checked", false)
        }
        ;
        updateButtonStatus();
    }

    function updateButtonStatus() {
        var allChecked = $(":checkbox").length === $(":checkbox:checked").length;
        $("button").text(allChecked ? "Uncheck all" : "Check all");
    }

    function updateCookie() {
        var elementValues = {};
        $(":checkbox").each(function() {
            elementValues[this.id] = this.checked;
        });

        elementValues["buttonText"] = $("button").text();
        $.cookie('elementValues', elementValues, {
            expires : 7,
            path : '/'
        })
    }

    function repopulateFormELements() {
        var elementValues = $.cookie('elementValues');
        if (elementValues) {
            Object.keys(elementValues).forEach(function(element) {
                var checked = elementValues[element];
                $("#" + element).prop('checked', checked);
            });

            $("button").text(elementValues["buttonText"])
        }
    }

    $(":checkbox").on("change", function() {
        updateButtonStatus();
        updateCookie();
    });

    $("button").on("click", function() {
        handleButtonClick(this);
        updateCookie();
    });

    $.cookie.json = true;
    repopulateFormELements();
</script>

请告诉我在这种情况下要做的事情。 感谢

1 个答案:

答案 0 :(得分:0)

它正在firefox中工作,因为firefox会记住表单输入的状态。 如果您希望它在所有浏览器中都可以使用,您可以使用cookie来存储已检查/未检查的值,或者使用用于存储key =&gt;的localStorage(html5中的新增内容)。仅限值对

您希望在所有复选框上放置onchange侦听器并将值(已选中/未选中)存储在LS中。

var all_inputs = document.getElementsByTagName("input");
for(var i = 0; i < all_inputs.length; i++)
{
     if( all_inputs[i].getAttribute("type") == "checkbox")
     {
         checkbox = all_inputs[i];
         checkbox.addEventListener("change", function()
         {
             localStorage.setItem(checkbox.getAttribute("name"), ""+checkbox.checked ); // To convert boolean to string i put "" + checkbox.checked
         }
     }
}

但是如果我们将状态保存在本地存储中,我们还必须在加载页面时更改复选框状态。

var all_inputs = document.getElementsByTagName("input");
document.onload = function()
{
    for(var i = 0; i < all_inputs.length; i++)
    {
         if( all_inputs[i].getAttribute("type") == "checkbox")
         {
             checkbox = all_inputs[i];
             if( (var value = localStorage.getItem(checkbox.getAttribute("name")) != null)
             {
                 if(value == "true")
                     checkbox.checked = true;
                 else if(value == "false")
                     checkbox.checked = false;
             }
         }
    }
}

编辑:因此,要包含在脚本代码中的整个代码将是:

document.onload = function()
{
    var all_inputs = document.getElementsByTagName("input");
    document.onload = function()
    {
        for(var i = 0; i < all_inputs.length; i++)
        {
             if( all_inputs[i].getAttribute("type") == "checkbox")
             {
                 checkbox = all_inputs[i];

                 // Change the state (checked/unchecked) if the state is saved in localStorage 
                 if( (var value = localStorage.getItem(checkbox.getAttribute("name")) != null)
                 {
                     if(value == "true")
                         checkbox.checked = true;
                     else if(value == "false")
                         checkbox.checked = false;
                 }

                 // Then put onchange listeners to notify when checkbox state changes in order to save the state in the localStorage
                 checkbox.addEventListener("change", function()
                 {
                     localStorage.setItem(checkbox.getAttribute("name"), ""+checkbox.checked ); // I used : "" + checkbox.checked to convert boolean to string
                 }
             }
        }
    }
}