每当更新选项卡时,我都想执行内容脚本功能。问题是,有时选项卡更新是 ajax(没有重新加载页面),同时仍然更改页面的 url。因此,页面上仍然存在注入的旧内容脚本。结果是在同一页面上注入并运行了多个内容脚本实例。
因此,我正在寻找一种注入内容脚本的机制,前提是之前没有注入相同的内容脚本。有任何想法吗?
每当更新选项卡时,我都想执行内容脚本功能。问题是,有时选项卡更新是 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() {
if (window.hasRun) return;
window.hasRun = true;
// Rest of code
})();
如果您想以编程方式注入内容脚本,请考虑使用其中一个webNavigation
事件(例如onCommitted)而不是chrome.tabs.onUpdated
. 与tabs
事件不同,webNavigation 事件也会触发框架内的导航,并提供一种提前声明 URL 过滤器的方法。