运行 注入js的一个函数

Run a function from injected js

我一直在兜圈子,所以我希望得到一些帮助

这就是我想要达到的效果

  1. 用户按下我的分机
  2. 出现带有两个按钮的弹出窗口,'run function a' 和 'run function b'
  3. 当他们按下按钮时,它 运行 是我自己注入的 js 文件中的函数。
  4. 例如,函数 a 可以计算活动选项卡中某种类型的元素的数量

所以,我可以在页面加载时注入我的 js 文件(这是在我的 contentscript.js 中)

var s = document.createElement('script');
s.src = chrome.extension.getURL('temp-file.js');
s.onload = function() {
    this.parentNode.removeChild(this);
};
(document.head||document.documentElement).appendChild(s);

这有效,我可以看到正在执行的 js

但我能做的是在 temp-file.js

中有一个函数 运行

例如在弹出窗口中我有

chrome.tabs.executeScript(null, {code:"shows();"});

我明白了:Uncaught ReferenceError: shows is not defined

如果我输入 shows();进入控制台,它按预期工作

我认为问题全在于上下文。我在 popup.js 页面中尝试了各种方法来注入文件,但似乎没有任何效果

有谁能给我指出正确的方向吗

谢谢

授予

I presume that the issue is all about the context.

你说得对。

文件 "temp-file.js" 已被注入主机页面,因此它现在是主机页面上下文的一部分。扩展可能会弄乱它 - 因为它在不同的上下文中。

运行 注入js的函数

解决方案:

不确定您要实现的目标。选择适合你的:

  1. 拆分注入文件 Code/functions 你想在页面上执行 - 将它们用作内容脚本。 在这种情况下,将您分开 "temp-file.js" - 部分扩展已执行(成为内容脚本的一部分)并且部分主机页面必须执行(您的代码片段)。

  2. 使用自定义事件 使用自定义事件 - 在 contenscript 中生成自定义事件 - 监听它注入的脚本。 custom event

你的问题并没有说明你到底想达到什么目的。

我是这么理解的。您想从 popup.js.

contentscript.js 执行一个函数

如果是这种情况,那么您可以从 popup.js 调用 contentscript 上的方法,就像这里提到的 https://developer.chrome.com/extensions/messaging