为什么我的 Google Chrome 扩展没有使用 Set() 正确保存数据?
Why my Google Chrome extension isn't saving data correctly using a Set()?
我正在尝试创建一个能够记住我访问过的一些网站的扩展程序。当我按下扩展时,有一个按钮(允许用户保存选项卡的当前 URL 和标题)和一个“a”元素,它将重定向到已保存的 URL。这个想法是让它能够保存不同的 URL,但首先我希望它能够保存一个。
有人告诉我用 Set() 来做。我有代码,但出了点问题,所以当我用最后保存的元素按下“a”元素时,它会打开那个方向:chrome-extension://the_key_of_my_extension/[object%20Set%20Iterator]
或:chrome-extension://the_key_of_my_extension/[undefined]
.
我做错了什么?我已经搜索了一段时间,但没有发现任何错误。谢谢!
var urlSet = new Set();
var titleSet = new Set();
chrome.storage.sync.get(["activeTab", "nameOfTheTab"], function(items){
urlSet.add(items.activeTab);
titleSet.add(items.nameOfTheTabs);
document.getElementById('urlDude').href = [...urlSet];
document.getElementById('urlDude').innerHTML = [...titleSet];
});
saveItem.onclick = function(element) {
chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
urlSet.add(tabs[0].url);
titleSet.add(tabs[0].title);
chrome.storage.sync.set({ "activeTab": [...urlSet] }, function(){ });
chrome.storage.sync.set({ "nameOfTheTab": [...titleSet] }, function(){ });
document.getElementById('urlDude').href = [...urlSet];
document.getElementById('urlDude').innerHTML = [...titleSet];
});
};
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="./popus.css">
</head>
<body>
<button id="saveItem">save</button>
<script src="popup.js"></script>
<br>
<br>
<a id="urlDude" target="_blank"><p>Hola</p></a>
<a id="urlDude2" target="_blank"><p>Hola2</p></a>
</body>
</html>
更新:
这是我现在拥有的:
var urlSet = new Map();
chrome.storage.sync.get(["activeTabs"], function(items){
if(!items.activeTabs)
return;
urlSet = new Map(JSON.parse(items.activeTabs));
AddLinks();
});
function AddLinks()
{
var myLinks="";
urlSet.forEach(function(value, key) {
//myLinks+="<a href='"+value+"' target='_blank'>"+key+"</a> <span>X</span><br>";
pushingData(value, key);
});
//document.getElementById('mydiv').innerHTML = myLinks;
}
saveItem.onclick = function(element) {
chrome.tabs.query({active: true}, function(tabs) {
urlSet.set(tabs[0].title, tabs[0].url);
chrome.storage.sync.set({ "activeTabs":JSON.stringify(Array.from(urlSet.entries())) });
pushingData(tabs[0].url, tabs[0].title);
});
};
function pushingData(value, key) {
var atags = document.createElement("a");
atags.href = value;
atags.innerHTML = key;
document.getElementById('mydiv').append(atags);
var newButton = document.createElement("button");
newButton.innerHTML = "x";
newButton.addEventListener('click', function() { urlSet.delete(key); });
document.getElementById('mydiv').append(newButton);
var breakLine = document.createElement("br");
document.getElementById('mydiv').append(breakLine);
};
我在我的扩展程序中尝试了您的代码(稍作修改)并且它有效,所以我怀疑您之前的尝试可能导致存储卡住了一些东西。这是我得到的:
var urlSet = new Map();
chrome.storage.sync.get(["activeTabs"], function(items){
if(!items.activeTabs)
return;
urlSet = new Map(JSON.parse(items.activeTabs));
AddLinks();
});
function AddLinks()
{
//There are better ways of doing this!
var myLinks="";
urlSet.forEach(function(value, key) {
myLinks+="<a href='"+value+"' target='_blank'>"+key+"</a>";
});
// You may want to come up with a way to delete links
//before they get out of control and proclaim independence
document.getElementById('mydiv').innerHTML = myLinks;
}
saveItem.onclick = function(element) {
chrome.tabs.query({active: true}, function(tabs) {
urlSet.set(tabs[0].title, tabs[0].url);
chrome.storage.sync.set({ "activeTabs":JSON.stringify(Array.from(urlSet.entries())) });
AddLinks();
});
};
更新
似乎将内联脚本添加到弹出窗口会导致安全问题。虽然可能会将您的页面列入白名单以使用其自己的脚本,但添加新元素的更好方法是使用 document.createElement 创建它们,而不是生成刺痛,让您了解它的外观:
var delButton = document.createElement("button");
delButton.innerHTML = "delete";
delButton.addEventListener('click',function(){/*something useful happens here*/});
document.getElementById('mydiv').append(delButton);
我正在尝试创建一个能够记住我访问过的一些网站的扩展程序。当我按下扩展时,有一个按钮(允许用户保存选项卡的当前 URL 和标题)和一个“a”元素,它将重定向到已保存的 URL。这个想法是让它能够保存不同的 URL,但首先我希望它能够保存一个。
有人告诉我用 Set() 来做。我有代码,但出了点问题,所以当我用最后保存的元素按下“a”元素时,它会打开那个方向:chrome-extension://the_key_of_my_extension/[object%20Set%20Iterator]
或:chrome-extension://the_key_of_my_extension/[undefined]
.
我做错了什么?我已经搜索了一段时间,但没有发现任何错误。谢谢!
var urlSet = new Set();
var titleSet = new Set();
chrome.storage.sync.get(["activeTab", "nameOfTheTab"], function(items){
urlSet.add(items.activeTab);
titleSet.add(items.nameOfTheTabs);
document.getElementById('urlDude').href = [...urlSet];
document.getElementById('urlDude').innerHTML = [...titleSet];
});
saveItem.onclick = function(element) {
chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
urlSet.add(tabs[0].url);
titleSet.add(tabs[0].title);
chrome.storage.sync.set({ "activeTab": [...urlSet] }, function(){ });
chrome.storage.sync.set({ "nameOfTheTab": [...titleSet] }, function(){ });
document.getElementById('urlDude').href = [...urlSet];
document.getElementById('urlDude').innerHTML = [...titleSet];
});
};
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="./popus.css">
</head>
<body>
<button id="saveItem">save</button>
<script src="popup.js"></script>
<br>
<br>
<a id="urlDude" target="_blank"><p>Hola</p></a>
<a id="urlDude2" target="_blank"><p>Hola2</p></a>
</body>
</html>
更新:
这是我现在拥有的:
var urlSet = new Map();
chrome.storage.sync.get(["activeTabs"], function(items){
if(!items.activeTabs)
return;
urlSet = new Map(JSON.parse(items.activeTabs));
AddLinks();
});
function AddLinks()
{
var myLinks="";
urlSet.forEach(function(value, key) {
//myLinks+="<a href='"+value+"' target='_blank'>"+key+"</a> <span>X</span><br>";
pushingData(value, key);
});
//document.getElementById('mydiv').innerHTML = myLinks;
}
saveItem.onclick = function(element) {
chrome.tabs.query({active: true}, function(tabs) {
urlSet.set(tabs[0].title, tabs[0].url);
chrome.storage.sync.set({ "activeTabs":JSON.stringify(Array.from(urlSet.entries())) });
pushingData(tabs[0].url, tabs[0].title);
});
};
function pushingData(value, key) {
var atags = document.createElement("a");
atags.href = value;
atags.innerHTML = key;
document.getElementById('mydiv').append(atags);
var newButton = document.createElement("button");
newButton.innerHTML = "x";
newButton.addEventListener('click', function() { urlSet.delete(key); });
document.getElementById('mydiv').append(newButton);
var breakLine = document.createElement("br");
document.getElementById('mydiv').append(breakLine);
};
我在我的扩展程序中尝试了您的代码(稍作修改)并且它有效,所以我怀疑您之前的尝试可能导致存储卡住了一些东西。这是我得到的:
var urlSet = new Map();
chrome.storage.sync.get(["activeTabs"], function(items){
if(!items.activeTabs)
return;
urlSet = new Map(JSON.parse(items.activeTabs));
AddLinks();
});
function AddLinks()
{
//There are better ways of doing this!
var myLinks="";
urlSet.forEach(function(value, key) {
myLinks+="<a href='"+value+"' target='_blank'>"+key+"</a>";
});
// You may want to come up with a way to delete links
//before they get out of control and proclaim independence
document.getElementById('mydiv').innerHTML = myLinks;
}
saveItem.onclick = function(element) {
chrome.tabs.query({active: true}, function(tabs) {
urlSet.set(tabs[0].title, tabs[0].url);
chrome.storage.sync.set({ "activeTabs":JSON.stringify(Array.from(urlSet.entries())) });
AddLinks();
});
};
更新 似乎将内联脚本添加到弹出窗口会导致安全问题。虽然可能会将您的页面列入白名单以使用其自己的脚本,但添加新元素的更好方法是使用 document.createElement 创建它们,而不是生成刺痛,让您了解它的外观:
var delButton = document.createElement("button");
delButton.innerHTML = "delete";
delButton.addEventListener('click',function(){/*something useful happens here*/});
document.getElementById('mydiv').append(delButton);