前两篇谈到了Chrome扩展,但是感觉没有说清楚,这次在丰富一下。其实很简单,如果你懂得基本的HTML、CSS、JavaScript,那你就有了扩展Chrome浏览器需要的所有知识。
为了着手创建你的扩展程序,你只需要为你的扩展创建一个文件夹。程序所必须的文件只有manifest.json
.,不过也推荐准备一些图片用作图标,和至少一个JavaScript以提供功能。一般来说还会包含HTML文档、样式表、图片等等其他的资源。
每个扩展都必须在其根目录下包含一个manifest.json
文件。
这个文件里面声明了扩展的名称、版本、权限、设置选项和其他的一些和扩展相关的元数据。Manifest v1早在Chrome 18便已被弃用,而且会根据这个时间表逐渐淘汰使用Manifest v1的扩展。如果你在参考一些旧扩展的Manifest文件的话,请确认添加"manifest_version": 2
.
Google发布的Manifest v2中支持的域
大多数扩展都会在其manfiest.json文件内有这样的内容:
{
"background": {
"scripts": ["index.js", "other.js"]
}
}
后台页会从扩展被加载的时候被装载,而且会一直留在内存里。这是因为如果有些状态需要被长时间维护,或者需要被扩展的其他部分访问。但是如果你没有这个需求,那么应该尽可能的使用事件页。事件页其实只是相当于一个包含了"persistent": false条目的后台页,这一行语句告诉Chrome可以不需要把后台页保留在内存里。相对来说,事件页也会在最开始被装载,但是一旦指定的脚本运行完毕,事件页便会从内存卸载,而且会在需要的时候被再次加载(比如用来回应某些操作)。
利用Google提供的大量API,你的扩展与浏览器交互或者为用户提供功能都变得方便。
Chrome的程序和扩展程序都非常喜欢调用chrome.* APIs,这些API可以让你通过不同的方式来操控浏览器,API通常会在后台脚本里面被调用,这是我找到的一些常用API:
其他API
Chrome程序和扩展程序通常也会用到其他的API,包括如本地存储、地理位置、缓存、画布等新型的HTML5 API。你也可以用普通的JavaScript或者webkit API来实现。
声明权限
有些Chrome API的功能必须要在manifest.json
文件中声明相关权限才能被调用,通过在permissions 域中把值设成相应权限名称,或者是通识符组成的数组。
{
"permissions": [
"contextMenus",
"tabs",
"https://google.com/*",
"https://developer.mozilla.org/*"
]
}
Chrome扩展的用户界面有着严格的限制,但是根据扩展的需要却可以有不同形式的界面。
浏览器按钮允许你在右上角放置一个的16 x 16像素的图标,如果扩展应用的界面是全局的,而不是针对某个页面,那就应该使用浏览器操作。如果要使用浏览器按钮,你必须在manifest.json中的browser_action域中做如下声明:
{
"browser_action": {
"default_icon": {
"19": "images/icon19.png",
"38": "images/icon38.png"
},
"default_title": "tooltip text here",
"default_popup": "popup.html"
}
}
页面按钮允许你在多功能栏(地址栏)右边添加一个按钮,其实他和浏览器按钮很相似,区别之处在于页面按钮是专门用来处理某些指定的页面的。页面按钮必须在manfiest.json中声明, page_action域的使用和浏览器按钮一样。页面按钮可以通过chrome.pageAction API控制,可以在不同的标签页中灵活的显示或者隐藏。页面按钮也可以设置图标、提示和弹出内容,和浏览器按钮不同的是其没有文字标记功能。
右键菜单是另一个提供用户界面,方便用户和扩展交互的方式。Chrome的右键菜单通过右键激活,但根据激活内容的变化,菜单内容也会做相应改变。
chrome.contextMenusAPI允许你向为不同内容激活的右键菜单添加项目,若要使用此API,则在manifest.json文件中声明相应的contextMenus权限。
目前可用的激活内容有:all, page, frame, selection, link, editable,image, video, audio
对应:所有内容、页面、框架、选择、链接、可编辑、图像、视频、音频,以下这个例子需要contextMenus 和tabs权限,他可以使扩展为右键菜单添加一个根项目,然后添加一个子菜单,用来复制当前的页面到一个新选项卡。
var root = chrome.contextMenus.create({
title: 'MyExtension',
contexts: ['page']
}, function () {
var subMenu = chrome.contextMenus.create({
title: 'Duplicate Tab'
contexts: ['page'],
parentId: root,
onclick: function (evt) {
chrome.tabs.create({ url: evt.pageUrl })
}
});
});
Chrome把地址栏/搜索栏称为多功能框,通过chrome.omnibox API,他可以让扩展有另一个界面。通过API 可以设置一个特定的激活字符串,当这个字符串被键入多功能框时扩展便可以对其做出反应。在manifest.json中做如下声明:
{
"omnibox": {
"keyword": "ext-"
}
}
chrome.omnibox API可以让你添加激活字符串被键入之后的修改或者输入的事件处理器。
选项页面是一个的常见的用户界面,在chrome://extensions里可以通过单击扩展右边的选项按钮来打开。通常这个页面会和存储API结合使用,以用来在计算机上为用户保存设置。而使用脚本通过chrome.tabsAPI来打开选项页面也是可以的。
页面重载允许你完全替代一个以下指定页面(一个扩展程序只能重载一个页面)
这些被替换的页面必须在manifest.json文件中如下声明chrome_url_overrides域:
{
"chrome_url_overrides": {
"bookmarks": "newBookmarkManager.html"
}
}
内容脚本是和你的扩展有关,在网页中运行的脚本。这个脚本可以让你访问页面里相应的DOM元素,你可以像这样在manifest.json里通过指定content_scripts域定义一个内容脚本数组:
{
"content_scripts": [
{
"matches": ["http://www.google.com/*"],
"css": ["custom-google-styles.css"],
"js": ["custom-google-script-1.js", "custom-google-script-2.js"]
},
{
"matches": ["http://*"],
"css": ["global-styles.css"],
"js": ["global-script.js"]
}
]
}
内容脚本有以下限制:
内容脚本可以通过消息传递间接的使用chrome.* API,或者是和扩展脚本交互。