【问题标题】:Chrome extension and local storageChrome 扩展和本地存储
【发布时间】:2012-12-06 03:59:03
【问题描述】:

我正在尝试制作 Chrome 扩展程序。对于该扩展,我需要一些动态创建的信息,但我希望稍后(在不同的页面上)添加这些数据。

这是我希望始终可以访问的某种数据(当插件运行时):

var villages = new Array();
villages[0][0] = "village1"; 
villages[0][1] = "1325848"; 
villages[1][0] = "village2"; 
villages[1][1] = "8744351"; 
villages[2][0] = "village3"; 
villages[2][1] = "8952187"; 

如您所见,数组是多维的。这是因为我想将名称 [0] 和村庄 ID 1 存储在一起。

有人知道处理这个问题的好方法吗?

我看过这个:jQuery Cookie

但不知道这是否是处理问题的正确方法。

或者,我是否必须创建某种包含所有值的 XML 文件?

【问题讨论】:

  • 你熟悉localStorage吗?
  • @apsillers,没有。但学习永远不晚???
  • @apsillers,这对谷歌浏览器有用吗?因为链接指向一个Firefox页面???
  • 不!我问只是为了如果您由于某种原因无法使用它,我不会给您localStorage 解决方案。但由于你不知道它,它可能正是你所需要的。
  • 我编辑了一个新链接,是的,所有现代浏览器都支持localStorage,并且可以在 Chrome 扩展程序中使用。

标签: javascript google-chrome cookies google-chrome-extension storage


【解决方案1】:

更新:

这是一个骨架示例,如果您只想存储村庄.id 和村庄.name,只需更改默认数据,仍然有效。 我已经为您更改了所有代码,您将在代码下方看到如何迭代数组并获取村庄数据。


首先我应该说,将数据保存在多维数组中是非常糟糕的做法。

你应该使用对象,它使你的数据整洁,而不是你可以轻松地操作它。

这是一个适合您情况的示例对象,

var village = {
  id: "1325848", 
  name : "village1"
};

console.log(village.id); //1325848
console.log(village.name); //village1

这是一个基本的入门示例。

这是解决您的本地存储和 javascript 对象问题的方法。

var ExtensionDataName = "myfirstextensiondata";
var ExtensionData = {
  dataVersion: 3, //if you want to set a new default data, you must update "dataVersion".
  villages: []
};


//default data
ExtensionData.villages.push(
    {id: "1325848", name: "village1"},
    {id: "8744351", name: "village2"},
    {id: "8952187", name: "village3"}
);

function DB_setValue(name, value, callback) {
    var obj = {};
    obj[name] = value;
    console.log("Data Saved!");
    chrome.storage.local.set(obj, function() {
        if(callback) callback();
    });
}

function DB_load(callback) {
    chrome.storage.local.get(ExtensionDataName, function(r) {
        if (isEmpty(r[ExtensionDataName])) {
            DB_setValue(ExtensionDataName, ExtensionData, callback);
        } else if (r[ExtensionDataName].dataVersion != ExtensionData.dataVersion) {
            DB_setValue(ExtensionDataName, ExtensionData, callback);
        } else {
            ExtensionData = r[ExtensionDataName];
            callback();
        }
    });
}

function DB_save(callback) {
    DB_setValue(ExtensionDataName, ExtensionData, function() {
        if(callback) callback();
    });
}

function DB_clear(callback) {
    chrome.storage.local.remove(ExtensionDataName, function() {
        if(callback) callback();
    });
}

function isEmpty(obj) {
    for(var prop in obj) {
        if(obj.hasOwnProperty(prop))
            return false;
    }
    return true;
}

DB_load(function() {
    //YOUR MAIN CODE WILL BE HERE
    console.log(ExtensionData);
    console.log(ExtensionData.villages); //array of villages
    console.log(ExtensionData.villages[0]); //first village object
    console.log(ExtensionData.villages[0].id); //first village id
    console.log(ExtensionData.villages[0].name); //first village name

    //HOW TO ITERATE VILLAGES

    for (var i = 0; i < ExtensionData.villages.length; i++) {
        console.log(ExtensionData.villages[i].id); //village id
        console.log(ExtensionData.villages[i].name); //village name
    } 
});

问题:

  • ExtensionDataName 是否相同?或者我可以改变吗?

ExtensionDataName 在您的数据保存到本地存储时用作名称,它只是您的数据集合的名称。因此,你当然可以改变它,做你想做的,这取决于你。

  • 更改此行的编号后达到的目标是什么: dataVersion: 3, //if you want to set a new default data, you must update "dataVersion"?

当用户第一次运行这个扩展时,本地存储中没有数据。所以使用默认的村庄列表,

在我的示例中,默认村庄列表是,

[
    {id: "1325848", name: "village1"},
    {id: "8744351", name: "village2"},
    {id: "8952187", name: "village3"}
]

此默认列表保存到本地存储。当扩展再次运行后(不是第一次),默认列表不再重要,因为在localstorage中存储了一个村庄列表,所以它从localstorage加载村庄列表。

例如,如果您想在扩展运行时添加一个新村庄,您可以这样做,

ExtensionData.villages.push({id: "1215555", name: "village4"});
DB_save();

那么dataVersion的目标是什么?

如果你看DB_load() 函数,它在那里被使用。它检查dataVersion是否仍然相同,如果不同,它决定

"有一个更新的默认数据,所以我应该清除 localstorage 并将新数据重新加载到 localstorage"

所以如果你不改变这行,

ExtensionData.villages.push(
    {id: "1325848", name: "village1"},
    {id: "8744351", name: "village2"},
    {id: "8952187", name: "village3"}
);

你不会改变dataVersion

【讨论】:

  • 看起来很不错,但现在不能看。有空我会看看;)
  • 我不需要坐标。它只是我想要保存在一起的名称和 ID(或将数组分开存储并通过它们循环在一起......那么使用它仍然很方便吗?或者你是否建议更好的编程方式?
  • 好吧,我想我明白了,但我还有 2 个问题。 1:ExtensionDataName 是一样的吗?或者我可以改变吗?当您更改此行的编号时,您实现的目标是什么:dataVersion: 3, //if you want to set a new default data, you must update "dataVersion". 我要感谢您迄今为止的所有帮助
  • @MarcMeesters,我再次更新了我的答案,并回答了您的问题。很乐意提供帮助。
  • 非常感谢您的帮助,将在源代码中添加指向此的链接。谢谢!
猜你喜欢
  • 1970-01-01
  • 2014-06-03
  • 2012-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多