Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在firefox中的固定选项卡上运行javascript_Firefox_Firefox Addon_Firefox Addon Sdk_Add On - Fatal编程技术网

在firefox中的固定选项卡上运行javascript

在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

我想在firefox的固定选项卡中打开的页面上运行一些javascript,特别是我想修改固定选项卡中加载的网页的dom。如何使用firefox插件api实现这一点?

您可以使用firefox实现这一点。任何文件都有一个“固定”属性,可以从背景页读取

例如,您可以这样做:

在后台脚本中创建isTabPinned请求桥,它将获取tab属性并将其发送到内容脚本

bg.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
    }
});
在内容脚本中,将请求发送到后台脚本桥,以获取选项卡锁定状态,并在选项卡锁定时修改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,如果你同意的话,我会把它附在我的答案上:)我很高兴你能在你的答案中加入这样做的方式,或者把你的答案改成使用那种方式。我确实觉得这种方法应该在这里给出答案,因为它比在每个页面上运行内容脚本使用更少的资源,潜在的资源更少。如果你不加上,我会在我应该做的事情清单上用这种方法写一个答案。那张单子有点长,所以我不确定什么时候/是否能找到它。