Javascript 检测是否已注入Chrome扩展内容脚本/内容脚本是否包含guard
每当更新选项卡时,我都要执行内容脚本函数。问题是,有时选项卡更新是ajax(不需要重新加载页面),同时仍然更改页面的url。因此,页面上仍然存在注入的旧内容脚本。结果是在同一页面上注入并运行多个内容脚本实例Javascript 检测是否已注入Chrome扩展内容脚本/内容脚本是否包含guard,javascript,google-chrome-extension,include,Javascript,Google Chrome Extension,Include,每当更新选项卡时,我都要执行内容脚本函数。问题是,有时选项卡更新是ajax(不需要重新加载页面),同时仍然更改页面的url。因此,页面上仍然存在注入的旧内容脚本。结果是在同一页面上注入并运行多个内容脚本实例 所以,我正在寻找一种机制来注入内容脚本,前提是以前没有注入过相同的内容脚本。有什么想法吗?实现include guard非常简单: (函数(){ if(window.hasRun)返回; window.hasRun=true; //代码的其余部分 })(); 如果要以编程方式注入A,请考虑
所以,我正在寻找一种机制来注入内容脚本,前提是以前没有注入过相同的内容脚本。有什么想法吗?实现include guard非常简单:
(函数(){
if(window.hasRun)返回;
window.hasRun=true;
//代码的其余部分
})();
如果要以编程方式注入A,请考虑使用其中一个事件(例如)代替。与
选项卡
事件不同,webNavigation事件也会被触发用于在框架内进行导航,并提供一种提前声明URL筛选器的方法。您可以尝试向内容脚本()发送消息。如果内容脚本成功返回响应,则表示内容脚本已经存在,否则将返回空响应,您可以检查空响应并注入内容脚本
背景:
chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
chrome.tabs.sendMessage(tabs[0].id, {greeting: "hello"}, function(response) {
if (response) {
console.log("Already there");
}
else {
console.log("Not there, inject contentscript");
}
});
});
chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse) {
if (request.greeting == "hello")
sendResponse({message: "hi"});
});
ContentScript:
chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
chrome.tabs.sendMessage(tabs[0].id, {greeting: "hello"}, function(response) {
if (response) {
console.log("Already there");
}
else {
console.log("Not there, inject contentscript");
}
});
});
chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse) {
if (request.greeting == "hello")
sendResponse({message: "hi"});
});
很高兴了解WebNavigation!有了这个include-guard,代码本身仍然被注入。在多次导航之后,可能会有大量内容脚本注入到该页面中。这会导致性能问题吗?是否有办法通过检查不存在内容脚本来进行注入?来自同一扩展的所有内容脚本都在同一上下文中运行。不要担心性能。来自同一扩展的所有内容脚本都在同一上下文中运行。。。直到重新加载扩展。如果重新加载扩展,请小心-这将导致两个扩展正在运行。@RobW:很抱歉重新启动这个旧线程,但我并不真正遵循建议的实现。什么是
window.hasRun
?这段代码应该从哪里运行?@c0000fdhasRun
是一个任意选择的全局变量名,应该包装只执行一次的内容脚本。尝试了这个。但您只知道sendMessage回调中的错误。你无法捕捉回调函数中抛出的错误。这个答案可能适用于早期的chrome版本,而不是今天……所以我很好奇,除了尝试发送消息并等待内容脚本的响应外,你是否还能找到一个有效的解决方案?@c0000fd:再次讨论这个问题,我确实认为Rob W的解决方案更简单,从某种意义上说,它不依赖于chrome消息传递。