2

我在尝试制作Chrome扩展程序。对于该扩展,我需要一些动态创建的信息,但是我希望即使稍后(在不同的页面上)也能添加这些数据。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]和村庄编号1一起存储。

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

我看这个:jQuery Cookie

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

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

+0

你熟悉['localStorage'(http://diveintohtml5.info/storage.html)? – apsillers

+0

@apsillers,no。但是,从来没有迟到学习的权利? – Mathlight

+0

@apsillers,这是否适用于谷歌浏览器?因为链接导致一个Firefox页面? – Mathlight

回答

9

UPDATE:

这是一个骨架例如,如果你想存储只是village.id和village.name,只需更改默认的数据,目前仍然可以工作。 我已经改变了你的所有代码,你会看到如何迭代数组并获取代码下面的村庄数据。


起初我应该说,这是非常糟糕的做法将数据保存在一个多维数组。

您应该使用对象,它使您的数据整齐,比您可以轻松操作它。

这里是您的情况为例对象,

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

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

这是一个基本的上手例子。

这里是你的问题与localstorage和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用作将数据保存到localstorage时的名称,它只是数据集合的名称。因此,你当然可以改变它,做你想做的,这取决于你。

  • 是什么,当你改变这一行的数量,你achief目标: 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中存在一个村庄列表,所以它从localstorage加载村庄列表。

例如,如果你想扩展的运行时间,你可以做这样的过程中添加一个新的村庄,

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

那么什么是dataVersion的目标是什么?

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

有一个更新的缺省数据,所以我应该清除的localStorage和重新加载新的数据到localStorage的

所以,如果你不” T改变这一行,

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

比你都不会改变dataVersion

+0

看起来很好,但现在不能看看它。我会看看,当我可以;) – Mathlight

+0

我不需要坐标。它只是我想要保存在一起的名称和ID(或者将阵列分开并通过它们循环到一起...仍然可以方便地使用它,或者您是否拥有更好的编程方式? – Mathlight

+0

@MarcMeesters, – ocanal