从 Chrome 扩展访问页面的选择器或 JQuery 实例

Access page's selector or JQuery instance from a Chrome Extension

我会尽量简单地解释一下。

我开发了一个 Chrome 扩展,但我在使用某些功能时遇到了问题。

我遇到的问题是我需要在扩展程序可以访问的网站上触发一些事件,但是一些在控制台上运行的脚本,如果从我的内容 js 执行,则不会以相同的方式工作Chrome 扩展(即使我使用自己的 jQuery 版本,如果需要我可以添加到我的扩展中)。

示例:

如果我在控制台上执行 window.$ 或 jQuery 它 returns ƒ (a,b){return new n.fn.init(a,b)}。如果我 运行 在我的脚本中,即使我等到所有内容都加载完毕,即使我在检查以确保所有内容都已加载之前设置等待 10 秒,它也会告诉我“$ is undefined”,当我我的 Chrome 分机上没有 jQuery。

此外,console.log(window.$.fn) 从控制台执行 returns Object [jquery: "1.12.4", selector: "", constructor: ƒ, toArray: ƒ, get: ƒ, …] 但是如果我 运行 从我的内容脚本中 jQuery 激活 returns Object [jquery: "3.5.0", constructor: ƒ, toArray: ƒ, get: ƒ, pushStack: ƒ, …] 因为我在扩展上安装了那个版本。

我需要这样做(它在控制台工作,而不是在扩展的内容脚本中工作):

$("#id").val(123).val());
$("#id").trigger('keyup');

我也尝试过本机 .dispatchEvent() 方法来执行此操作但没有任何反应,它 returns true 在执行时但没有任何反应。

这就是我要问的原因:有没有办法从外部文件访问页面的 jQuery 实例(在本例中是 chrome 扩展名的 content.js 脚本) ?

我可以更改 DOM 但这还不够,即使我出于某种原因更改了表单输入的值,页面也无法识别更改。我发现的唯一可行方法是在使用 jQuery 更改值后手动触发 keyup 事件,但只有在我从控制台执行此操作时才有效。

有线索吗?

按照@wOxxOm 的建议,我设法实现了我想要的。我将我以前的 js 文件添加为清单上的可访问文件:

"web_accessible_resources": ["cont.js"]

然后我添加了另一个内容脚本,以这种方式将我拥有的第一个内容加载到 DOM 中:

let url = chrome.runtime.getURL('cont.js');
$("head").first().append("<script src='" + url + "' type='text/javascript'></script>");

如果您 JSON.stringify 也可以从页面定义和访问变量:

let configData = {'obj1':1, 'obj2':2}
$("head").first().append(
    "<script type='text/javascript'>let config = " + JSON.stringify(configData) + "</script>"
);