3

我正在尝试制作 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 文件?

4

1 回答 1

10

更新:

这是一个骨架示例,如果您只想存储村庄.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 是否仍然相同,如果不同,它决定

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

所以如果你不改变这条线,

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

比你不会改变dataVersion

于 2012-12-18T23:10:23.727 回答