我有谷歌Chrome扩展的乐趣,我只是想知道我如何在变量中存储当前选项卡的URL ?


当前回答

这个解决方案已经测试过了。

在manifest.json中设置API的权限

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

对第一个加载调用函数。https://developer.chrome.com/extensions/tabs#event-onActivated

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

其他回答

像这样使用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。标签API在你的扩展清单:

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

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

在查询中设置lastFocusedWindow: true是合适的,当你想要访问用户聚焦窗口中的当前选项卡(通常是最上面的窗口)。

设置currentWindow: true允许你在你的扩展代码正在执行的窗口中获得当前选项卡。例如,如果您的扩展创建了一个新的窗口/弹出窗口(改变焦点),但仍然想从运行扩展的窗口访问选项卡信息,这可能是有用的。

在本例中,我选择使用lastFocusedWindow: true,因为谷歌调用了currentWindow可能不总是存在的情况。

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

这个解决方案已经测试过了。

在manifest.json中设置API的权限

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

对第一个加载调用函数。https://developer.chrome.com/extensions/tabs#event-onActivated

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

对于那些使用上下文菜单api的人来说,文档并没有立即明确如何获取选项卡信息。

  chrome.contextMenus.onClicked.addListener(function(info, tab) {
    console.log(info);
    return console.log(tab);
  });

https://developer.chrome.com/extensions/contextMenus

这是一个非常简单的方法

window.location.toString();  

你可能不得不这样做的内容脚本,因为它有所有的功能,在一个网页上的js文件可以有和更多。

问题是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);
}