3

我想写一个简单的Web扩展。 目前我正在关注各种教程并试图理解架构。Web扩展是否需要显式加载内容脚本?

与特定选项卡的交互是通过注入到网站源代码中的content_script完成的。 在我看来,仿佛content_scripts被自动加载: https://developer.mozilla.org/en-US/Add-ons/WebExtensions/Anatomy_of_a_WebExtension#Content_scripts

上MDN一个tutorial使得这个就更清楚了:

该脚本将被加载到匹配给 模式的网页content_scripts manifest.json键。该脚本直接访问文档的 ,就像页面本身加载的脚本一样。

我的扩展应该为每个文本选择提供一个上下文菜单。作为一个起点,我发现了一个有用的Chrome扩展示例。你可以在这里找到它https://developers.chrome.com/extensions/samples,它被称为“说话选择”

这个扩展名是用tts引擎读取选定的文本。 但是源代码的一部分令人困惑:它们有一个显式的功能来在选项卡中运行content_scripts。据

function loadContentScriptInAllTabs() { 
    chrome.windows.getAll({'populate': true}, function(windows) { 
    for (var i = 0; i < windows.length; i++) { 
     var tabs = windows[i].tabs; 
     for (var j = 0; j < tabs.length; j++) { 
     chrome.tabs.executeScript(
      tabs[j].id, 
      {file: 'keycodes.js', allFrames: true}); 
     chrome.tabs.executeScript(
      tabs[j].id, 
      {file: 'content_script.js', allFrames: true}); 
     } 
    } 
    }); 
} 

我所看到的,因为浏览器启动时立即执行的代码:此代码为init()函数的一部分,他们的后台脚本中的一个执行。 这不是多余的?

他们的manifest.json应该照顾content_script执行的,这里是有关的代码:

"content_scripts": [ 
    { 
     "matches": [ 
     "<all_urls>" 
     ], 
     "all_frames": true, 
     "js": [ 
     "keycodes.js", 
     "content_script.js" 
     ] 
    } 
    ], 

什么是注入一个脚本到每一个打开的选项卡的正确方法?

回答

3

简短回答:它需要在Chrome中,但不是Firefox。


does not load内容脚本到在分机负载(其包括扩展更新,而不只是初始载荷)一致页面。

因此,如果您希望在扩展加载时打开选项卡中的内容脚本功能(而不是将来的导航),则需要此代码(或类似代码)。

您可以使用chrome.tabs.query稍微更新此代码。


火狐与Chrome浏览器不兼容的在这方面的:它自动在加载时相匹配的一切注入内容脚本。所以你应该使用浏览器检测和/或只注入一次的守卫代码。

我希望他们没有介绍这是一个突破性的变化。至少提供一个明确的关键来选择行为以简化过渡是有意义的。


注意:在扩展重装场景中,来自旧实例的内容脚本继续存在(但扩展API将失败);这是你的责任,妥善处理。

+1

感谢您的快速回答。并且您包含在以前的答案中的链接非常有用 – lhk