扩展程序必须在浏览器工具栏中有一个图标。通过工具栏图标可以轻松访问并让用户知道安装了哪些扩展。大多数用户将通过单击图标来与使用弹出窗口的扩展程序进行交互。 #### # 指向文件 扩展文件可以通过使用相对 URL 来引用,就像普通 HTML 页面中的文件一样。
{
"name": "My Extension",
"version": "2.1",
"description": "Gets information from Google.",
"icons": {
"128": "icon_16.png",
"128": "icon_32.png",
"128": "icon_48.png",
"128": "icon_128.png"
},
"background": {
"persistent": false,
"scripts": ["background_script.js"]
},
"permissions": ["https://*.google.com/", "activeTab"],
"browser_action": {
"default_icon": "icon_16.png",
"default_popup": "popup.html"
}
}
此外,还可以使用绝对 URL 访问每个文件。
<img src="images/my_image.png">
在绝对 URL 中,<extensionID> 是扩展系统为每个扩展生成的唯一标识符。 可以访问 URL chrome://extensions 查看所有已加载扩展名的 ID 。<pathToFile> 是扩展的顶层文件夹下文件的位置;它根据相对 URL 匹配。 在使用解压缩后的扩展程序时,扩展程序 ID 可能会更改。 具体来说,如果从其他目录加载扩展,则解压缩扩展的 ID 会发生变化;扩展名打包后,ID将再次更改。如果扩展程序的代码依赖于绝对 URL,则可以使用 chrome.runtime.getURL() 方法来避免在开发过程中对 ID 进行硬编码。 ### # 架构 扩展的架构取决于其功能,但许多健壮的扩展都包括多个组件: - Manifest - 后台脚本 - 交互界面 - 内容脚本 - 选项页面 ##### # 后台脚本 后台脚本是扩展的事件处理程序。它包含对扩展很重要的浏览器事件的监听器。它将处于休眠状态,直到触发事件执行所指示的逻辑为止。有效的后台脚本仅在需要时才加载,而在空闲时则不加载。 ##### # 交互界面 扩展程序的用户界面应该是有目的且简单的。用户界面应自定义或增强浏览体验,这样不会分散用户注意力。大多数扩展程序有浏览器操作或页面操作,但也可以包含其他形式的 UI,例如上下文菜单,地址栏或键盘快捷键。 扩展的 UI 页面(例如 popup 弹出窗口)可以包含具有 JavaScript 逻辑的普通 HTML。扩展程序还可以调用 tabs.create 或 window.open() 来显示扩展程序的其他 HTML 文件。 用到页面操作和弹出窗口的扩展可以使用 declarative content API 在后台脚本中为用户设置规则。满足条件后,后台脚本会与弹出窗口进行通信,以使用户可点击其图标。
chrome-extension://<extensionID>/<pathToFile>


该方法将失败,因为 query() 是异步的。 它不等待任务完成就会返回,并且不返回值。当回调参数在其签名中存在时,该方法才能够异步调用。
//THIS CODE DOESN'T WORK
var tab = chrome.tabs.query({'active': true}); //WRONG!!!
chrome.tabs.update(tab.id, {url:newUrl});
someOtherFunction();
要正确查询选项卡并更新其 URL,扩展名必须使用 callback 参数。
// Signature for an asynchronous method
chrome.tabs.query(object queryInfo, function callback)
在上面的代码中,这些行按以下顺序执行:1、4、2。仅在获得有关当前所选选项卡的信息之后,才调用 query() 的回调函数,然后执行第 2 行。 在 query() 返回之后的某个时间发生。 尽管 update() 也是异步的,但是代码没有使用回调参数,因为扩展对更新结果没做其他事情。
//THIS CODE WORKS
chrome.tabs.query({'active': true}, function(tabs) {
chrome.tabs.update(tabs[0].id, {url: newUrl});
});
someOtherFunction();
此方法以字符串形式同步返回 URL,并且不执行其他任何异步工作。 ##### # 更多细节 有关更多信息,请浏览 Chrome API 参考文档并观看以下视频 Youtube。 ### # 页面之间的通信 扩展中的不同组件通常需要相互通信。通过使用 chrome.extension 方法,例如getViews() 和 getBackgroundPage(),不同的 HTML 页面可以找到彼此。 一旦页面引用了其他扩展页面,第一个页面就可以调用其他页面上的函数并操纵其 DOM 元素。 此外,扩展的所有组件都可以访问使用 Storage API 存储值,和通过消息传递进行通信。 ### # 保存数据和隐身模式 扩展可以使用 Storage API,HTML5 webstorage API或请求保存数据的服务器来保存数据。当扩展程序需要保存某些内容时,请首先考虑它是否来自隐身窗口。默认情况下,扩展程序不会在隐身窗口中运行。 隐身模式保证该窗口不会留下任何痕迹。在使用隐身窗口处理数据时,扩展程序应遵守这一承诺。如果扩展程序可以保存浏览历史记录,请不要保存隐身窗口中的历史记录。但扩展程序可以在任何窗口(无论是否隐身)设置存储首选项。 要检测窗口是否处于隐身模式,请检查相关的 tabs.Tab 或 windows.Window 对象的 incognito 属性。
// Synchronous methods have no callback option and returns a type of string
string chrome.runtime.getURL()
### # 下一步 阅读概述并完成入门教程之后,开发人员应该准备开始编写自己的扩展!使用以下资源深入了解自定义 Chrome 的世界。 - 在调试教程中了解可用于调试扩展的选项。 - Chrome 扩展程序可以访问功能强大的 API,而这些 API 均超出开放网络所提供的范围。 chrome.*API文档 将介绍每个 API。 - 开发人员指南还有许多其他链接,这些链接指向与高级扩展创建相关的文档。 - - - 关注 微信公众号「程序化思维」 获取最新 Chrome 插件开发教程。
function saveTabData(tab) {
if (tab.incognito) {
return;
} else {
chrome.storage.local.set({data: tab.url});
}
}
