如何从Google Chrome扩展程序获取当前标签的URL?


Answers:


215

chrome.tabs.query()像这样使用:

chrome.tabs.query({active: true, lastFocusedWindow: true}, tabs => {
    let url = tabs[0].url;
    // use `url` here inside the callback because it's asynchronous!
});

这要求您chrome.tabs扩展清单中请求访问API :

"permissions": [ ...
   "tabs"
]

重要的是要注意,“当前选项卡”的定义可能会根据扩展程序的需求而有所不同。

lastFocusedWindow: true当您要访问用户焦点窗口(通常是最顶部的窗口)中的当前选项卡时,在查询中进行设置是合适的。

设置currentWindow: true允许您在扩展程序代码当前正在执行的窗口中获取当前选项卡。例如,如果您的扩展程序创建了一个新的窗口/弹出窗口(更改焦点),但仍想从运行扩展程序的窗口访问选项卡信息,则此方法可能很有用。

我选择lastFocusedWindow: true在此示例中使用,因为Google会指出currentWindow 可能并不总是存在的情况

您可以使用此处定义的任何属性来进一步优化选项卡查询:chrome.tabs.query


27
为什么URL总是未定义?
2014年

2
如果url未定义,请尝试从chrome:// extensions重新加载扩展程序。这将重新加载扩展程序的配置并应用新添加的“标签”权限。
flashbackzoo

2
网址未定义,因为stackoverflow.com/questions/28786723/…(答案:关闭开发工具窗口或更改为currentWindow而不是lastFocusedWindow)
kspearrin

2
当我的开发工具窗口未固定时,我不确定。停靠解决了未定义的问题。
菲苏

这不会将变量url返回给调用方。我想要一个简单的函数url = GetCurrentTabUrl(),该函数将当前选项卡的url返回给调用方。这里的变量在回调函数内部。我可以将其传递给另一个函数,但这会使代码结构变得笨拙。我也想避免使用全局变量。任何想法@thauburger?
蒂埃里·达隆

77

警告!chrome.tabs.getSelected弃用。请使用chrome.tabs.query其他答案中所示的方法。


首先,您必须在manifest.json中设置API的权限:

"permissions": [
    "tabs"
]

并存储URL:

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

1
它仅用于弹出窗口(页面操作,浏览器操作)的原因是,您在第一个参数中输入了“ null”。code.google.com/chrome/extensions/tabs.html#method-getSelected 文档指出第一个参数是windowId,如果要在选项或背景页面中使用该参数,则需要输入window ID或您将获得当前选项卡的未定义视图。
Mohamed Mansour

1
是的,它可以工作,但是不确定为什么在参考文档中找不到chrome.tabs.getSelected方法。
swimmingfisher

这东西对我不起作用,chrome.tabs.getSelected是未定义的,我应该在另一个问题中提出吗?
Mostafa Shahverdy

11
chrome.tabs.getSelected方法已被弃用,下面的答案列出了正确的方法。
罗伯W

1
而且,如何获取所有打开的选项卡的链接
2013年

48

其他答案假设您想从弹出脚本或后台脚本中了解它。

如果您想从内容脚本中了解当前URL ,则可以使用标准的JS方式:

window.location.toString()

您可以使用的属性window.location来访问URL的各个部分,例如主机,协议或路径。


1
好答案。我只想window.location.host看看Im是否在“ stackoverflow.com”。
Salyangoz

1
这实际上是我想要的。我对扩展机制非常着迷,以至于我忘了您可以使用window.location.href来获取页面的URL。
felwithe

这需要match:"<all_urls>"content_script部分的情况,并且Chrome不推荐<all_urls>。
mcan

@Tahtakafa不,不是。假定内容脚本已在运行(通过该页面的主机权限或activeTab)。
Xan

确保在contentScript.js而不是在中运行它background.js。只需将您从URL过滤的所有数据传递到消息中即可background.js。示例:let message = { type: "fetchVideoDate", id: getVideoId() };其中getVideoId()包含的执行window.location.toString()。否则,您将获得一些chrome://temp_background_file.html数据。另请注意,有时message称为request
DavidHulsman

25

问题是chrome.tabs.getSelected是异步的。下面的代码通常无法按预期工作。将'tablink'的值写入控制台时,它仍然是未定义的,因为getSelected尚未调用重置该值的回调:

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

解决方案是将代码包装在要在函数中使用值的位置,并由getSelected调用该值。这样,您可以确保始终设置一个值,因为您的代码将必须等待提供该值之后才能执行该值。

尝试类似:

chrome.tabs.getSelected(null, function(tab) {
    myFunction(tab.url);
});

function myFunction(tablink) {
  // do stuff here
  console.log(tablink);
}

感谢您的代码,这对我有用,需要将“ tabs”添加到manifest.json文件“ permissions”中的权限:[“ tabs”]
Doug Molineux


而且,如何获取所有打开的选项卡的链接
Enve 2013年

2
我试过这个,但得到的URL未定义,这是为什么?
2014年

1

您好,这里是一个Google Chrome浏览器示例,它通过电子邮件将当前网站发送给朋友。背后的基本思想是您想要的...首先,它获取页面的内容(而不是对您有兴趣)...之后,它获取URL(<-好部分)

另外,这是一个不错的工作代码示例,我比阅读文档更喜欢它。

可以在这里找到:通过 电子邮件发送此页


1

该解决方案已经过测试。

在manifest.json中设置API的权限

"permissions": [ ...
   "tabs",
    "activeTab",
    "<all_urls>"
]

首次加载调用功能。https://developer.chrome.com/extensions/tabs#event-on已激活

chrome.tabs.onActivated.addListener((activeInfo) => {  
  sendCurrentUrl()
})

更改通话功能。https://developer.chrome.com/extensions/tabs#event-onSelectionChanged

chrome.tabs.onSelectionChanged.addListener(() => {
  sendCurrentUrl()
})

获取URL的功能

function sendCurrentUrl() {
  chrome.tabs.getSelected(null, function(tab) {
    var tablink = tab.url
    console.log(tablink)
  })


-2

您必须检查一下

的HTML

<button id="saveActionId"> Save </button>

manifest.json

  "permissions": [
    "activeTab",
    "tabs"
   ]

JavaScript
下面的代码将单击按钮时将活动窗口的所有URL保存到JSON对象中。

var saveActionButton = document.getElementById('saveActionId');
saveActionButton.addEventListener('click', function() {
    myArray = [];
    chrome.tabs.query({"currentWindow": true},  //{"windowId": targetWindow.id, "index": tabPosition});
    function (array_of_Tabs) {  //Tab tab
        arrayLength = array_of_Tabs.length;
        //alert(arrayLength);
        for (var i = 0; i < arrayLength; i++) {
            myArray.push(array_of_Tabs[i].url);
        }
        obj = JSON.parse(JSON.stringify(myArray));
    });
}, false);

我的浏览器扩展程序保存URL对活动的窗口是chrome.google.com/webstore/detail/tabstore-plugin/...
Kanagavelu Sugumar
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.