Javascript 使用Chrome扩展替换jQuery脚本

Javascript 使用Chrome扩展替换jQuery脚本,javascript,jquery,google-chrome-extension,Javascript,Jquery,Google Chrome Extension,一个网站正在运行jQuery脚本。我想使用Chrome扩展让网站运行我自己版本的jQuery脚本,而不是普通版本 到目前为止,我已经设法让chrome扩展找到了网站调用普通脚本的地方,并用我自己的脚本替换了它: document.querySelector("script[src^='website.com/originaljqueryscript']").src = 'myjqueryscript'; 作为测试,我使myjqueryscript与原始JQueryScript完全相同。我在清单

一个网站正在运行jQuery脚本。我想使用Chrome扩展让网站运行我自己版本的jQuery脚本,而不是普通版本

到目前为止,我已经设法让chrome扩展找到了网站调用普通脚本的地方,并用我自己的脚本替换了它:

document.querySelector("script[src^='website.com/originaljqueryscript']").src = 'myjqueryscript';
作为测试,我使myjqueryscript与原始JQueryScript完全相同。我在清单中将run_设置为在document_末尾运行

当我尝试在启用脚本的情况下打开网站时,控制台记录了一个错误$..。对话框不是一个函数。我想这是因为jQuery没有加载到我的chrome扩展中。然后我找到了该网站使用的jQuery版本,并将其添加到我的chrome扩展中。现在我得到了这个错误:$..对话框不是一个函数,我相信这个错误是由于两个jquery之间的冲突造成的,一个在网站上加载,一个来自我的扩展


我的思路正确吗,还是有更好的方法用我自己的jQuery脚本替换网站?

如果这是针对一个非常特定的网站,从特定的URL加载jQuery,您可以使用截获对jQuery的请求并将其重定向到扩展名中捆绑的文件。例如:

chrome.webRequest.onBeforeRequest.addListener(
  function(details) { return {redirectUrl: chrome.runtime.getUrl("js/myjquery.js")}; },
  {urls: ["https://example.com/js/jquery.js"]},
  ["blocking"]
);
注:此样本非常少;您可能需要包括并检查请求头,以确保源页面是您的目标站点—您确实不想为所有站点替换CDN提供的jQuery

这假设网站不使用检查,但我相信它将绕过脚本src内容安全策略重定向是透明的


注意.dialog是jQuery UI的一部分,而不是核心jQuery;站点可能会同时加载这两个文件,您需要截取这两个文件。站点实际上可能将它们捆绑在一起。

jQuery被定义为IIFE,因此,它将在加载后立即启动。即使删除jQuery,内容也将被缓存,直到浏览器刷新为止。如果你刷新它,同样的情况会再次发生。我明白了,谢谢。我想我在一个实时网站上替换jquery脚本的计划不太可能,因为原始脚本总是会被加载?是的。但是如果您愿意,您可以阻止所有jQuery CDN并添加您自己的jQuery文件,而不是在文档处加载一个MutationObserver来监视要添加的匹配元素。找到后,立即替换/更改,以便DOM中的结果是指向您的jQuery?这将绕过子资源完整性检查问题。我不确定你是否也需要阻止而不是重定向原始脚本的请求,我必须看看实际传输的是什么;如果在MutationObserver中发生更改,可能不需要阻塞,但我会测试以确定。MutationObserver可能会延迟事件。。但再加上封锁,可能会奏效。无论如何,子资源完整性不是一个非常常见的场景——但我确实包含了一个免责声明,它将破坏此拦截。