【发布时间】:2020-04-29 20:21:26
【问题描述】:
我想在 Firefox 的固定选项卡中打开的页面上运行一些 javascript,特别是我想修改在固定选项卡中加载的网页的 dom。如何使用 firefox addon api 做到这一点?
【问题讨论】:
标签: firefox firefox-addon firefox-addon-sdk add-on
我想在 Firefox 的固定选项卡中打开的页面上运行一些 javascript,特别是我想修改在固定选项卡中加载的网页的 dom。如何使用 firefox addon api 做到这一点?
【问题讨论】:
标签: firefox firefox-addon firefox-addon-sdk add-on
您可以使用 Firefox tabs API 做到这一点。任何Tab 都有一个可以从后台页面读取的“固定”属性。
例如,你可以这样做:
在后台脚本中创建 isTabPinned 请求桥,它将获取选项卡属性并将其发送到内容脚本。
bg.js
chrome.runtime.onMessage.addListener(function(msg, sender, sendResponse) {
if (msg.request == "isTabPinned") {
sendResponse(sender.tab.pinned);
}
});
在 content-script 中向后台脚本桥发送请求以获取选项卡固定状态并在选项卡固定时修改 DOM。
cs.js
chrome.runtime.sendMessage({ request: "isTabPinned" }, tabPinned => {
if(tabPinned){
//.. modify your DOM here
}
});
将内容脚本加载到您需要检查的页面(或示例中的任何页面)和后台脚本。为您的脚本授予“tabs”和“activeTab”权限。
manifest.json
{
"manifest_version": 2,
"name": "Pin Detector",
"version": "0.1",
"background": {
"scripts": ["bg.js"]
},
"content_scripts": [
{
"matches": ["*://*/*"],
"js": ["cs.js"]
}
],
"permissions": ["tabs","activeTab"]
}
【讨论】:
content_scripts 条目注入内容脚本,不如使用 @987654327 以编程方式仅将内容脚本注入固定选项卡中@。您执行此操作的方式使用户访问过的每个页面 都加载和运行您的内容脚本。用户可能会打开数千个选项卡,并且可能会使用每个选项卡访问多个页面。当只有少数可能被固定时,您在每个页面中运行代码是不合理的。具体示例:我有 6 个固定标签,不到 1,800 个标签。
tabs.onUpdated() 事件在选项卡被固定/取消固定时触发,并提供已固定的选项卡。它还会在每个选项卡的 URL 更改时触发(并告诉您该选项卡是否已固定),您还需要监听 .如果您的内容脚本必须尽可能接近document_start,那么它会变得有点棘手和复杂。但是,考虑到对于您的方案,您的内容脚本会等待执行任何操作,直到它从后台脚本获取信息(即,如果固定),它已经从 document_start 延迟了两个进程间通信时间。