Chrome 扩展:如何检测内容脚本已加载到选项卡中?

2023-11-25

我的后台脚本中有以下代码:

chrome.tabs.onUpdated.addListener(function(tabId, changeinfo, tab) {
    if (changeinfo.status !== 'complete')
        return;

    if (!matchesUrlFilters(tab.url))
        return;

    chrome.tabs.executeScript(tabId, { file: "jquery-1.7.1.min.js" }, function() {
        chrome.tabs.executeScript(tabId, { file: "enhance.js" });
    });
});

然而,在某些情况下,这似乎会两次注入我的内容脚本(当enhance.js does window.history.pushState).

如何查明该选项卡是否已有我的内容脚本?我试过chrome.tabs.sendRequest但如果尚未添加内容脚本,它永远不会调用回调。


编辑:根据对此答案的第一条评论进行更新。

你可以尝试这样的事情。添加一个 onRequest 侦听器,该侦听器将用作回调来加载所需的脚本,但它们只会根据作为请求消息的一部分发送的值进行加载。然后使用executeScript直接调用“code”,发送带有全局变量值(如果存在)的消息。

chrome.tabs.onUpdated.addListener(function(tabId, changeinfo, tab) {
    ...

    // execute a content script that immediately sends back a message 
    // that checks for the value of a global variable which is set when
    // the library has been loaded
    chrome.tabs.executeScript(tabId, {
        code: "chrome.extension.sendRequest({ loaded: EnhanceLibIsLoaded || false });"
    });

    ...
});

// listen for requests
chrome.extension.onRequest.addListener(function(req, sender, sendResponse) {
    if (req.loaded === false) {
        chrome.tabs.executeScript(tabId, { file: "jquery-1.7.1.min.js" }, function() {
            chrome.tabs.executeScript(tabId, { file: "enhance.js" }, function() {
                // set the global variable that the scripts have been loaded
                // this could also be set as part of the enhance.js lib
                chrome.tabs.executeScript(tabId, { code: "var EnhanceLibIsLoaded = true;" });
            });
        });
     }
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Chrome 扩展:如何检测内容脚本已加载到选项卡中? 的相关文章

  • JavaScript onTouch 不工作

    谁能告诉我为什么这个 onTouch 处理程序没有触发 var myDiv document getElementById existingContent var myButton a href log out a myDiv append
  • 主干视图 DOM 元素已删除

    我一直在阅读有关 Backbone js 僵尸 或内存泄漏 问题的信息 基本上 当您不再需要该元素时 您必须从 DOM 中解除绑定并删除该元素 以确保所有事件也被删除 现在 我有一个包含几个容器的单页应用程序 div div div div
  • 关闭选项卡时要求确认[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 当我在某些浏览器上关闭页面时 我希望出现一个消息框 并询问我是否真的要关闭页面 有两个按钮 如果我单击No那么这个标签就不会被关闭 我怎样
  • 尝试将布尔 C# 变量传递给 javascript 变量并将其设置为 true

    在我的 aspx 页面中 我将布尔变量 C 传递给需要布尔类型的 javascript 函数 但遇到了问题 但是 C 变量返回 True 而 javascript 不喜欢大写 myjavascript 如果我将 c 变量转换为字符串 那么我
  • Dart chrome 扩展:如何在 onMessage 中发送响应?

    现在我正在使用 Google 的 Dart 开发 Chrome 扩展 除了 onMessage 处理之外 一切正常 使用的 Chrome 包 API Ref http dart gde github io chrome dart ext O
  • jquery.find() 可以只选择直接子项吗?

    我应该向 jQuery find 提供什么参数来选择元素子元素而不选择其他元素 我不能用 gt 引导选择器 而用 将选择所有后代 而不仅仅是直接子代 我知道 jQuery children 但这是一个库 因此用户能够提供自己的选择器 并且我
  • 如何重置使用 JavaScript 更改的 CSS 属性?

    我的导航按钮的宽度从 100px 增加到 150px 当鼠标悬停在 nav li hover width 150px 但是使用 javascript 我已经做到了 无论选择哪个选项 宽度都将继续为 150px 当选择每个选项时 它会使其他选
  • 使用 JavaScript 使链接保持活动状态并在单击时显示悬停效果

    I am struggling to make this work I d like to make it where if O F is clicked the hover state stays active if another li
  • 如何抑制窗口鼠标滚轮滚动...?

    我正在开发嵌入页面中的画布应用程序 我有它 因此您可以使用鼠标滚轮放大绘图 但不幸的是 这会滚动页面 因为它是文章的一部分 当我在 dom 元素上滚动鼠标滚轮时 是否可以阻止鼠标滚轮在窗口上滚动 附加鼠标滚轮 不是 Gecko DOMMou
  • 跟踪用户何时点击浏览器上的后退按钮

    是否可以检测用户何时单击浏览器的后退按钮 我有一个 Ajax 应用程序 如果我可以检测到用户何时单击后退按钮 我可以显示适当的数据 任何使用 PHP JavaScript 的解决方案都是优选的 任何语言的解决方案都可以 只需要我可以翻译成
  • 在javascript中解析json - 长数字被四舍五入

    我需要解析一个包含长数字的 json 在 java servlet 中生成 问题是长数字被四舍五入 当执行这段代码时 var s x 6855337641038665531 var obj JSON parse s alert obj x
  • 表单计算器脚本基本价格未加载 OnLoad

    我的表单中有一个计算器来计算我的下拉选项选择 function select calculate on change calc input type checkbox calculate on click calc function cal
  • Firefox 书签探索未超过 Javascript 的第一级

    我已经编写了一些代码来探索我的 Firefox 书签 但我只获得了第一级书签 即我没有获得文件夹中的链接 e g 搜索引擎 雅虎网站 谷歌网站 在此示例中 我只能访问 Search engines 和 google com 不能访问 yah
  • Angular 2+ 安全性;保护服务器上的延迟加载模块

    我有一个 Angular 2 应用程序 用户可以在其中输入个人数据 该数据在应用程序的另一部分进行分析 该部分仅适用于具有特定权限的人员 问题是我们不想让未经授权的人知道how我们正在分析这些数据 因此 如果他们能够在应用程序中查看模板 那
  • 模块构建失败(来自 ./node_modules/babel-loader/lib/index.js)Vue Js

    我从 GitHub 下载了一个我和我的朋友正在开发的项目 但是当我尝试运行时 npm run serve 我收到这个错误 src main js 中的错误 Module build failed from node modules babe
  • 在 vue.js 中访问数组对象属性

    给定以下数组vue js packageMaps Object packageMap 0 Object Id 16 PackageType flag list ProductCode F BannerBase packageMap 1 Ob
  • Javascript 纪元时间(以天为单位)

    我需要以天为单位的纪元时间 迄今为止 我已经看到过有关如何翻译它的帖子 但几天后就没有了 我对纪元时间很不好 我怎么能得到这个 我需要以天为单位的纪元时间 我将解释为您想要自纪元以来的天数 纪元本身是第 0 天 或第 1 天的开始 无论您如
  • JQuery 图像上传不适用于未来的活动

    我希望我的用户可以通过帖子上传图像 因此 每个回复表单都有一个上传表单 用户可以通过单击上传按钮上传图像 然后单击提交来提交帖子 现在我的上传表单可以上传第一个回复的图像 但第二个回复的上传不起作用 我的提交过程 Ajax 在 php 提交
  • 如何仅在最后一个
  • 处给出透明六边形角度?
  • 我必须制作这样的菜单 替代文本 http shup com Shup 330421 1104422739 My Desktop png http shup com Shup 330421 1104422739 My Desktop png
  • 导致回发到与弹出窗口不同的页面

    我有一个主页和一个详细信息页面 详细信息页面是从主页调用的 JavaScript 弹出窗口 当单击详细信息页面上的 保存 按钮时 我希望主页 刷新 是否有一种方法可以调用主页的回发 同时还可以从详细信息页面维护保存回发 Edit 使用win

随机推荐

  • 更新代码生成 6.0.9 后无法加载项目 X 的​​信息

    我正在开发一个 NET Core 项目 昨天 Web CodeGeneration已自动更新 更新后 当我尝试向项目添加新视图时出现错误 脚手架失败 无法加载项目 X 的 信息 我尝试再次删除并重新安装所有 nuget 软件包 我检查了软件
  • wcf 尝试设置跟踪以进行调试,而不是写入日志文件

    这是我的 web config 在 IIS7 上的应用程序中运行 WCF 服务 但没有任何内容写入指定文件 已向所有人授予对该文件的权限
  • 使用GCC编译C代码

    我在我的电脑上安装了 MinGWWindows8 笔记本电脑并尝试编译 C 代码文件 gcc test c o test exe 编译器没有给出警告或错误 但没有创建 test exe 我如何让编译器创建文件 test c My termi
  • 如何在 Django 1.4 中存储简单的日期时间

    我有一个格式为 2012 05 19 19 13 00 的简单日期和时间 需要使用 Django 1 4 及其时区感知功能来存储它 尽管无法知道日期最初位于哪个时区 但将其存储为 UTC 似乎是有意义的 但是 使用 pytz 等 我不确定如
  • 将整数格式化为十六进制字符串

    我需要从随机整数 0 255 列表中创建一串十六进制数字 每个十六进制数字应由两个字符表示 5 05 16 10 等 Example Input 0 1 2 3 127 200 255 Output 000102037fc8ff 我设法想出
  • 模拟按键 X 秒

    这是我用来在某个进程中模拟 Tab 键按下的代码 DllImport user32 dll static extern bool PostMessage IntPtr hWnd UInt32 Msg int wParam int lPara
  • 如何确定生成的进程何时准备就绪? (使用 CreateProcess() 和 FindWindow())

    这应该很简单 我正在创建一个程序 该程序使用 win32 生成一个进程CreateProcess 功能 加载此进程后 我使用以下命令找到它的窗口FindWindow并使用它发送消息SendMessage 问题是 我如何知道该窗口何时准备好接
  • VSCode 终端建议不会自动完成

    VSCode 的 PowerShell 终端现在以灰色显示您可能想要输入的内容 大概来自历史记录 但似乎没有办法真正接受这个建议 按 Tab 键只是执行正常的 PowerShell 自动完成 通常是 cmdlet 或路径 这个功能是什么 我
  • Java 8 lambda 表达式身份契约

    The JavaDoc 为LambdaMetaFactoryJava 1 8 的指定 lambda 捕获 可能涉及新函数对象的分配 或者可能返回现有函数对象 但它没有指定何时以及在什么情况下它可能选择一种方式或另一种方式 看看实际执行情况L
  • Numpy 性能差异取决于数值

    在评估 Numpy 中的表达式时 我发现了奇怪的性能差异 我执行了以下代码 import numpy as np myarr np random uniform 1 1 1100 1100 进而 timeit np exp 0 5 myar
  • Dijkstra 负权重算法

    好吧 首先我知道 Dijkstra 不适用于负权重 我们可以使用 Bellman ford 代替它 但在我遇到的一个问题中 它指出所有边的权重都从 0 到 1 不包括 0 和 1 而路径的成本实际上就是产品 所以我的想法就是只取日志 现在所
  • Rails 6.1.5:未初始化常量 Mail::TestMailer

    为什么我在 Rails 6 1 5 Ruby 3 1 0 中遇到 未初始化常量 Mail TestMailer 错误 而在 Rails 6 1 5 Ruby 3 0 1 没有问题的情况下工作 发现以下来自Ruby 3 1 0 的新闻 The
  • 使用 PIL 翻译图像 [重复]

    这个问题在这里已经有答案了 如何使用 PIL 和 python 将图像在四个方向之一上平移 5 个像素 我已经看到我们可以使用im transform size AFFINE data 但我不知道该怎么做 Image transform s
  • 如何获得 Task.WhenAny 对 Task 和 CancellationToken 的效果?

    我有一个交互式任务 在 最糟糕 的情况下根本不会执行 因此它由TaskCompletionSource 我想等待此任务完成 或者我收到的令牌被取消 以先发生者为准 完成此类工作的完美工具是Task WhenAny 唯一的问题是它只需要任务
  • 将 RGB8 byte[] 转换为位图

    我有来自相机的 RGB8 格式的原始像素数据 我需要将其转换为Bitmap 但是 那Bitmap PixelFormat似乎只支持 RGB 16 24 32 和 48 格式 我尝试使用PixelFormat Format8bppIndexe
  • Hibernate 不会在 Spring Boot 项目中抛出 LazyInitializationException

    我使用 Hibernate 5 0 从事 Spring Boot 项目 不幸的是 Hibernate 会读取延迟初始化的对象而不抛出异常LazyInitializationException即使在事务提交之后 我怎样才能启用LazyInit
  • Linq/EF、预加载和 GROUP BY 问题

    我在 GROUP BY 和急切加载方面遇到问题 我尝试解释我在做什么 我正在查询数据上下文 ctx 的事件 事件类具有以下属性 string Description DateTime Date bool IsDeleted Guid Sub
  • 在没有第 3 方 Cookie 的情况下使用 Google Firebase 身份验证

    我目前正在尝试社交媒体登录 并意识到这些登录的传递方式有点奇怪 这是因为我的工作场所 像大多数办公室一样 将阻止第 3 方 cookie 作为安全策略 谷歌 Firebase 身份验证使用第 3 方 cookie 因此如果我尝试使用 Fir
  • NSSortDescriptor 将数字作为字符串进行排序?

    有一个充满字典的数组 如下所示 order 10 name David order 30 name Jake order 200 name Michael 当我像下面的代码一样使用 NSSortDescriptor 时 它只对第一个字符进行
  • Chrome 扩展:如何检测内容脚本已加载到选项卡中?

    我的后台脚本中有以下代码 chrome tabs onUpdated addListener function tabId changeinfo tab if changeinfo status complete return if mat