我正在尝试存储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个对象时,这是控制台的输出:
更奇怪的是,如果我只是尝试存储一个字符串而不是Range对象,例如,通过对selectedRange
使用此定义,
var selectedRange = "SomeString";
存储完全按预期工作。 documentation for storage API说它可以将用户数据存储为对象。
编辑:
借助@wOxxOm,我能够找到问题所在,即chrome.storage
api只能存储JSONifiable对象,而Range
对象不是JSONifiable。
我考虑过创建一个新对象,并只存储startContainer
,startOffset
,endContainer
和endOffset
属性。然后,我将能够使用Range
和range.setStart(startNode, startOffset)
方法重新创建range.setEnd(endNode, endOffset)
对象。
但是后来我发现,即使Node
对象也不是JSONifiable的! :(
如果您能告诉我解决此问题的方法,那就太好了。
谢谢!