lhk*_*lhk 4 javascript google-chrome google-chrome-extension firefox-addon-webextensions
我正在尝试编写一个简单的Web扩展。目前,我正在关注各种教程,并试图了解该体系结构。
通过注入到网站源代码中的content_scripts与特定选项卡进行交互。在我看来,好像content_scripts是自动加载的:https : //developer.mozilla.org/en-US/Add-ons/WebExtensions/Anatomy_of_a_WebExtension#Content_scripts
关于MDN 的教程使这一点更加清晰:
该脚本将被加载到与content_scripts manifest.json键中给出的模式匹配的页面中。脚本可以直接访问文档,就像页面本身加载的脚本一样。
我的扩展程序应该为每个文本选择提供一个上下文菜单。首先,我发现了一个有用的Chrome扩展示例。您可以在这里https://developers.chrome.com/extensions/samples找到它,它被称为“说话选择”
该扩展程序正在使用tts引擎读取所选文本。但是源代码的一部分令人困惑:它们具有显式功能,可以在选项卡中运行content_scripts。此代码在其后台脚本之一中作为Init()函数的一部分执行:
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});
}
}
});
}
Run Code Online (Sandbox Code Playgroud)
据我所知,浏览器启动后即会立即执行代码。那不是多余的吗?
他们的manifest.json应该负责content_script的执行,这是相关代码:
"content_scripts": [
{
"matches": [
"<all_urls>"
],
"all_frames": true,
"js": [
"keycodes.js",
"content_script.js"
]
}
],
Run Code Online (Sandbox Code Playgroud)
将脚本注入每个打开的选项卡的正确方法是什么?
简短答案:Chrome需要此功能,但Firefox不需要。
Chrome浏览器并不会加载内容脚本到在扩展负载(包括扩展的更新,而不仅仅是初始负载)匹配的网页。
因此,如果要在扩展加载时打开选项卡中的内容脚本功能(而不是将来的导航),则需要此代码(或类似代码)。
您可以使用来对代码进行现代化chrome.tabs.query。
Firefox在这方面与Chrome不兼容:它会在加载时自动将内容脚本注入所有匹配的内容。因此,您应该使用一些浏览器检测和/或仅注入一次防护代码。
我希望他们不会将其介绍为一项重大变化。至少提供一个清单键来选择行为以便于过渡是很有意义的。
注意:在扩展重新加载方案中,旧实例中的内容脚本将继续存在(但是扩展API将会失败);妥善处理是您的责任。
| 归档时间: |
|
| 查看次数: |
671 次 |
| 最近记录: |