检测是否已注入Chrome扩展程序内容脚本/内容脚本包含防护

时间:2013-08-24 20:49:15

标签: javascript google-chrome-extension include

每当更新标签时,我都想执行内容脚本功能。问题是,有时候标签更新是ajax(没有页面重新加载),同时仍然会更改页面的URL。因此,注入的旧内容脚本仍然存在于页面上。结果是在同一页面上注入并运行了多个内容脚本实例。

所以,我正在寻找一种注入内容脚本的机制,只要之前没有注入过相同的内容脚本。有什么想法吗?

2 个答案:

答案 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过滤器的方法。