【问题标题】:detect if Chrome extension content script has been injected / content script include guard检测是否已注入 Chrome 扩展内容脚本/内容脚本包含保护
【发布时间】:2013-08-24 20:49:14
【问题描述】:

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

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

【问题讨论】:

  • 所以我很好奇除了尝试发送消息并等待内容脚本的响应之外,您是否能够找到可行的解决方案?
  • @c00000fd:重新审视这个问题,我确实认为 Rob W 的解决方案更简单,因为它不依赖于 chrome 消息传递。

标签: javascript google-chrome-extension include


【解决方案1】:

您可以尝试向内容脚本 (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");
        }
    });
});

内容脚本:

chrome.runtime.onMessage.addListener(
    function(request, sender, sendResponse) {
        if (request.greeting == "hello")
            sendResponse({message: "hi"});
 });

【讨论】:

  • 试过这个。但是你只知道sendMessage的回调中的错误。而且你无法捕捉到回调函数中抛出的错误。
  • 这个答案可能适用于早期的 chrome 版本,而不是今天......
【解决方案2】:

实现包含保护非常容易:

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

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

【讨论】:

  • 很高兴了解 WebNavigation!有了这个包含保护,代码本身仍然被注入。在多次导航之后,可能会有很多内容脚本注入到这个页面中。这会导致任何性能问题吗?有没有办法通过检查不存在内容脚本来注入?
  • 来自同一扩展的所有内容脚本在同一上下文中运行。不用担心性能。
  • 来自同一扩展程序的所有内容脚本都在同一上下文中运行...直到重新加载扩展程序。重新加载扩展时要小心 - 这将导致两个扩展运行。
  • @RobW:很抱歉恢复这个旧线程,但我并没有真正遵循建议的实现。 window.hasRun 是什么?这段代码应该从哪里运行?
  • @c00000fd hasRun 是一个任意选择的全局变量名,应该包装应该只执行一次的内容脚本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-12
  • 1970-01-01
  • 2022-11-07
  • 2012-03-07
  • 2011-04-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多