如何获取标签的先前网址?

时间:2014-08-10 14:09:59

标签: javascript google-chrome-extension

在撰写Chrome扩展程序时,如果有一个标签,如何在该标签中获取以前访问过的网页的网址?即在我点击"返回"后会出现在全方位的网址?

3 个答案:

答案 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

  1. chrome.storage.local的行为与Window.localStorage类似,即使在浏览器关闭并重新打开时仍然存在。如果您不自行清理,您的本地存储将随着大量冗余信息而超时。使用会话存储,每当您关闭所有浏览器实例(持久性后台页面的生命周期结束)时。它会方便地忘记一切:)
  2. Window.sessionStorage仅将数据存储在字符串中,这对此用例很有用( tab.url ),chrome.storage.local功能更强大当您想要存储对象时,可以节省一些空间。
  3. 我的测试用例是这样的:

    chrome.tabs.onUpdated.addListener(function(tabId,changeInfo,tab){
        var newUrl = changeInfo.url;
        if(newUrl){
            window.sessionStorage[tabId] = newUrl;
        }
    });
    

答案 2 :(得分:1)

另一种方法使用页面的 referrer。这要求:

  • 必须有某种方法来检索页面引用,或者通过将内容脚本加载到将引用与扩展通信的页面中,或者通过在后台脚本中以某种方式检查 Web 导航或请求
  • 引用当前页面的页面必须具有提供足够信息的 referrer policy

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);