在Chrome扩展程序中无法使用chrome.storage.sync存储/检索对象

时间:2018-06-25 07:06:09

标签: javascript google-chrome-extension javascript-objects

我正在尝试存储Range对象,该对象是根据用户选择的文本创建的,并使用chrome.storage.sync作为页面URL作为键。由于一个特定的页面可能有多个选择,因此我使用一个数组来保存所有Range对象。

但是我无法成功完成。每次我尝试将新的Range对象推入数组时,先前的对象都为空。因此,我只会得到一个数组,其中除我推送的最后一个Range对象外,所有对象均为空。

这是我的代码段:

var selectedRange = window.getSelection().getRangeAt(0); 
var key = request.url;
chrome.storage.sync.get([key], function(result){
    /*check if an object is already present in storage with this key*/
    if(Object.keys(result).length === 0 && result.constructor === Object){
        console.log("No entry for " + key + " present in storage");

        var entry = {}; 
        /*create a new array with the first Range object*/
        entry[key] = [selectedRange];
        chrome.storage.sync.set(entry, function(){
            console.log(entry);
        }); 
    } else {
        console.log("Entry found!");

        var value = result[key];
        /*push the Range object in the existing array*/ 
        value.push(selectedRange);

        chrome.storage.sync.remove(key, function(response){
            var entry = {}; 
            entry[key] = value;
            chrome.storage.sync.set(entry, function(){
                console.log(entry);
            }); 
        }); 
    }
});

当我一个接一个地添加3个对象时,这是控制台的输出:

output from the console when I add Range objects

更奇怪的是,如果我只是尝试存储一个字符串而不是Range对象,例如,通过对selectedRange使用此定义,

var selectedRange = "SomeString";

存储完全按预期工作。 documentation for storage API说它可以将用户数据存储为对象。


编辑

借助@wOxxOm,我能够找到问题所在,即chrome.storage api只能存储JSONifiable对象,而Range对象不是JSONifiable。

我考虑过创建一个新对象,并只存储startContainerstartOffsetendContainerendOffset属性。然后,我将能够使用Rangerange.setStart(startNode, startOffset)方法重新创建range.setEnd(endNode, endOffset)对象。

但是后来我发现,即使Node对象也不是JSONifiable的! :(

如果您能告诉我解决此问题的方法,那就太好了。

谢谢!

0 个答案:

没有答案