在firefox中的固定选项卡上运行javascript
我想在firefox的固定选项卡中打开的页面上运行一些javascript,特别是我想修改固定选项卡中加载的网页的dom。如何使用firefox插件api实现这一点?您可以使用firefox实现这一点。任何文件都有一个“固定”属性,可以从背景页读取 例如,您可以这样做: 在后台脚本中创建isTabPinned请求桥,它将获取tab属性并将其发送到内容脚本 bg.js在firefox中的固定选项卡上运行javascript,firefox,firefox-addon,firefox-addon-sdk,add-on,Firefox,Firefox Addon,Firefox Addon Sdk,Add On,我想在firefox的固定选项卡中打开的页面上运行一些javascript,特别是我想修改固定选项卡中加载的网页的dom。如何使用firefox插件api实现这一点?您可以使用firefox实现这一点。任何文件都有一个“固定”属性,可以从背景页读取 例如,您可以这样做: 在后台脚本中创建isTabPinned请求桥,它将获取tab属性并将其发送到内容脚本 bg.js chrome.runtime.onMessage.addListener(function(msg, sender, sendRe
chrome.runtime.onMessage.addListener(function(msg, sender, sendResponse) {
if (msg.request == "isTabPinned") {
sendResponse(sender.tab.pinned);
}
});
chrome.runtime.sendMessage({ request: "isTabPinned" }, tabPinned => {
if(tabPinned){
//.. modify your DOM here
}
});
在内容脚本中,将请求发送到后台脚本桥,以获取选项卡锁定状态,并在选项卡锁定时修改DOM
cs.js
chrome.runtime.onMessage.addListener(function(msg, sender, sendResponse) {
if (msg.request == "isTabPinned") {
sendResponse(sender.tab.pinned);
}
});
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"]
}
与其让内容脚本在manifest.josn中注入
content\u scripts
条目,不如使用tabs.executeScript()
以编程方式仅将内容脚本注入固定的选项卡。您这样做的方式会给用户加载和运行内容脚本的每个页面带来负担。一个用户可能会打开数千个选项卡,并且可能会使用每个选项卡访问多个页面。在每个页面中运行代码时,可能只有少数页面被固定,这是不合理的。具体示例:我有6个固定标签,略低于1800个标签。嗯,是的,你是对的,你的方案可能比我的方案有更好的性能:)我回答的目的是展示解决问题的最简单方法。但另一方面,您的决定将需要始终查询和循环所有1800个选项卡,因为我没有发现在选项卡上触发的任何事件被锁定,但用户可以在运行时锁定/取消锁定选项卡。tabs.onUpdate()
事件在锁定/取消锁定选项卡时触发,并提供已锁定的选项卡。它还会在每个选项卡的URL更改时触发(并告诉您该选项卡是否已固定),您还需要侦听这些更改。如果您的内容脚本必须尽可能接近document\u start
,那么它会变得有点棘手和复杂。但是,对于您的方案,您的内容脚本将等待执行任何操作,直到它从后台脚本获取信息(即,如果被固定),它将从document\u start
延迟两次进程间通信。Thanx!我会在周末写PoC,如果你同意的话,我会把它附在我的答案上:)我很高兴你能在你的答案中加入这样做的方式,或者把你的答案改成使用那种方式。我确实觉得这种方法应该在这里给出答案,因为它比在每个页面上运行内容脚本使用更少的资源,潜在的资源更少。如果你不加上,我会在我应该做的事情清单上用这种方法写一个答案。那张单子有点长,所以我不确定什么时候/是否能找到它。