网站正在运行jQuery脚本。我想使用Chrome扩展程序让网站运行我自己的jQuery脚本版本,而不是正常版本。
到目前为止,我已设法让Chrome扩展程序找到网站称为普通脚本的位置,并且我已将其替换为我自己的:
document.querySelector("script[src^='website.com/originaljqueryscript']").src = 'myjqueryscript';
作为测试,我使myjqueryscript与原始版本完全相同。我将清单中的run_at设置为在document_end上运行。
当我尝试在启用脚本的情况下打开网站时,控制台记录了错误$(...).dialog is not a function
。我认为这是因为我的chrome扩展中没有加载jQuery。然后我找到了该网站使用的jQuery版本,并将其添加到我的chrome扩展程序中。现在我收到此错误:$(…).dialog is not a function
我认为错误是由于已加载的两个jQuerys之间的冲突(一个在网站上,一个来自我的扩展名)。
我是在正确的轨道上,还是有更好的方法来替换我自己的网站jQuery脚本?
答案 0 :(得分:1)
如果这是针对一个非常具体的网站,从特定的URL加载jQuery,您可以使用webRequest
API拦截对jQuery的请求,并将其重定向到您的扩展中捆绑的文件。 E.g:
chrome.webRequest.onBeforeRequest.addListener(
function(details) { return {redirectUrl: chrome.runtime.getUrl("js/myjquery.js")}; },
{urls: ["https://example.com/js/jquery.js"]},
["blocking"]
);
(注意:此示例非常小;您可能需要包含并检查请求标头以确保源页面是您的目标网站 - 您真的不想为所有人替换CDN提供的jQuery位点)
这假定网站不使用Subresource Integrity支票,但我相信它会绕过script-src
内容安全政策(重定向是透明的)。
请注意.dialog()
是jQuery UI的一部分,而不是核心jQuery;该网站可能会加载两者,您需要拦截两者。该网站实际上可能将它们捆绑在一起。