将信息发送到上下文菜单的内容脚本

2023-12-09

我见过很多有关上下文菜单和双向通信的问题,看来我知道我的问题的答案......“你不能”,但无论如何我都会尝试。

每个页面上都有一个由 page-mod 创建的模态 div。该模式旨在当用户将鼠标悬停在文本节点中的单词上以提供单词的翻译时显示。这工作得很好,我对页面模式没有任何问题。

我现在想要做的是允许用户突出显示文本选择,右键单击以调出上下文菜单,其中我的新菜单项将是“翻译选择”,然后在模式 div 中显示选择。这就是问题开始的地方。我可以响应内容脚本中的上下文和单击事件,如果我不需要进行翻译,这很好。转换由 Web 服务完成,内容脚本无法调用 Web 服务,因为内容脚本的上下文中不存在回调,因为它位于代理沙箱中。这意味着所有 Web 服务调用都需要来自 main.js(这就是它在 page-mod 中的工作方式)。问题是 main.js 中的 context-menu 对象无法访问 DOM 来更新模态 div 的内容并显示它,并且它无法将信息发送到内容脚本以便内容脚本可以更新 DOM并显示模态 div。那么如何从上下文菜单的附加脚本中获取到 DOM 的转换呢?

我想要通过 SDK 实现的功能是否可行,或者我是否必须撤消大量的工作才能将我的项目恢复到“老派”的处理方式,以便上下文菜单能够正常工作?

这就是我所拥有的(页面模块有效,需要上下文菜单的帮助):

exports.main = function (options, callbacks) {
    'use strict';
    var myAppMenuItem,
        myAppContextMenu,
        myAppPanel,
        myAppMod,
        self = require('self'),
        contextMenu = require('context-menu');

    myAppMenuItem = require('menuitems').Menuitem();

    if (myAppMenuItem.getAttribute('checked') === 'false') {
        return;
    }

    myAppMod = require('page-mod');
    myAppMod.PageMod({
        include: '*',
        contentScriptWhen: 'ready',
        contentScriptFile: [self.data.url('jquery-1.7.2.min.js'), self.data.url('myAppmod.js')],
        contentStyleFile: self.data.url('myAppmod.css'),
        onAttach: function (worker) {
            worker.port.on(
                'translate',
                function (data) {   
                    require('request')
                        .Request({
                            url: 'http://api.microsofttranslator.com/V2/Ajax.svc/Translate',
                            content: {
                                appid : 'myappid',
                                to : data.to,
                                from : data.from,
                                text : data.text
                            },
                            onComplete: function (response) {
                                worker.port.emit('translation', { response : response.text, elementId : data.elementId });
                            }
                        })
                        .get();
                }
            );
        }
    });

    myAppContextMenu = contextMenu.Item({
        label: "Translate Selection",
        context: contextMenu.SelectionContext(),
        contentScriptFile : [self.data.url('jquery-1.7.2.min.js'), self.data.url('myAppcontextmenu.js')],
        onMessage: function (data) {
            require('request')
                .Request({
                    url: 'http://api.microsofttranslator.com/V2/Ajax.svc/Translate',
                    content: {
                        appid : 'myappid',
                        to : data.to,
                        from : data.from,
                        text : data.text
                    },
                    onComplete: function (response) {
                        <what can I do here to send the information to the content script?>
                    }
                })
                .get();
        }
    });
};

谢谢弗拉基米尔!下面的代码做了我想要的事情:

在上下文菜单的 main.js 中:

myAppContextMenu = contextMenu.Item({
    label: "Translate Selection",
    context: contextMenu.SelectionContext(),
    contentScriptFile : [self.data.url('jquery-1.7.2.min.js'), self.data.url('myAppcontextmenu.js')],
    onMessage: function (data) {
        var text = require('selection').text;
        require('request')
            .Request({
                url: 'http://api.microsofttranslator.com/V2/Ajax.svc/Translate',
                content: {
                    appid : 'myappid',
                    to : data.to,
                    from : data.from,
                    text : text
                },
                onComplete: function (response) {
                    var index,
                        tabs = require('sdk/tabs');

                    for (index = 0; index < workers.length; index += 1) {
                        if (workers[index].tab === tabs.activeTab) {
                            workers[index].port.emit('selectionTranslation', { text: text, response : response.text, leftOffset : data.leftOffset, topOffset : data.topOffset });
                        }
                    }
                }
            })
            .get();
    }
});

并在内容脚本中:

self.on(
    'click',
    function (node, data) {
        'use strict';
        var selectedElement = $(node),
            messageData =
                {
                    to : 'es',
                    from : 'en',
                    topOffset : selectedElement.offset().top + (selectedElement.height() / 2),
                    leftOffset : selectedElement.offset().left + (selectedElement.width() / 2)
                };

        self.postMessage(messageData);
    }
);

有一个全球性的workers数组变量定义在exports.main函数由以下内容填充onAttach页面mod的功能如下:

        workers.push(worker);

        worker.on(
            'detach',
            function () {
                var index = workers.indexOf(worker);
                if (index >= 0) {
                    workers.splice(index, 1);
                }
            }
        );
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将信息发送到上下文菜单的内容脚本 的相关文章

  • 获取 Firefox SDK main.js 中某个文件的内容

    所以我正在开发一个 Firefox 插件 它可以向任何网页的 DOM 添加一些 HTML 这里的想法是我使用一个名为template html作为模板 位于dataaddon 文件夹内的文件夹 接下来 我想使用该内容template htm
  • Firefox 扩展在 main.js 文件中包含脚本

    我正在为 Firefox 编写扩展 但在将脚本包含到 main js 后台 文件中时遇到问题 就我而言 我想包括 jquery js 和 config js 但我不知道如何正确执行它 在我的 chrome 扩展中 我只是在清单文件上执行此操
  • Firefox SDK:如何为特定域创建触发器

    我需要捕获带有 URL 的网站上的请求 net并采取一些操作 停止请求并从磁盘中放入 HTML 代码 但这我可以做到 我如何捕获这些请求 我尝试使用进度侦听器 但出现了问题 const STATE START Ci nsIWebProgre
  • 为所有用户安装 Firefox 扩展 [系统范围安装]

    我编写了一个 Firefox 扩展 它打包为 xpi文件 我想为所有用户安装此扩展 我发现我们可以通过将文件放入Mozilla Extensions文件夹 则该扩展将可供所有用户使用 但问题是安装扩展后 第一次启动 Firefox 时 对于
  • Firefox 扩展将 Javascript 数组作为对象发送

    我在将 JavaScript 数组传递给我正在编写的附加组件时遇到问题附加生成器 https builder addons mozilla org 为了进行通信 我使用事件并使用数组发送事件 但附加组件 内容脚本 获取一个对象 而不是数组
  • 使用 firefox addon sdk API 防止关闭选项卡

    我正在寻找一种方法来防止使用 firefox addon sdk 关闭选项卡 有办法实现吗 好的 这就是你想要的 以前的版本是为了看看我是否可以让 onbeforeunload 仅在选项卡关闭时触发 但我无法弄清楚 操作方法如下 我们重写了
  • 如何调试 Firefox 扩展,它似乎无声地崩溃

    我不知道如何调试我的简单扩展 脚本 内容脚本 加载 因为第一个 console log 调用显示在选项卡的控制台中 但随后什么也没有 没有任何错误 也没有第二次 console log 调用 我的问题不是关于解决我的代码问题 肯定有一个 如
  • Firefox 插件的“document_start”?

    我来自 Chrome 扩展 所以我习惯于通过设置来定义何时注入文件run at 例如 到document start用于在 DOM 构建之前进行注入 Firefox 插件有等效的吗 是的 相当于content document global
  • 从 Firefox 扩展设置 HTTP 标头

    如何在 Firefox 扩展中设置 HTTP 标头 我将做到这一点 以便这些仅在访问我的网站时发送 以便我可以检测插件是否已安装 如果安装了 则不会推广该插件 这是我发现的最紧凑的方法 Components classes mozilla
  • clearInterval() 不会停止 setInterval() - Firefox 扩展开发

    我正在修改篡改数据 这将允许我将其观察到的 HTTP 请求 响应发送到服务器 到目前为止 该功能已正确实现 下一步是自动化此过程 我希望使用 复选框 类型的工具栏菜单按钮来打开和关闭此功能 到目前为止 我在 XUL 中有这段代码
  • 使用“http-on-modify-request”和“http-on-examine-response”时如何将响应映射到请求?

    使用 HTTP 观察器时如何将传入响应映射到传出请求 https developer mozilla org en Setting HTTP request headers Observers https developer mozilla
  • 是否可以使用网络交付的 XUL 应用程序中的本地资源?

    有没有办法在浏览器沙箱之外执行通过 可信 网站交付的 XUL 程序 我的 XUL 程序在本地 XULRunner 和带有 add 参数的 firefox 中执行得很好 现在 我想将其放在我的安全 Intranet 上 并允许用户单击启动它的
  • 在 Firefox 插件中访问历史记录

    我正在使用插件生成器开发 Firefox 插件 我想定期扫描浏览器的历史记录 整个历史记录 我正在寻找类似的功能chrome 的历史记录 api http developer chrome com extensions history ht
  • Mozilla 扩展的内容安全策略

    我在 Mozilla 和 Chrome 中都有一个扩展 在我的扩展中我调用了一个远程 JS 文件 为了避免 Chrome 中的 CSP 我将规则添加到 manifest json 中 并且我的文件通过 HTTPS 传输 因此一切都很完美 但
  • 如何针对 URL 字符串测试 URL 匹配模式

    我可以使用匹配模式获取浏览器选项卡 browser tabs query url https mozilla org b https developer mozilla org en US docs Mozilla Add ons WebE
  • 在 Firefox 中,在选项卡重定向之前获取 URL 的方法是什么?

    我为 Firefox 开发了一个附加组件 它有一个重定向链接 https www google com vn url sa t rct j q esrc s source web cd 1 cad rja uact 8 ved 0CB0QF
  • Addon SDK方式制作对话框

    使用 SDK 制作对话框的正确方法是什么 该对话框不是锚定到附加栏等 而是显示在屏幕中央 似乎没有任何 API 可以实现这一重要功能 我确实看到了windows utils has open但我有两个问题 打开对话框似乎需要 chrome
  • 如何从 Firefox 扩展中的地址栏获取文本

    我正在构建一个火狐扩展 我在用XUL and JavaScript去做这个 我需要从 Firefox 浏览器的地址栏中获取文本 请不要与浏览器导航的 URL 混淆 它只是用户在页面重定向之前输入的文本 假设用户位于http www myex
  • 更改 Firefox 插件安装图标

    我正在开发一个 Firefox 插件 使用附加 SDK https addons mozilla org en US developers docs sdk 1 0 dev guide welcome html 我更改了 package j
  • 使用 Firefox 插件 sdk 的 nsISocketTransportService

    我正在尝试使用 Firefox 来读取 SSH 横幅 IE 当您最初连接到 SSH 服务器时 服务器会向您发送其横幅 标识服务器软件 并且您向 SSH 服务器发送您的横幅 标识您的客户端软件 为此 我使用以下 URL 中的示例 firefo

随机推荐

  • 找到发射弹丸的角度以到达特定点

    所以 Dani 在他的稍微新的视频中 gt 制作游戏 但我只有 3 天 https youtu be S7Dl6ATRK2M 制造了一个拥有弓箭的敌人 5 39 我试图重新创建它 但没有运气 我也找不到他使用的网站 今天我发现了这个http
  • HTTP错误404:找不到请求资源

    我有三个运行在 IIS7 上的系统 静态 IP 地址为 192 168 66 5 我已将系统配置为在具有不同端口和子域名的同一 IP 地址上运行 192 168 66 5 81 主机名 ams tpf go tz 192 168 66 5
  • 使用 CSS 网格更改 div 高度

    我是一名试图理解 css 网格的学生 如何更改特定 div 列或行的大小而不更改全部并将图片等元素插入网格中 我在这里尝试过 https codepen io lukeheald pen bYQNgj 如果我针对特定的 div 我想调整它
  • HelloWorldComponent 和 System.Func`2[System.Collections.Generic.IDictionary`2 // 参数名称:signature 之间无法进行转换

    我正在学习 Scott Allen 在 Pluralsight 上的 MVC 5 基础课程 我在下面的代码中的 using WebApp Start uri 处收到错误 错误是 An unhandled exception of type
  • 需要用VBA填充的数据结构

    我需要将一些数据从二维数组加载到类型数组结构中 我的类型结构如下所示 Public Type LocationType LocationID As String Description As String ZoneID As String
  • 通过 javascript/jquery 删除/截断前导零

    建议通过 javascript jquery 从数字 任何字符串 中删除或截断前导零的解决方案 您可以使用匹配字符串开头的零的正则表达式 s s replace 0
  • data-component-bound="true" 这是什么意思?

    data component bound true 是什么意思 我在折叠元素中发现了这一点 但调整该值没有任何作用 我尝试在 Stack Overflow 和 Google 上寻找 data component bound 属性 但它指向一
  • 带有“strict: true”的 Vuex 商店不起作用

    当我设置strict true我收到错误 vue js 525 Vue warn Error in watcher state found in root instance warn vue js 525 run vue js 1752 u
  • event.preventDefault() 在 IE 11 中不适用于自定义事件

    我有一个同步触发自定义事件的聚合物元素 我想知道该事件是否已使用 event preventDefault 取消 使用 event defaultPrevented 我可以知道预期的操作 这适用于所有浏览器 Chrome Canary Fi
  • Python - Windows SystemParametersInfoW 与 SystemParametersInfoA 函数之间的区别

    尽管我对 Stack Overflow 及其他领域进行了研究 但我有一个似乎无法澄清的问题 我的问题涉及 Windows SystemParametersInfo 函数及其与 Python 3 x 脚本相关的变体 SystemParamet
  • 如何解决React Hook关闭问题?

    import React useState from react import ReactDOM from react dom function App const count setCount useState 0 function ha
  • 如果在条件中,“set -e”不会导致代码块退出

    我试图找出错误保释行为的原因 e如果失败的块位于条件链中 则不会启动 bin bash set e echo First ls blat echo this should not print 打印出 First ls cannot acce
  • Android Play 控制台:内部测试版本,密切测试?它是如何运作的?

    我已经在 Play 商店上有一个生产应用程序 现在我已经在内部测试轨道上上传了下一个发行版本 我已经与团队测试人员创建了一个邮件列表 但现在我团队的所有测试人员都看到了测试版本 并且他们无法在生产版本和测试版本之间进行选择 有没有办法在两个
  • 使用 Java 注解 - 生成代码

    我正在使用 java 6 注释处理 api 我遵循以下优秀教程来创建在构建时显示消息的注释处理器 http kerebus com 2011 02 using java 6 processors in eclipse 然而 就我而言 我有一
  • 超时 WCF 服务

    WCF 中的超时是如何工作的 例如我知道你可以配置发送超时 and 接收超时用于客户端绑定 但它们是如何工作的呢 MSDN 描述发送超时 as TimeSpan 值 指定为某个事件提供的时间间隔 发送操作完成 该值应该大于或等于 到零 默认
  • 后台服务启动两次

    我有以下后台服务 public class MyHostedService BackgroundService private readonly ITaskQueue taskQueue private readonly ILifetime
  • AES 加密和解密

    我用 swift 编写了一个应用程序 我需要 AES 加密和解密功能 我从另一个 Net 解决方案收到了加密数据 但我找不到可以执行此操作的方法 这是我的 net 加密 public static byte AES Encrypt byte
  • 使用 Eclipse 的 java 定时器

    我正在尝试使用 Eclipse 用 Ja va 编写一个小程序 但我有点迷失了 有人可以向我解释一下 以 傻瓜式的方式 我需要做什么才能使用计时器重新绘制表单吗 我正在尝试做一些像时钟一样简单的事情 我需要一个计时器每秒重新绘制它 像这样的
  • 有人可以帮我清理这个吗? (初学者,SQL)[重复]

    这个问题在这里已经有答案了 我正在 hackerrank com 上做练习 SQL 初学者练习 我相信你们很多人都熟悉它 这是问题 从 STATION 查询不以元音开头且不以元音结尾的 CITY 名称列表 您的结果不能包含重复项 我的回答如
  • 将信息发送到上下文菜单的内容脚本

    我见过很多有关上下文菜单和双向通信的问题 看来我知道我的问题的答案 你不能 但无论如何我都会尝试 每个页面上都有一个由 page mod 创建的模态 div 该模式旨在当用户将鼠标悬停在文本节点中的单词上以提供单词的翻译时显示 这工作得很好