【问题标题】:Get the URL for the current tab获取当前选项卡的 URL
【发布时间】:2017-03-11 20:13:45
【问题描述】:

对于一个测试用例,我想尝试输出当前选项卡的 URL。 我的 manifest.json

{
"manifest_version": 2,
"name": "Chrome Extension",
"description": "MyExtension",
"icons": {
    "16": "img/favicon.png",
    "48": "img/48.png"
},
"version": "0.1",
"background": {
    "scripts": ["js/content.js"],
    "persistent": false
},
"permissions": [
    "tabs", "https://*/*", "http://*/*"
],
"browser_action": {
    "default_icon": "img/default_icon.png",
    "default_title": "Get URL"
},
"content_scripts": [{
    "matches": ["<all_urls>"],
    "all_frames": true,
    "css": ["css/style.css"]
}],
    "short_name": "GetURL"
}

以及我的 content.js

中的代码
document.addEventListener('DOMContentLoaded', () => { 
  chrome.tabs.query({ active: true, currentWindow: true }, (tabs) => {
    alert(tabs[0].url)
  });
});

问题在于,该 URL 仅显示在第一个当前选项卡上,而不显示在另一个激活的选项卡上。我尝试将 currentWindow 更改为 lastFocusedWindow 并更改为 windowId 但它并没有解决问题。告诉我我做错了什么?

【问题讨论】:

  • 当我从一个标签移动到另一个标签时
  • 后台页面是一个单独的页面,在扩展内部有自己的DOM(与网页没有任何关系),见architecture overview,所以1)不需要DOMContentLoaded,它什么也不做2) 使用 chrome.tabs.onActivated,也 3) 不要使用具有误导性的名称 content.js 作为背景/事件脚本。
  • 事实证明,对于这个任务,我真的不需要后台脚本。对吧?
  • 嗯,到目前为止的代码可以有效地替换为 内容脚本 中的alert(location.href),但总体而言,这取决于您接下来要对 url 做什么。
  • 其实不用脚本也可以高亮链接。只需使用您注入的 CSS。此外,对于不同的 URL 模式,您可以有许多内容脚本声明(content_scripts 是一个数组)。

标签: javascript google-chrome google-chrome-extension


【解决方案1】:

请务必阅读extension architecture overview。您不需要背景/事件页面,它是扩展程序内完全独立的页面,具有自己的 DOM(文档和窗口),与网页没有任何关系。

您需要一个在网页旁边运行并且可以直接访问其 DOM 的 content script

manifest.json:

"content_scripts": [{
    "matches": ["<all_urls>"],
    "all_frames": true,
    "js": ["js/content.js"],
    "css": ["css/style.css"]
}],

content.js:

console.log(location.href);

在这里您可以编写普通的 JavaScript DOM 代码并访问网页。

不需要 DOMContentLoaded 包装器,因为内容脚本默认在document_idle 注入,这发生在 document_end 事件之后。如果您需要准确地在 document_end 处运行代码,而不是稍后,您可以在 manifest.json 中明确指定它:

"content_scripts": [{
    "matches": ["<all_urls>"],
    "all_frames": true,
    "run_at": "document_end",
    "js": ["js/content.js"],
    "css": ["css/style.css"]
}],

附: alert 是一种适得其反的信息显示方式,因为它会阻塞浏览器 UI。

【讨论】:

  • 我调整了 manifest.json,移除了背景,但是 console.log(location.href) 不起作用
  • 假设您已经检查了 devtools 控制台面板,这只能意味着内容脚本没有被注入。您需要重新加载页面。这是一个已知问题,有一个forcefully injects the content script into all pages 的解决方案,如果您希望扩展程序在安装/更新后立即生效,这可能很有用。
  • 如果 chrome.tabs.query 不起作用,我如何为所有选项卡注入脚本?
  • 我尝试将我的 content.js 注入所有选项卡。但是,当我尝试使用以下方法获取所有选项卡时:chrome.tabs.query 我收到错误“无法读取未定义的属性“查询””
  • 我需要获取所有标签。如果 content_script 不能用 ChromeAPI 怎么办?
猜你喜欢
  • 1970-01-01
  • 2013-04-24
  • 1970-01-01
  • 2023-03-22
  • 2013-03-08
  • 1970-01-01
  • 1970-01-01
  • 2014-09-12
  • 2011-05-14
相关资源
最近更新 更多