Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/78.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 Chrome.storage无法正确存储阵列_Javascript_Html_Google Chrome Extension_Local Storage - Fatal编程技术网

Javascript Chrome.storage无法正确存储阵列

Javascript Chrome.storage无法正确存储阵列,javascript,html,google-chrome-extension,local-storage,Javascript,Html,Google Chrome Extension,Local Storage,我正在开发一个chrome扩展,但是chrome.storage api有问题。我想将一个数组保存到存储器中,该数组被存储,但不是数组的值。所以数组[x]总是“null”。代码如下所示: var storage = chrome.storage.local; bookmarks = new Array(); var newButton = document.createElement('input'); //... Button properys are getting set bookmar

我正在开发一个chrome扩展,但是chrome.storage api有问题。我想将一个数组保存到存储器中,该数组被存储,但不是数组的值。所以数组[x]总是“null”。代码如下所示:

var storage = chrome.storage.local;
bookmarks = new Array();

var newButton = document.createElement('input');
//... Button properys are getting set
bookmarks[bookmarks.length] = newButton; //tried it also with .push()
var obj = {};
obj['bookmarks'] = bookmarks;
storage.set(obj, function(){ console.log('bookmark saved'); });
Storage:  
Object
bookmarks: Array[1]
0: null
length: 1
__proto__: Array[0]
__proto__: Object
重新启动扩展并通过以下方式获取存储后:

storage.get(null, function(result){
    console.log('Storage: ', result);
    });
日志如下所示:

var storage = chrome.storage.local;
bookmarks = new Array();

var newButton = document.createElement('input');
//... Button properys are getting set
bookmarks[bookmarks.length] = newButton; //tried it also with .push()
var obj = {};
obj['bookmarks'] = bookmarks;
storage.set(obj, function(){ console.log('bookmark saved'); });
Storage:  
Object
bookmarks: Array[1]
0: null
length: 1
__proto__: Array[0]
__proto__: Object
是否有任何建议说明出现了什么问题以及阵列存储不正确的原因


谢谢

要在
Chrome.storage
中存储对象,该对象必须可序列化。通过尝试
JSON.stringify()
it,可以测试对象是否可序列化。如果在控制台中尝试以下操作:

JSON.stringify(document.createElement('input'));
您将看到抛出一个错误-
TypeError:将循环结构转换为JSON
。这意味着该对象无法序列化,因为它包含对self的引用

鉴于DOM元素无法序列化,因此无法存储,解决方案是创建一个新对象,向其中添加所需的按钮属性,并存储该属性:

bookmarks = new Array();
var newButton = document.createElement('input');
//... Button properties are getting set
var data = {
    prop: newButton.prop
};
bookmarks.push(data);
storage.set({ bookmarks: bookmarks });

newButton对象太复杂,无法存储。相反,您应该存储一个基元值。例如,如果运行以下操作,则可以从storage.local检索预期的
{bookmarks:[{foo:bar}]}

var storage = chrome.storage.local;
bookmarks = new Array();

bookmarks[bookmarks.length] = {foo:"bar"};
var obj = {};
obj['bookmarks'] = bookmarks;
storage.set(obj, function(){ console.log('bookmark saved'); });

如果你打印newButton变量,你会得到什么?如果我记录我得到的按钮:如果你修改索引,像这样-bookmarks[0]=newButton;它是否仍然存储null?在存储中仍然为null。书签[0]是新按钮如果将新按钮存储在书签数组之外的存储对象中,它是否仍然为空?据我所知,代码中没有错误。只是提醒一下:
localStorage
,与
chrome不同,
chrome.storage
可以直接存储和检索JSON对象。没有必要使用
JSON.stringify/parse
.thx,我明天会试试……现在太累了。ofc会给你反馈吗?实际的问题不是他存储的是对象而不是字符串,而是这样的对象需要可序列化。应更正此答案,以避免混淆chrome.storage与localStorage@levi答案仍然是“在Chrome.storage中存储对象时,必须首先将对象序列化为字符串”,但这是不正确的。存储确实允许您存储对象而不必序列化它,它只需要是可序列化的。看见