Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/453.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 如何在会话存储中使用相同的密钥更新阵列_Javascript_Arrays_Local Storage_Session Storage - Fatal编程技术网

Javascript 如何在会话存储中使用相同的密钥更新阵列

Javascript 如何在会话存储中使用相同的密钥更新阵列,javascript,arrays,local-storage,session-storage,Javascript,Arrays,Local Storage,Session Storage,我正在尝试将访问过的页面历史记录存储在会话存储中。 会话存储按我所希望的方式工作 问题: 当我访问第一、第二、第三和第四页,然后再次访问第二和第三页时,它不会再次使用第二和第三页更新阵列 没有在数组第2页和第3页中添加数据,这些已经存在,但我再次访问这些页面,然后应该将其添加到数组中 我想在数组中存储历史记录中访问的每个页面 if (window.sessionStorage) { var currentTite = document.title; var currentURL

我正在尝试将访问过的页面历史记录存储在会话存储中。 会话存储按我所希望的方式工作

问题: 当我访问第一、第二、第三和第四页,然后再次访问第二和第三页时,它不会再次使用第二和第三页更新阵列

没有在数组第2页和第3页中添加数据,这些已经存在,但我再次访问这些页面,然后应该将其添加到数组中

我想在数组中存储历史记录中访问的每个页面

if (window.sessionStorage) {
    var currentTite = document.title;
    var currentURL = window.location.href;
    sessionStorage.setItem(currentTite, currentURL);
    //var storedData = sessionStorage.getItem(currentTite);

    for (i = 0; i <= sessionStorage.length - 1; i++) {
        key = sessionStorage.key(i);
        console.log(key);
        val = sessionStorage.getItem(key);
        console.log(val);
    }
}
if(窗口会话存储){
var currentTite=document.title;
var currentURL=window.location.href;
setItem(currentTite,currentURL);
//var storedData=sessionStorage.getItem(currentTite);

对于(i=0;isessionStorage
对象不是数组。它是本地
Storage
构造函数的一个实例,用于在页面导航上持久化数据。每个键只能有一个值。最好的办法是在
history
键下命名会话中的历史,并在该键下存储JSON数组钥匙

以下是一个例子:

window.addEventListener('load',函数recordInHistory(){
var current=sessionStorage.getItem('history');
如果(!current){//检查项目是否已注册
current=[];//如果不是,则启动一个空数组
}否则{
current=JSON.parse(current);//否则解析
}
当前推送({
标题:document.title,
url:window.location.href
});//添加项
sessionStorage.setItem('history',JSON.stringify(current));//替换

})
这取决于您以后要如何处理数据。无论如何,由于
会话存储是一个键值存储,您不能用相同的键保存不同的值,也不能在存储中有重复的键值对

作为一个选项,您可以存储用户历史记录数组,由对象(
{title:document.title,url:window.location.href}
)表示。代码如下所示:

var UserHistory = {
   key: 'userHistory',
   push: function() {
      var cur = JSON.parse(sessionStorage.getItem(UserHistory.key)) || [];
      cur.push({ title: document.title, url: window.location.href });
      sessionStorage.setItem(UserHistory.key, JSON.stringify(cur));
   },
   get: function() {
      return JSON.parse(sessionStorage.getItem(UserHistory.key));
   }
}
UserHistory.get(); // null
UserHistory.push();
UserHistory.get(); // [ Object ]

setItem
的第一个参数是一个键,您可以附加一个随机数或Date.now()或一个计数器++值以使其唯一

if (window.sessionStorage) {
    var currentTite = document.title;
    var currentURL = window.location.href;
    sessionStorage.setItem(currentTite + ':' + Date.now().toString(), currentURL);

    for (i = 0; i <= sessionStorage.length - 1; i++) {
        key = sessionStorage.key(i);
        console.log(key);
        val = sessionStorage.getItem(key);
        console.log(val);
    }
}
if(窗口会话存储){
var currentTite=document.title;
var currentURL=window.location.href;
sessionStorage.setItem(currentTite+':'+Date.now().toString(),currentURL);

对于(i=0;i如何在控制台中简单地获取所有细节?@puzzdboy有一个
get
方法返回整个数据数组。然后您对其进行迭代。如何在控制台中简单地获取所有细节?@puzzdboy只需使用
console.log(sessionStorage.getItem('history'))
@puzzdboy用您问题中的
currentTite
变量替换
'history'
没有什么错。如果您的javascript代码是从外部文件加载并在多个页面中使用的,我会这样做。包括
Date.now()
在sessionStorage键中不是一个好主意。每次用户重新加载页面时,您都在创建另一组数据。您如何确定要加载的数据集和要删除的数据集?@Mottie您是对的,但这不是问题的目标吗?也许递增数字更合适。啊,是的,我想您是对的。我不知道why没有被使用。