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 扩展:如何检测内容脚本已加载到选项卡中? 的相关文章

  • html 链接不起作用 href javascript 参数太长

    a href alt a 在 href 中我调用了一个 javascript 函数 change 第二个参数 n1387519869249 1196 n1387519906965 1368 n 是一个非常长的值 大约 5070 个字符 但在
  • Flex、AngularJS + Masonry、akoenig/angular-deckgrid 等 [重复]

    这个问题在这里已经有答案了 我一直在发送此电子邮件 我即将发布一个用于 Web 应用程序安全的应用程序 它需要使用像 Masonry 这样的网格 我已经尝试过所有的 每一个角度模块 指令和不同的方法 包括基于 CSS 的技术 纯 Vanil
  • Brunch 源映射:在 Chrome 开发工具中未命中断点

    我正在使用 Brunch 中内置的默认源映射 我看到文件很好 但无法在源映射文件中命中断点 使用 Javascript 访问调试器debugger 有效 这让我相信早午餐方面出了问题 这是我的 brunch config js module
  • JavaScript 画布内存问题

    我在用着getImageData putImageData在 HTML5 画布上能够操作图片 我的问题是浏览器似乎从来没有释放任何内存 http jonelf posterous com lite gc men for sent 直到我关闭
  • 在 ajax 请求上启用 jQuery contextMenu 项

    我正在尝试更新上下文菜单 http medialize github com jQuery contextMenu docs htmlitem 如果 ajax 请求改变了我的 div 内容 这就是我的意思 我有一个这样的 div div c
  • 图表.js.如何更改“标签”数组的字体样式?

    我从 Chart JS 库中获取了一个图表 截屏 https i stack imgur com DnuRq png var ctx document getElementById myChart var data labels HTML
  • 网络上的等角柱状图

    我计划为游戏的标记 图钉 构建在线地图 但我无法设置标记的正确纬度 原始地图是一个2048 2048px 的正方形 然后我得到了标记 数千个 地图坐标使用 0 到 100 之间的 x y 表示法设置 0 0 是top left角和100 1
  • 用更好的模式替换开关(Javascript)

    我必须升级我的应用程序以根据用户类型和角色属性显示页面 目前 我使用一个简单的 switch 语句来根据用户类型来执行此操作 例如 switch type case a return CONSTANT ONE case b return C
  • 无需重定向的 HTML 页面提交

    有没有什么方法可以在不使用ajax的情况下提交html表单而无需从当前页面重定向 你可以设置一个target 为您form 这样您就可以将表单提交到新选项卡 target blank 或一个小的 隐藏的iframe target nameo
  • 如何使用 github 托管外部 CSS 文件?

    我将 css 上传到 github 然后转到网站上的文件并单击 raw 选项 我尝试将其添加到网页中 但 chrome 给出以下错误 资源解释为样式表 但使用 MIME 类型 text plain 进行传输 https raw github
  • 公开闭包内的方法

    当我们在闭包内创建一个方法时 该方法将成为该闭包的私有方法 并且在我们以某种方式公开它之前无法访问它 怎么可能暴露呢 您可以返回对它的引用 var a function var b function I m private alert go
  • 为什么这个递归函数返回未定义?

    我正在尝试编写一个使用递归组合两个字符串的函数 我的代码如下 但我不知道为什么该函数返回未定义 特别是当我在基本情况下使用 console log 时 它不会打印未定义而是打印正确的值 var str3 function merge str
  • NodeJS - 将相对路径转换为绝对路径

    In my 文件系统我的工作目录在这里 C temp a b c d 在 b bb 下有文件 tmp txt C temp a b bb tmp txt 如果我想从工作目录转到该文件 我将使用以下路径 bb tmp txt 如果该文件不存在
  • 基于范围内变量的角度设置形式动作

    我一直在尝试设置一个搜索表单 可以在其中注入表单操作属性 在我的表格中我有
  • 使用 eval 时不会受到 XSS 威胁

    我正在制作 不是现在 但我仍然对这个感到好奇 一款使用 HTML5 和 JS 的游戏 我想要的是人们可以插入自定义脚本 但要安全 function executeCustomJS code eval code bad 当然这段代码非常糟糕
  • 如何禁用网页中的萤火虫?

    如何使用 Javascript 禁用 firebug 我想这样做是为了向访问者隐藏我的网页的运作方式 有什么选择可以做到这一点吗 你不能 你能做的最好的事情就是混淆你的 JavaScript 实际上刮掉了 您能做的最好的事情就是将所有安全关
  • 获取类中的所有静态 getter

    假设我有这个类 我像枚举一样使用它 class Color static get Red return 0 static get Black return 1 有没有类似的东西Object keys to get Red Black 我使用
  • 如何计算一行中Flexbox项目的数量?

    网格是使用 CSS flexbox 实现的 Example http jsbin com jumosicasi edit html css js output 本示例中的行数为 4 因为我出于演示目的固定了容器宽度 但是 实际上 它可以根据
  • 加载 Angular 库时,IE9 和 IE10 中出现 Angular JS“SCRIPT5007:预期对象”错误

    我正在开发一个 AngularJS 应用程序 该应用程序应在 Firefox IE 9 和 IE 10 上运行 我使用最新版本的 angularjs 库 现在是 1 3 15 服务器端是在JavaEE平台上用Java编写的 服务器运行在Gl
  • HTML5 地理定位 - 在 iOS 上无法始终工作

    目前正在使用 HTML5 地理定位 我已经在所有网络浏览器上测试了它 它似乎工作正常 然而 当我在 iPad 上测试地理定位时 它在 iPad mini 上始终有效 但当我将其放在更大的 iPad iPad 2 上时 位置似乎并不总是有效

随机推荐

  • 更新代码生成 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