如果从后台发送响应,则执行内容脚本中的函数

2024-05-25

对于我的 Chrome 扩展,我尝试将选定的文本发布到 PHP 网页。本网站已解决的问题(Chrome 扩展:如何捕获选定的文本并将其发送到网络服务 https://stackoverflow.com/questions/2626859/chrome-extension-how-to-capture-selected-text-and-send-to-a-web-service)在实现这一目标方面帮助了我很多,但我想要一种不同的方式来发布文本。
我想从内容脚本发送隐藏的 JS 表单,而不是那里提到的 XMLHttpRequest。此方法允许我在将文本导入数据库之前查看或更改文本。

问题是如何将触发器从后台获取到内容脚本。我已经通过其他方式收到了一条消息,因此需要使用该函数(响应)。但是,在“sendMessage”之外,我无法监听response.cmd。在“sendMessage”内部,我无法获取response.cmd来触发函数。除了从后台脚本发送全新消息之外,还有其他解决方案吗? 我所指的代码:

背景.js

chrome.extension.onMessage.addListener(function(request, sender, sendResponse) {
  if(request.cmd == "createSelectionMenu") {
    sendResponse({cmd: "saveText"}); //Do things
  }
});

内容脚本.js

chrome.extension.sendMessage({ cmd: "createSelectionMenu", data: selectedText },
  function(response) {
    if(response.cmd == "saveText") { 
      createForm();
    }
  }
});

我所做的如下:

我跟踪我打开的标签页

内容脚本:

// connect to the background script
var port = chrome.extension.connect();

后台脚本

// a tab requests connection to the background script
chrome.extension.onConnect.addListener(function(port) {
  var tabId = port.sender.tab.id;
  console.log('Received request from content script', port);

  // add tab when opened
  if (channelTabs.indexOf(tabId) == -1) {
    channelTabs.push(tabId);
  }

  // remove when closed/directed to another url
  port.onDisconnect.addListener(function() {
    channelTabs.splice(channelTabs.indexOf(tabId), 1);
  });
});

现在,当某个操作发生时,我可以从后台脚本通知所有已注册的选项卡(即内容脚本):

var notification = { foo: 'bar' };
for(var i = 0, len = channelTabs.length; i < len; i++) {
  chrome.tabs.sendMessage(channelTabs[i], notification, function(responseMessage) {
    // message coming back from content script
    console.log(responseMessage);
  });
}

同样,在内容脚本的另一侧,您可以添加这些消息的侦听器:

chrome.extension.onMessage.addListener(function(request, sender, sendResponse) {
  if (request.foo == 'bar') {
    executeStuff();
    // if a callback is given:
    sendResponse && sendResponse('success');
  }
});

这有点傻,因为它在某些地方是多余的。但我最喜欢这种方式,因为你可以把它包裹起来,让它变得更容易一些。

如果您想了解我如何使用它,请参阅我在 GitHub 上的存储库:chrome 扩展通讯器 https://github.com/dan-lee/chrome-extension-communicator.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如果从后台发送响应,则执行内容脚本中的函数 的相关文章

随机推荐

  • 如何从 glimmer 组件中获取父上下文?

    假设我在 glimmer 中有一个简单的组件 其中包含一个项目列表
  • “重载”在子类中如何工作?

    我有一个基类和一个子类 它们都有相同的属性 但我不明白whyVB 希望我对子类中的属性使用 重载 区别在于该属性的子类版本是Shared而父类基本上是为了结构 这些属性如下所示 Public MustInherit Class Parent
  • JQuery 命名空间 + 通用实用函数的最佳实践

    目前有哪些 经验法则 为了实施JQuery 命名空间托管通用实用函数 我有许多 JavaScript 实用方法分散在各个文件中 我想将它们合并到一个 或多个 命名空间中 最好的方法是什么 我目前正在研究两种不同的语法 按优先顺序列出 JQu
  • 更改弹出菜单项的文本大小

    我想更改弹出菜单项的文本大小 我编写了这段代码来创建一个弹出菜单 但我的问题是我无法访问弹出菜单 ieXIT 的 textView 以便我可以使用 exitItem setTextSize 40 my code popupmenu new
  • 无法使用 Java ProcessBuilder 启动带参数的 shell 脚本

    我正在尝试使用 ProcessBuilder 执行带有命令行参数的 shell 脚本 该 shell 脚本又调用使用此参数的其他两个 shell 脚本 第一个 shell 脚本运行良好 但当第二个 shell 脚本启动时 它返回退出代码 1
  • 无法在树莓派4上的python中导入cloud firestore

    我尝试在 python 中的树莓派上安装 firebase 但出现了找不到 firestore 模型的错误 但我已经安装了它 问题是安装可以在我的笔记本电脑上运行 但当我尝试在树莓派 4 上安装时 它一直出现错误 File 6 webcam
  • 如何防止 apache http 客户端遵循重定向

    我正在使用 apache http 客户端连接到远程服务器 远程服务器发送重定向 我希望实现我的客户端不会自动遵循重定向 以便我可以提取正确的标头并对目标执行任何我想要的操作 我正在寻找一个简单的工作代码示例 复制粘贴 停止自动重定向以下行
  • 如何在 GA4 的 iframe 中跟踪来自第三方网站的流量?

    在通用分析中 我learned https stackoverflow com questions 62569419 how to set secure attribute of the cookies used by google ana
  • 怎么修? WordPress wp-markdown 插件损坏了语法荧光笔进化插件帖子?

    过去几个月我一直在 WordPress 上记录一些 C 代码 或者可以是任何代码 其中语法荧光笔进化 https wordpress org plugins syntaxhighlighter installation 插入 一切都很顺利
  • 如何在 nibabel 中将 3D numpy 数组转换为 nifti 图像?

    从这个问题如何将 Nifti 文件转换为 Numpy 数组 https stackoverflow com q 44422248 9235408 我创建了 nifti 图像的 3D numpy 数组 我对此数组进行了一些修改 例如通过添加零
  • 如何从 Vim 中发送转义序列?

    因此 最近苹果公司支持在终端的状态栏中显示工作目录和文件 必须发送的转义序列 以设置当前文件 是这样的 ESC 6 Pt BEL where Pt is a file url 指向当前正在编辑的文件 所以我想我可以让 Vim 发送这个命令作
  • Java:如何根据条件从数组中删除对象?

    我有一个对象数组 确切地说是文件列表 如何迭代这个数组并删除一些对象 在Java中 根据条件 File files file listFiles for File f files if someCondition remove 我认为解决问
  • 如何禁用出现在 UITabBarController 的“更多”部分中的编辑按钮?

    在我的应用程序中 基于选项卡栏应用程序 XCode 模板 我使用 UITabBarController 来显示用户可以访问的应用程序不同部分的列表 默认情况下 当项目超过 5 个时 UITabBarController 会在选项卡栏中显示
  • jQuery 选择首屏上方的图像

    我目前正在使用 jQuery 延迟加载插件来加载图像 我正在使用 javascript 来替换 src 和 data original 属性 这会导致负载上出现轻微闪烁 我想知道是否有一种方法可以使用 jquery 仅选择折叠下方或折叠上方
  • 为什么 App Store Connect 中的崩溃报告有时不提供崩溃文件?

    我们的应用程序从 TestFlight 用户那里获取崩溃报告 并将这些报告发送到Crash FeedbackApp Store Connect 页面 通常 当您下载崩溃反馈时 我们会提供feedback json文件 其中包含一些元数据和c
  • LINQ-To-SQL 如何防止 SQL 注入?

    我目前正在使用 C 和 LINQ TO SQL 做一个项目 这个项目将安全性作为高优先级 所以显然我想防止 SQL 注入 我用谷歌搜索了此事 但 没有发现任何有用的信息 微软自己的常见问题解答告诉我 由于 LINQ 处理参数的方式 注入不会
  • django-rest-swagger 与模型序列化器不能很好地配合吗?

    我已经离开了 django rest swagger 的文档github页面 https github com marcgibbons django rest swagger 更具体地说 是 它是如何工作的 部分 它表明您可以为其余 api
  • 如何为 3D 网格线着色

    我正在寻找一种方法来更改 3D 绘图网格线的颜色 但无法找到一种干净且简单的方法来实现此目的 我找到的唯一答案是here https stackoverflow com questions 31684448 how to color a s
  • scss bootstrap 4 覆盖地图

    我正在尝试使用 Bootstrap 4 进行 scss 但我不知道如何正确地覆盖变量 使用映射 自定义 scss Your variable overrides primary rgb 40 167 36 spacer 1 spacers
  • 如果从后台发送响应,则执行内容脚本中的函数

    对于我的 Chrome 扩展 我尝试将选定的文本发布到 PHP 网页 本网站已解决的问题 Chrome 扩展 如何捕获选定的文本并将其发送到网络服务 https stackoverflow com questions 2626859 chr