【问题标题】:Select a range of key/value pairs in localStorage在 localStorage 中选择一系列键/值对
【发布时间】:2015-07-19 06:41:35
【问题描述】:

这是一个自学者的帖子。

我的任务:

我有一本包含 15.000 个条目的字典。用户可以通过选中与每个字典条目相关的复选框来选择是否显示条目。

复选框和条目显示在动态生成的列表中,用户选择列表的长度。

复选框的状态存储在 localStorage 中,有两个:

localStorage(key,true);
localStorage(key,null);

并且复选框设置为 :checked 如果它们的相关键配对为“true”。

现在我需要一个更新按钮来将整个列表重置为“所有未选中的复选框”。

这对我来说似乎是一项艰巨的任务,因为列表的长度是动态设置的,而且我还担心我的函数会影响整个 localStorage。

【问题讨论】:

  • 在什么情况或事件中,您必须读取/保留用户选择?对于任何复选框选择中的每次更改都写入本地存储是没有意义的。
  • 我不是将复选框选择中的更改写入 localStorage,而是在 svg 图形中发生更改。用户在 svg 中完成交互后,复选框列表应反映这些交互。 updateStorage 按钮 只是将复选框列表重置为 all checked,这会将 svg 图形影响到 all shown。我会考虑您写信给的建议localStorage 仅一次,在本例中是在与 svg 交互结束时。

标签: javascript html checkbox local-storage


【解决方案1】:

以下是我将如何构建数据(不严格):

var checkboxes = {
    "key-1": {    // might as well do to say: "key-1": true/false
        "checked": true
    },
    "key-2": {
        "checked": false
    },
    ...,
    "key-n-1": {
        "checked": true/false
    },
    "key-n": {
        "checked": true/false
    }
};

以下是我将如何定义更新函数

function updateStorage(){
    var serialisedData = JSON.stringify(checkboxes);
    localStorage.setItem("checkboxes-state", serialisedData);
};

以下是我将如何读取存储的数据

function readStorage(){
    var serialisedData = localStorage.getItem("checkboxes-state");
    // then deserialise it
    var data = JSON.parse(serialisedData);
    // it may be empty
    if(!data){
        checkboxes = {}; // if empty initialise it
    } else {
        checkboxes = data;
    }
}

以下是我将如何使用读取的数据更新 DOM 中适当元素的状态,并在复选框状态更改时更新数据

d3.selectAll(".box").each(function(){
    if(checkboxes.hasOwnProperty(this.id)){
        this.checked = checkboxes[this.id].checked;
    }
}).on("change", function(){
    if(checkboxes.hasOwnProperty(this.id)){
        checkboxes[this.id].checked = this.checked;
    }else{
        checkboxes[this.id] = {
            "checked": this.checked
        };
    }
});

频繁读/写存储没有意义。理想情况下,对于大多数正常用例,每个会话读取一次就足够了。并且至少需要保存一次。

你可以细化你的问题,我可以给你更具体的答案。


把它们放在一起

var checkboxes = {
    "key-1": {    // might as well do to say: "key-1": true/false
        "checked": true
    },
    "key-2": {
        "checked": false
    },
    ...,
    "key-n-1": {
        "checked": true/false
    },
    "key-n": {
        "checked": true/false
    }
};

var updateStorage = function(){
    var serialisedData = JSON.stringify(checkboxes);
    localStorage.setItem("checkboxes-state", serialisedData);
};

var readStorage = function(){
    var serialisedData = localStorage.getItem("checkboxes-state");
    // then deserialise it
    var data = JSON.parse(serialisedData);
    // it may be empty
    if(!data){
        checkboxes = {}; // if empty (i.e. if this was the first time the application was run on the current client) initialise it
    } else {
        checkboxes = data; // if we have data, restore it by assigning it to `checkboxes` variable
    }

    // having read the checkboxes states from the local storage, we reflect the read data on the DOM
    d3.selectAll(".box").each(function(){
        if(checkboxes.hasOwnProperty(this.id)){
            this.checked = checkboxes[this.id].checked;
        }
    });
};

// on application load, read the storage
readStorage();

// bind the update function to its trigger button
d3.select("#update").on("click", updateStorage);

// update the `checkboxes` variable whenever user makes changes in selections
d3.selectAll(".box").on("change", function(){
    if(checkboxes.hasOwnProperty(this.id)){
        // update existing entry
        checkboxes[this.id].checked = this.checked;
    }else{
        // add new entry and set its state
        checkboxes[this.id] = {
            "checked": this.checked
        };
    }
});

所以你去。

【讨论】:

  • 谢谢。您将如何更新 serializedData。用户通过一个广泛的列表从字典中进行预选。选中的项目显示在 svg 显示中。在此显示中,用户可以交互并再次选择项目,选择是否希望它们继续显示,或者已经了解,从显示部分中删除。后一个操作还将此处描述的复选框重置为 true 或 null,从而更改 localStorage。重新加载时,svg 的列表和内容都是从 localStorage 获取的,它们是相同的。
  • 添加:复选框的 id 包含字典条目的值。这允许在 svg 显示中使用简单的过滤器解决方案。示例:在 svg 中显示 100 个单词。您决定其中 50 个很简单,然后您可以在 svg 中即时选择它们或在复选框列表中选择它们以不再显示。
  • 回答您的问题 > “您将如何更新 serializedData”? - 通过首先对其进行反序列化来更新它,从而取回原始数据。然后你可以像往常一样更新数据对象,当你使用完数据对象后,你再次序列化并保存到本地存储。上述答案中的声明var data = JSON.parse(serialisedData); 实现了反序列化。根据属性和内容的比较,data 的值将与上次保存的 checkboxes 相同。
  • 我更新了我的答案,没有经过测试,它在概念上看起来是否正确?仍在研究您的示例。不确定我是否需要以这种方式进行字符串化?
  • 好的,解析有意义。谢谢。
【解决方案2】:

修改。目的是将多个选中的复选框重置为未选中,并将更改保留在 localStorage 中:

d3.select("#update").on("click",storeNull);

function storeNull () {


      var updatethis = d3.selectAll(".box").filter(":checked").each(function(){

      var use_it = this.id;
      localStorage.setItem(use_it,null);

      });

};

【讨论】:

    猜你喜欢
    • 2022-10-12
    • 1970-01-01
    • 2019-01-15
    • 2022-10-14
    • 1970-01-01
    • 1970-01-01
    • 2020-03-27
    • 2022-10-04
    • 1970-01-01
    相关资源
    最近更新 更多