Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/426.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将d3树状态保存到localStorage_Javascript_Json_D3.js_Local Storage - Fatal编程技术网

Javascript 将d3树状态保存到localStorage

Javascript 将d3树状态保存到localStorage,javascript,json,d3.js,local-storage,Javascript,Json,D3.js,Local Storage,我用d3.js制作了一个可折叠的树布局,用户可以在其中单击以展开和折叠分支。如果用户在展开某些分支后离开页面,稍后返回页面,则图表应与他们离开时处于相同的状态 现在,我有一个click函数,它将已单击的节点标记为打开或关闭,或者如果尚未单击,则标记为未定义: 功能点击{ 如果你有孩子{ d、 _children=d.children; d、 children=null; }否则{ d、 儿童=d.\U儿童; d、 _children=null; } //切换节点状态 如果d.state==未定义

我用d3.js制作了一个可折叠的树布局,用户可以在其中单击以展开和折叠分支。如果用户在展开某些分支后离开页面,稍后返回页面,则图表应与他们离开时处于相同的状态

现在,我有一个click函数,它将已单击的节点标记为打开或关闭,或者如果尚未单击,则标记为未定义:

功能点击{ 如果你有孩子{ d、 _children=d.children; d、 children=null; }否则{ d、 儿童=d.\U儿童; d、 _children=null; } //切换节点状态 如果d.state==未定义| | d.state==关闭{ d、 状态=打开; }否则{ d、 状态=关闭; } 更新; } 这非常好用,而且很简单

我的想法是用这些新信息更新我正在使用的JSON数据集,并将其写入localStorage,每次用户来到页面时首先检查它,然后虚拟地单击标记为打开的所有节点,不知道如何执行其他操作

但问题是,我如何用这个新的节点信息重写JSON数据集,或者有没有比我上面概述的更好的方法


请注意,本地存储的实际输入和获取不是问题所在;我知道怎么做。特别是如何将树的当前状态返回到一个新的/修改过的数据集中,当用户返回页面时,脚本可以再次读取该数据集。

鉴于您实际上只能存储键值对,我将保存节点的ID以及它是否展开。@Larskothoff看起来您就是这里的d3联系人:。你认为我可以得到那个id和状态,然后d3。选择那个节点,然后点击它?这是否足够?一次只打开一个分支,我会反过来做——迭代所有节点并检查它们是否打开。当然,你也可以按自己的方式来做,这对大树来说也更有效。这是一棵大树。事实上,这是国家如此重要的原因。不希望有人必须再次遍历,除非他们选择。好的,那么您可以从本地存储获取打开节点的ID,然后选择这些节点,例如,ID可以对应于DOM ID,并执行您必须执行的任何操作来扩展它们。