javascript - Chrome 扩展通过 chrome.runtime.onMessage 传递当前选项卡 url
问题描述
我正在尝试为 chrome 构建网络注释阅读器扩展。我的问题是我无法在后台脚本中获取活动标签 URL(顺便说一句,我不知道这是否是正确的术语)。让我给你看一下代码。这是来自“highlight.js”文件
chrome.runtime.onMessage.addListener(msgObj => {
if (msgObj.action == "getData") {
var annotations = msgObj.annotations;
// Messaging 2
chrome.runtime.sendMessage({ action: "getURL" }, (response) => {
alert(response.data)
});
// I want to have current tab url here...
}
// ...
});
而我的“eventPage.js”是
chrome.runtime.onMessage.addListener(function (request, sender, sendResponse) {
// Messaging 1
// ...
// Messaging 2
if (request.action === "getURL") {
chrome.tabs.query({ 'active': true, 'lastFocusedWindow': true }, function (tabs) {
// I want url_ to be transferred to highlight.js but no luck so far...
const url_ = tabs[0].url;
sendResponse({ data: url_ });
return true;
});
}
});
我的清单文件是:
{
"manifest_version":2,
"name":"Annotation Reader",
"version": "1.0",
"description":"An annotation reader extension!",
"icons": {
"128": "icon128.png",
"48": "icon48.png",
"16":"icon16.png"
},
"browser_action": {
"default_icon": "icon128.png",
"default_popup": "popup.html"
},
"background": {
"scripts": [
"jquery-3.4.1.min.js",
"eventPage.js"
],
"persistent":false
},
"permissions": [
"tabs",
//...
],
"content_scripts": [
{
"matches":
[
// ...
],
"js": [
"jquery-3.4.1.min.js",
"jquery.highlight.js",
"highlight.js"
],
"css": ["highlight.css"]
}
]
}
先感谢您!
解决方案
不需要消息,只需
location.href
在内容脚本中使用。每个匹配的选项卡/框架都运行自己的内容脚本实例,因此诸如 DOMdocument
或window
或location
属于选项卡/框架的内容。虽然这里不需要,但是当
sendResponse
异步使用时(扩展 API 中的回调chrome
总是异步调用),消息端口需要通过从 onMessage 侦听器返回来保持打开状态true
,而不是从嵌套回调中返回。if (something) { asyncCall(params, result => { sendResponse(result); }); return true; }
内容脚本在所有匹配的选项卡/框架中运行,而不仅仅是活动选项卡,因此消息可以来自非活动选项卡。这意味着 chrome.tabs.query 是错误的方法。正确的解决方案是,
sender.url
如果需要 URL,则直接使用。使用文档来了解参数,这样您就不必重新发明轮子。
推荐阅读
- c++ - opencv c ++中的copyTo如何工作?
- python - 使用 Pymongo Upsert 在 MongoDB 中使用 Python 更新或创建文档
- java - 将属性从一种方法传回另一种方法时如何处理异常
- java - 当玩家不在门附近时,如何制作关闭门的功能?
- python - 关于如何提高准确性的建议
- python - 正则表达式替换除多次出现的组之外的任何内容
- javascript - 由于某种原因,EXTJS 中的所有事件都不起作用
- javascript - Ant Design 在表单循环数组中选择?
- css - 如何覆盖 Angular8 .pug 文件中的样式?
- recursion - Automapper Parent Child Mapping 将 Grandchildren Properties 设置为 null