检测Chrome扩展内容脚本是否已注入/内容脚本是否包含保护
detect if Chrome extension content script has been injected / content script include guard
每当更新选项卡时,我都想执行一个内容脚本函数。问题是,有时选项卡更新是ajax(不需要重新加载页面),同时仍在更改页面的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"});
});
实现包含保护非常容易:
(function() {
// Comparing to a literal value to prevent matching a DOM element with id="hasRun"
// https://stackoverflow.com/q/3434278/do-dom-tree-elements-with-ids-become-global
if (window.hasRun === true) return;
window.hasRun = true;
// Rest of code
})();
如果要以编程方式注入内容脚本,请考虑使用webNavigation
事件之一(例如onCommitted)而不是chrome.tabs.onUpdated
。与tabs
事件不同,webNavigation事件也被触发用于帧内的导航,并提供了一种提前声明URL过滤器的方法。
相关文章:
- 当包含另一个asp文件时,是否也包含所有引用的样式和脚本页面
- 是否可以控制获取哪些Google地图脚本(JavaScript API)
- 测试mongo脚本中是否存在参数
- 是否可以通过Chrome扩展内容脚本打开Chrome外部协议请求
- 在chrome web商店中打开时,是否有允许执行内容/后台脚本的解决方案
- 浏览器是否持久缓存脚本元素的编译版本
- Javascript是否可以在VPS/远程服务器上执行Ruby脚本
- 如何知道是否加载了JavaScript(脚本)
- 是否在Script Src标记中包含Script<脚本>(JavaScript等)
- 是否可以添加<脚本>添加'_someTag'到iFrame中的URL
- 是否有用于加载外部脚本的JavaScript库
- 内容安全策略指令:;脚本src'self'blob:文件系统:chrome扩展资源:“;获取是否时
- 是否可以从弹出窗口触发内容脚本中的行为
- 是否可以在node.js依赖项上运行脚本
- Unity javascript我如何从另一个脚本中检查bool是否为真
- 如何测试jQuery和某些其他脚本是否已加载
- 我是否应该在网站的每个页面上都包含 Google 地图脚本标签
- 如何在呈现页面后使用 Java 脚本检测 dom 元素值的值是否有任何变化(例如,任何输入或复选框值更改)
- Javascript:是否可以读取外部脚本的原始代码
- 是否可以在不使用服务器端脚本或编程的情况下在网页中进行实时视频流