每当更新标签时,我都想执行内容脚本功能。问题是,有时候标签更新是ajax(没有页面重新加载),同时仍然会更改页面的URL。因此,注入的旧内容脚本仍然存在于页面上。结果是在同一页面上注入并运行了多个内容脚本实例。
所以,我正在寻找一种注入内容脚本的机制,只要之前没有注入过相同的内容脚本。有什么想法吗?
答案 0 :(得分:14)
您可以尝试向内容脚本(Message Passing)发送消息。如果内容脚本成功返回响应,则表示内容脚本已经存在,否则返回空响应,您可以检查空响应并注入内容脚本。
<强>背景强>
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");
}
});
});
<强> ContentScript:强>
chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse) {
if (request.greeting == "hello")
sendResponse({message: "hi"});
});
答案 1 :(得分:7)
实施包含保护非常简单:
(function() {
if (window.hasRun) return;
window.hasRun = true;
// Rest of code
})();
如果您想以编程方式注入content script,请考虑使用其中一个webNavigation
事件(例如onCommitted)而不是chrome.tabs.onUpdated
。与tabs
事件不同,webNavigation事件也会触发帧内导航,并提供预先声明URL过滤器的方法。