【问题标题】:Chrome Extension: How to get current webpage url from background.htmlChrome 扩展程序:如何从 background.html 获取当前网页 url
【发布时间】:2011-09-21 01:20:42
【问题描述】:

据我所知,直接通过获取 tab.url 是不可能的(只能在 popup.html 中实现)并且进行消息传递还需要打开 popup.html。有没有办法绕过这个并从 background.html 获取当前页面的 url?

我最好的方法是消息传递,我在 background.html 中使用了这段代码

var bg = chrome.extension.getPopupPage(); 
var myURL = bg.myURL; 

然后在 popup.html 我有:

 chrome.tabs.getSelected(null, function(tab) {
    var myURL = tab.url;
})

无论如何,以上根本不起作用。有谁知道无需实际打开弹出窗口就能做到这一点的方法?

【问题讨论】:

    标签: javascript url google-chrome-extension


    【解决方案1】:

    后台页面支持chrome.tabs.query,当然只要您拥有tabs 权限。这是 Chrome 19 支持的路由。

    chrome.tabs.query({
      active: true,
      currentWindow: true
    }, function(tabs) {
      var tab = tabs[0];
      var url = tab.url;
    });
    

    请注意,currentWindow 是必需的,否则它会为每个 窗口返回活动选项卡。这应该保证只返回一个标签。

    当然,请记住,这是一个异步 API,除了回调函数之外,您无法访问它提供的任何数据。您可以将值(例如此处的url)存储在更高的范围内,以便另一个函数可以访问它,但这仍然只能在执行回调后提供正确的结果。


    (以下是我为后代保留的原始答案 - 此方法不再需要,需要始终运行的背景页面,并且不推荐使用 getSelected()。)

    首先把它放在 background.html 中,并使 myURL 变量成为全局变量:

    var myURL = "about:blank"; // A default url just in case below code doesn't work
    chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) { // onUpdated should fire when the selected tab is changed or a link is clicked 
        chrome.tabs.getSelected(null, function(tab) {
            myURL = tab.url;
        });
    });
    

    然后在你想获取页面url的时候在popup.html中运行这个:

    chrome.extension.getBackgroundPage().myURL;
    

    因此,如果我要让它出现在弹出窗口中,然后我去 Google 并单击您的页面或浏览器操作,我会在弹出窗口中看到 http://google.com/webhp

    【讨论】:

      【解决方案2】:

      看到这篇文章后,我觉得应该有一种方法可以将讨论标记为“已过时”。

      原因...

      这个问题需要迁移到 manifest v2 和...
      两个答案都不起作用。我正在使用 select onchange 并发布当前选项卡的 url 不起作用。

      可能这些都在清单 v1 中起作用。

      我的答案是……

      var myURL = "not set yet";
      window.addEventListener('load', function () {
          chrome.tabs.getSelected(null,function(tab){
              myURL=tab.url;
          });     
      

      【讨论】:

      • getSelected 已弃用。
      【解决方案3】:

      这是一个多一点的工作,但就像一个魅力......

      我会使用内容脚本;它相对简单并且允许您从当前页面获取您可能想要的任何信息。让后台页面将脚本“注入”到当前网页中以收集您需要的信息。然后脚本将其传回后台。

      background.js:

      // Icon is clicked and triggers content script to be injected into current webpage
      chrome.browserAction.onClicked.addListener(function(tab) {
        chrome.tabs.executeScript(null, { file: 'inject.js' });
      });
      
      // Listens for message back from content script and then runs
      chrome.runtime.onMessage.addListener(function (request) {
          var URL = request.url;
      });
      

      inject.js(内容脚本):

      // Gathers up in the information that you need from webpage
      var pageInfo = {
        "url": window.location.href
      };
      
      // Sends the information back to background.js
      chrome.runtime.sendMessage(pageInfo);
      

      希望这对某人有所帮助!

      【讨论】:

      • 不需要使用消息传递API,executeScript的回调包含内容脚本最后一个表达式的值。哎呀,根本不需要内容脚本;在清单文件中声明"tabs" 权限后,您可以使用tab.url 获取标签的URL。
      【解决方案4】:
      chrome.tabs.getSelected(null, function(tab) {
        var myURL = tab.url;
      });
      

      我没看懂,上面的代码可以在后台页面中获取当前标签的url。

      【讨论】:

      • 据我了解,上面的代码在后台页面中不起作用,因为值 null 需要是后台的 windowid 而不是弹出窗口。 source in comments of top answer
      • getSelected 已弃用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-25
      相关资源
      最近更新 更多