8

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

因此,我正在寻找一种注入内容脚本的机制,前提是之前没有注入相同的内容脚本。有任何想法吗?

4

2 回答 2

14

您可以尝试向内容脚本发送消息(消息传递)。如果内容脚本成功返回响应,则意味着内容脚本已经存在,否则返回空响应,您可以检查空响应并注入内容脚本。

背景:

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"});
 });
于 2013-08-25T06:02:10.363 回答
7

实现包含保护非常容易:

(function() {
    if (window.hasRun) return;
    window.hasRun = true;
    // Rest of code
})();

如果您想以编程方式注入内容脚本,请考虑使用其中一个webNavigation事件(例如onCommitted)而不是chrome.tabs.onUpdated. 与tabs事件不同,webNavigation 事件也会触发框架内的导航,并提供一种提前声明 URL 过滤器的方法。

于 2013-08-24T21:55:47.137 回答