Javascript 如何为Chrome扩展存储多个选项?

Javascript 如何为Chrome扩展存储多个选项?,javascript,json,google-chrome-extension,Javascript,Json,Google Chrome Extension,我正在开发一个Chrome扩展,用不同的单词替换网站上的单词。 我允许用户输入他们自己希望被替换的单词,并将其保存如下: function storeOptions(){ var words = new Object(); // storageArea.set() method takes an object that contains all the items to be stored. This Object contains those. $("option").each(functio

我正在开发一个Chrome扩展,用不同的单词替换网站上的单词。 我允许用户输入他们自己希望被替换的单词,并将其保存如下:

function storeOptions(){
var words = new Object(); // storageArea.set() method takes an object that contains all the items to be stored. This Object contains those.
$("option").each(function(key,value){ // .each(index, element)
 words[value.id] = value.text;
 chrome.storage.sync.set(words, function(){console.log("Stored: "+value.text);});
});
}
{
  "status": "enabled",
  "words": {
    "option_id1": "option_text1",
    "option_id2": "option_text2",
    ...
  }
}
// Retrieve the extension status:
chrome.storage.sync.get('status', items => {
  const status = items.status;
  ...
});

// Retrieve the words:
chrome.storage.sync.get('words', items => {
  const words = items.words;
  Object.keys(words).forEach(key => {
    console.log(`Replacing '${key}' with '${words[key]}'...`);
    ...
  });
});
在实现此功能之前,我使用browseraction成功启用和禁用了扩展,browseraction使用了以类似方式存储在同一存储区域中的设置:

chrome.storage.sync.set({"status":"enabled"});
我面临的问题是,在实现添加单词的选项后,状态要么没有正确存储,要么受到选项的影响,因为当我尝试检索它时,它没有“启用”或“禁用”的值,如下所示:

chrome.storage.sync.get("status", function(result) {
  console.log("status: "+result["status"]); // status: status
});
我在想,也许我可以将要替换的单词存储为一个数组,调用方式如下:

chrome.storage.sync.set({"words" : words});
然后我就可以通过获得“地位”或“话语”来区分这两个词,但这不起作用


我如何存储状态和单词而不相互干扰?

我不确定chrome存储,但是html5存储API,localstorage和sessionstorage都是用来存储键和值,而不是键和对象的


您需要对Word对象进行字符串化,以便将其存储为值。

您描述发生这种情况的唯一原因是,如果存在id为
status
且value
status
元素(在这种情况下,它将覆盖原始状态)

在任何情况下,将所有与选项相关的键值对“封装”到存储中的对象(不一定是数组)中都是一个好主意

(最后,不需要逐个存储这些值。首先创建整个对象,然后通过调用
chrome.storage.sync.set()
将其存储,这样效率会更高)

现在,您的storage.sync将如下所示:

function storeOptions(){
var words = new Object(); // storageArea.set() method takes an object that contains all the items to be stored. This Object contains those.
$("option").each(function(key,value){ // .each(index, element)
 words[value.id] = value.text;
 chrome.storage.sync.set(words, function(){console.log("Stored: "+value.text);});
});
}
{
  "status": "enabled",
  "words": {
    "option_id1": "option_text1",
    "option_id2": "option_text2",
    ...
  }
}
// Retrieve the extension status:
chrome.storage.sync.get('status', items => {
  const status = items.status;
  ...
});

// Retrieve the words:
chrome.storage.sync.get('words', items => {
  const words = items.words;
  Object.keys(words).forEach(key => {
    console.log(`Replacing '${key}' with '${words[key]}'...`);
    ...
  });
});
您可以检索如下所示的值:

function storeOptions(){
var words = new Object(); // storageArea.set() method takes an object that contains all the items to be stored. This Object contains those.
$("option").each(function(key,value){ // .each(index, element)
 words[value.id] = value.text;
 chrome.storage.sync.set(words, function(){console.log("Stored: "+value.text);});
});
}
{
  "status": "enabled",
  "words": {
    "option_id1": "option_text1",
    "option_id2": "option_text2",
    ...
  }
}
// Retrieve the extension status:
chrome.storage.sync.get('status', items => {
  const status = items.status;
  ...
});

// Retrieve the words:
chrome.storage.sync.get('words', items => {
  const words = items.words;
  Object.keys(words).forEach(key => {
    console.log(`Replacing '${key}' with '${words[key]}'...`);
    ...
  });
});

在查看文档之前,最好不要回答您不确定的问题。像这样的建议(这是无效的,因为chrome.storage可以存储对象)更适合于评论,而不是回答。当然,你有权发表意见。另外,最好不要用反对票来表达不同意见。如果你愿意阅读的话,否决票的意思是表示答案是错误的,而我的答案不是。我的意见在评论中表达。投反对票的是错误/低质量的答案:1。OP询问有关chrome.storage的问题,你说你不知道。2.OP询问
chrome.storage
->您提供了有关本地/会话存储的信息(如果有人询问JavaEE中的身份验证,我回答“我不了解Java,但在PHP中您可以这样做”,那么即使PHP信息有效,我的回答也肯定是错误的(或者质量极低)。3.最后,您得出结论:“您需要对Word对象进行字符串化,以便将其存储为值。“不清楚您的意思是将其应用于(a)本地/会话存储还是(b)
chrome。如果您的意思是(a),那么请参阅我的第二点。如果您的意思是(b)这是完全错误的。”您会这样做吗“是一个有条件的陈述。就像“我不是a方面的专家,但如果它表现得像B,你就需要做C”。我真的不应该向你解释这一点。但是,你也可以继续将StackOverflow的目的与你自己的判断意见相混淆,或者根据糟糕的阅读理解给出否定。祝你好运。