在撰写Chrome扩展程序时,如果有一个标签,如何在该标签中获取以前访问过的网页的网址?即在我点击"返回"后会出现在全方位的网址?
答案 0 :(得分:6)
由于我找不到任何API方法,我只是应用了vux777's suggestion above:每次加载页面时,我都会存储从其id到其URL的映射。然后,当我想找到标签的上一页时,我可以在那里搜索它。
所以,存储:
chrome.webNavigation.onCommitted.addListener(function (data) {
if (data.frameId !== 0) {
// Don't trigger on iframes
return;
}
var tabIdToUrl = {};
tabIdToUrl[data.tabId.toString()] = data.url;
chrome.storage.local.set(tabIdToUrl);
});
检索:
chrome.storage.local.get(tabId, function (item) {
var url = item[tabId];
...
});
答案 1 :(得分:2)
我遇到了同样的问题,真的希望chrome api能够在chrome.tabs.onUpdated
事件中返回前后网址。
我的解决方案类似于@Oak,但由于以下两个原因,我使用chrome.storage.local
而不是使用Window.sessionStorage
:
chrome.storage.local
的行为与Window.localStorage
类似,即使在浏览器关闭并重新打开时仍然存在。如果您不自行清理,您的本地存储将随着大量冗余信息而超时。使用会话存储,每当您关闭所有浏览器实例(持久性后台页面的生命周期结束)时。它会方便地忘记一切:)Window.sessionStorage
仅将数据存储在字符串中,这对此用例很有用( tab.url ),chrome.storage.local
功能更强大当您想要存储对象时,可以节省一些空间。我的测试用例是这样的:
chrome.tabs.onUpdated.addListener(function(tabId,changeInfo,tab){
var newUrl = changeInfo.url;
if(newUrl){
window.sessionStorage[tabId] = newUrl;
}
});
答案 2 :(得分:1)
另一种方法使用页面的 referrer。这要求:
content-script.js
// notify extension that a page has loaded its content script, and send referrer
chrome.runtime.sendMessage({ referrer: document.referrer });
background.js
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
console.log(sender.tab.id);
console.log(request.referrer);
});
或者,扩展程序可以查询选项卡以获取其引用。您必须确保选项卡已准备就绪(已加载内容脚本):
content-script.js
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
sendResponse({ referrer: document.referrer });
});
background.js
function askTabForReferrer(tabId) {
chrome.tabs.sendMessage(tabId, {}, function(response) {
console.log(response.referrer);
});
}
const exisitingTabWithLoadedContentScriptId = 83;
askTabForReferrer(exisitingTabWithLoadedContentScriptId);