💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、豆包、星火、月之暗面及文生图、文生视频 广告
# 可视页面browser actions与page actions及八种展示方式 参考博客<https://www.cnblogs.com/liuxianan/p/chrome-plugin-develop.html> Google Chrome扩展最常用的可视界面为如下两种形式(两者是互斥的): 它们的UI部分有图标(icon)、提示(tooltip)徽章(badge)、弹出框(popup)组成 - ## **browser actions** 这样的Google Chrome扩展可以适用于**任何**页面。图标往往位于浏览器地址栏**外**右侧。点击图标将弹出窗口。 ![](https://img.kancloud.cn/ef/b9/efb92adf7e1687bf4ee349a1ae91b3c7_122x29.png) > 这个图标与浏览器相关,只要安装了该Chrome扩展的浏览器,就会显示该图标。 > 鼠标悬浮到图标上会给出提示信息,鼠标点击图标会弹出popup页面。图标还可以根据条件设置不同的徽章(Badge),提示用户不同的条件状态 启用他必须在manifest.json文件中注册如下: ``` <pre class="calibre10">``` <span class="token3">{</span> <span class="token3">.</span><span class="token3">.</span><span class="token3">.</span> <span class="token2">"browser_action"</span><span class="token3">:</span> <span class="token3">{</span> <span class="token2">"default_icon"</span><span class="token3">:</span> <span class="token2">"icons/icon.png"</span><span class="token3">,</span><span class="token">//图标(icon)也可以调用setIcon()方法</span> <span class="token">// 图标悬停时的标题,可选</span> <span class="token2">"default_title"</span><span class="token3">:</span> <span class="token2">"这是一个示例Chrome插件"</span><span class="token3">,</span><span class="token">//对应提示(tooltip)还可以调用`setTitle()`方法设置此方法</span> <span class="token">//单击图标打开popup,焦点离开又立即关闭,所以popup页面的生命周期一般很短,需要长时间运行的代码千万不要写在popup里面</span> <span class="token2">"default_popup"</span><span class="token3">:</span> <span class="token2">"popup.html"</span><span class="token">//弹出框(popup)</span> <span class="token">//徽章(badge)badge无法通过配置文件来指定,必须通过代码实现,设置badge文字和颜色可以分别使用`setBadgeText()`和`setBadgeBackgroundColor()`</span> <span class="token3">}</span><span class="token3">,</span> <span class="token3">.</span><span class="token3">.</span><span class="token3">.</span> <span class="token3">}</span> ``` ``` 设置badge ``` <pre class="calibre10">``` chrome<span class="token3">.</span>browserAction<span class="token3">.</span><span class="token4">setBadgeText</span><span class="token3">(</span><span class="token3">{</span>text<span class="token3">:</span> <span class="token2">'new'</span><span class="token3">}</span><span class="token3">)</span><span class="token3">;</span> chrome<span class="token3">.</span>browserAction<span class="token3">.</span><span class="token4">setBadgeBackgroundColor</span><span class="token3">(</span><span class="token3">{</span>color<span class="token3">:</span> <span class="token3">[</span><span class="token6">255</span><span class="token3">,</span> <span class="token6">0</span><span class="token3">,</span> <span class="token6">0</span><span class="token3">,</span> <span class="token6">255</span><span class="token3">]</span><span class="token3">}</span><span class="token3">)</span><span class="token3">;</span> ``` ``` 效果 ![](https://img.kancloud.cn/36/27/3627017d72f72c5078c5934bdb413b77_179x122.png) - ## **page actions** 这样的Google Chrome扩展只能作用于**某一**页面,当打开该页面时触发该Google Chrome扩展,关闭页面则Google Chrome扩展也随之消失。图标往往位于浏览器地址栏**内**右端。还有个不同点是没有点亮时是灰色的,点亮了才是彩色的(一般通过background 里的事件api控制) ``` <pre class="calibre10">``` chrome<span class="token3">.</span>pageAction<span class="token3">.</span><span class="token4">show</span><span class="token3">(</span>tabId<span class="token3">)</span><span class="token3">;</span> <span class="token">//显示图标;</span> chrome<span class="token3">.</span>pageAction<span class="token3">.</span><span class="token4">hide</span><span class="token3">(</span>tabId<span class="token3">)</span><span class="token3">;</span> <span class="token">//隐藏图标;</span> ``` ``` 示例(只有打开百度才显示图标): ``` <pre class="calibre10">``` <span class="token">// manifest.json</span> <span class="token3">{</span> <span class="token2">"page_action"</span><span class="token3">:</span> <span class="token3">{</span> <span class="token2">"default_icon"</span><span class="token3">:</span> <span class="token2">"img/icon.png"</span><span class="token3">,</span> <span class="token2">"default_title"</span><span class="token3">:</span> <span class="token2">"我是pageAction"</span><span class="token3">,</span> <span class="token2">"default_popup"</span><span class="token3">:</span> <span class="token2">"popup.html"</span> <span class="token3">}</span><span class="token3">,</span> <span class="token2">"permissions"</span><span class="token3">:</span> <span class="token3">[</span><span class="token2">"declarativeContent"</span><span class="token3">]</span> <span class="token3">}</span> <span class="token">// background.js</span> chrome<span class="token3">.</span>runtime<span class="token3">.</span>onInstalled<span class="token3">.</span><span class="token4">addListener</span><span class="token3">(</span><span class="token5">function</span><span class="token3">(</span><span class="token3">)</span><span class="token3">{</span> chrome<span class="token3">.</span>declarativeContent<span class="token3">.</span>onPageChanged<span class="token3">.</span><span class="token4">removeRules</span><span class="token3">(</span>undefined<span class="token3">,</span> <span class="token5">function</span><span class="token3">(</span><span class="token3">)</span><span class="token3">{</span> chrome<span class="token3">.</span>declarativeContent<span class="token3">.</span>onPageChanged<span class="token3">.</span><span class="token4">addRules</span><span class="token3">(</span><span class="token3">[</span> <span class="token3">{</span> conditions<span class="token3">:</span> <span class="token3">[</span> <span class="token">// 只有打开百度才显示pageAction</span> <span class="token5">new</span> <span class="token4">chrome<span class="token3">.</span>declarativeContent<span class="token3">.</span>PageStateMatcher</span><span class="token3">(</span><span class="token3">{</span>pageUrl<span class="token3">:</span> <span class="token3">{</span>urlContains<span class="token3">:</span> <span class="token2">'baidu.com'</span><span class="token3">}</span><span class="token3">}</span><span class="token3">)</span> <span class="token3">]</span><span class="token3">,</span> actions<span class="token3">:</span> <span class="token3">[</span><span class="token5">new</span> <span class="token4">chrome<span class="token3">.</span>declarativeContent<span class="token3">.</span>ShowPageAction</span><span class="token3">(</span><span class="token3">)</span><span class="token3">]</span> <span class="token3">}</span> <span class="token3">]</span><span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span><span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span><span class="token3">)</span><span class="token3">;</span> ``` ``` ![](https://img.kancloud.cn/44/1e/441e28084d978bda3b4eb740b3c7c075_590x115.gif) ## **此外,Google Chrome扩展还支持其他的可视界面:** - ## **context menu**,右键菜单 > 通过开发Chrome插件可以自定义浏览器的右键菜单,主要是通过`chrome.contextMenus`API实现,右键菜单可以出现在不同的上下文,比如普通页面、选中的文字、图片、链接,等等,如果有同一个插件里面定义了多个菜单,Chrome会自动组合放到以插件名字命名的二级菜单里,如下: ![](https://img.kancloud.cn/25/14/25142472543938ab4964814b3db03ca4_644x369.png) ### 最简单的右键菜单示例 ``` <pre class="calibre10">``` <span class="token">// manifest.json</span> <span class="token3">{</span><span class="token2">"permissions"</span><span class="token3">:</span> <span class="token3">[</span><span class="token2">"contextMenus"</span><span class="token3">]</span><span class="token3">}</span> <span class="token">// background.js</span> chrome<span class="token3">.</span>contextMenus<span class="token3">.</span><span class="token4">create</span><span class="token3">(</span><span class="token3">{</span> title<span class="token3">:</span> <span class="token2">"测试右键菜单"</span><span class="token3">,</span> onclick<span class="token3">:</span> <span class="token5">function</span><span class="token3">(</span><span class="token3">)</span><span class="token3">{</span><span class="token4">alert</span><span class="token3">(</span><span class="token2">'您点击了右键菜单!'</span><span class="token3">)</span><span class="token3">;</span><span class="token3">}</span> <span class="token3">}</span><span class="token3">)</span><span class="token3">;</span> ``` ``` ![](https://img.kancloud.cn/28/77/2877a2321de65a0853bd187cce2d4fad_348x328.png) ### 添加右键百度搜索 ``` <pre class="calibre10">``` <span class="token">// manifest.json</span> <span class="token3">{</span><span class="token2">"permissions"</span><span class="token3">:</span> <span class="token3">[</span><span class="token2">"contextMenus"</span>, <span class="token2">"tabs"</span><span class="token3">]</span><span class="token3">}</span> <span class="token">// background.js</span> chrome<span class="token3">.</span>contextMenus<span class="token3">.</span><span class="token4">create</span><span class="token3">(</span><span class="token3">{</span> title<span class="token3">:</span> <span class="token2">'使用度娘搜索:%s'</span><span class="token3">,</span> <span class="token">// %s表示选中的文字</span> contexts<span class="token3">:</span> <span class="token3">[</span><span class="token2">'selection'</span><span class="token3">]</span><span class="token3">,</span> <span class="token">// 只有当选中文字时才会出现此右键菜单</span> onclick<span class="token3">:</span> <span class="token5">function</span><span class="token3">(</span>params<span class="token3">)</span> <span class="token3">{</span> <span class="token">// 注意不能使用location.href,因为location是属于background的window对象</span> chrome<span class="token3">.</span>tabs<span class="token3">.</span><span class="token4">create</span><span class="token3">(</span><span class="token3">{</span>url<span class="token3">:</span> <span class="token2">'https://www.baidu.com/s?ie=utf-8&wd='</span> <span class="token1">+</span> <span class="token4">encodeURI</span><span class="token3">(</span>params<span class="token3">.</span>selectionText<span class="token3">)</span><span class="token3">}</span><span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span> <span class="token3">}</span><span class="token3">)</span><span class="token3">;</span> ``` ``` ![](https://img.kancloud.cn/cc/96/cc965a39d5ca503b82e7fcde2d4d4a66_450x218.png) **[contextMenus语法说明](https://developer.chrome.com/extensions/contextMenus)** ``` <pre class="calibre10">``` chrome<span class="token3">.</span>contextMenus<span class="token3">.</span><span class="token4">create</span><span class="token3">(</span><span class="token3">{</span> type<span class="token3">:</span> <span class="token2">'normal'</span>, <span class="token">// 类型,可选:["normal", "checkbox", "radio", "separator"],默认 normal</span> title<span class="token3">:</span> <span class="token2">'菜单的名字'</span><span class="token3">,</span> <span class="token">// 显示的文字,除非为“separator”类型否则此参数必需,如果类型为“selection”,可以使用%s显示选定的文本</span> contexts<span class="token3">:</span> <span class="token3">[</span><span class="token2">'page'</span><span class="token3">]</span><span class="token3">,</span> <span class="token">// 上下文环境,可选:["all", "page", "frame", "selection", "link", "editable", "image", "video", "audio"],默认page</span> onclick<span class="token3">:</span> <span class="token5">function</span><span class="token3">(</span><span class="token3">)</span><span class="token3">{</span><span class="token3">}</span><span class="token3">,</span> <span class="token">// 单击时触发的方法</span> parentId<span class="token3">:</span> <span class="token6">1</span><span class="token3">,</span> <span class="token">// 右键菜单项的父菜单项ID。指定父菜单项将会使此菜单项成为父菜单项的子菜单</span> documentUrlPatterns<span class="token3">:</span> <span class="token2">'https://*.baidu.com/*'</span> <span class="token">// 只在某些页面显示此右键菜单</span> <span class="token3">}</span><span class="token3">)</span><span class="token3">;</span> <span class="token1">/</span><span class="token1">/</span> 删除某一个菜单项 chrome<span class="token3">.</span>contextMenus<span class="token3">.</span><span class="token4">remove</span><span class="token3">(</span>menuItemId<span class="token3">)</span>; <span class="token1">/</span><span class="token1">/</span> 删除所有自定义右键菜单 chrome<span class="token3">.</span>contextMenus<span class="token3">.</span><span class="token4">removeAll</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> <span class="token1">/</span><span class="token1">/</span> 更新某一个菜单项 chrome<span class="token3">.</span>contextMenus<span class="token3">.</span><span class="token4">update</span><span class="token3">(</span>menuItemId<span class="token3">,</span> updateProperties<span class="token3">)</span><span class="token3">;</span> ``` ``` - ## **options 页面** Google Chrome扩展可以有一个options 页面,支持用户定制Chrome扩展的运行参数。 - ## **override(覆盖特定页面)** Google Chrome扩展中的override页面可以替换浏览器中打开的默认页面,如标签管理器页面chrome://bookmarks、浏览历史记录页面chrome://history或新建Tab页面chrome://newtab。不过,一个Google Chrome扩展只能替换一个默认页面。 代码(注意,一个插件只能替代一个默认页,以下仅为演示): ``` <pre class="calibre10">``` <span class="token2">"chrome_url_overrides"</span><span class="token3">:</span> <span class="token3">{</span> <span class="token2">"newtab"</span><span class="token3">:</span> <span class="token2">"newtab.html"</span><span class="token3">,</span> <span class="token2">"history"</span><span class="token3">:</span> <span class="token2">"history.html"</span><span class="token3">,</span> <span class="token2">"bookmarks"</span><span class="token3">:</span> <span class="token2">"bookmarks.html"</span> <span class="token3">}</span> ``` ``` - 通过**chrome.tabs.create()** 或**window.open()** 打开的页面 出了上面几种可见的展示形式还有下面三种展示形式 - ## **[devtools 开发控制台](https://developer.chrome.com/extensions/devtools)** > 自定义一个和多个和`Elements`、`Console`、`Sources`等同级别的面板; > 自定义侧边栏(sidebar),目前只能自定义`Elements`面板的侧边栏; devtools页面的生命周期和devtools窗口是一致的(F12窗口关闭,页面也随着关闭)。devtools页面可以访问一组特有的`DevTools API`以及有限的扩展API,这组特有的`DevTools API`只有devtools页面才可以访问,background都无权访问,这些API包括: - `chrome.devtools.panels`:面板相关; - `chrome.devtools.inspectedWindow`:获取被审查窗口的有关信息; - `chrome.devtools.network`:获取有关网络请求的信息; 大部分扩展API都无法直接被`DevTools`页面调用,但它可以像`content-script`一样直接调用`chrome.extension`和`chrome.runtime`API,同时它也可以像`content-script`一样使用Message交互的方式与background页面进行通信。 ### **实例:创建一个devtools扩展** 首先,要针对开发者工具开发插件,需要在清单文件声明如下: ``` <pre class="calibre10">``` <span class="token3">{</span> <span class="token">// 只能指向一个HTML文件,不能是JS文件</span> <span class="token2">"devtools_page"</span><span class="token3">:</span> <span class="token2">"devtools.html"</span> <span class="token3">}</span> ``` ``` 这个`devtools.html`里面一般什么都没有,就引入一个js: ``` <pre class="calibre10">``` <span class="token1"><</span><span class="token1">!</span>DOCTYPE html<span class="token1">></span> <span class="token1"><</span>html<span class="token1">></span> <span class="token1"><</span>head<span class="token1">></span><span class="token1"><</span><span class="token1">/</span>head<span class="token1">></span> <span class="token1"><</span>body<span class="token1">></span> <span class="token1"><</span>script type<span class="token1">=</span><span class="token2">"text/javascript"</span> src<span class="token1">=</span><span class="token2">"js/devtools.js"</span><span class="token1">></span><span class="token1"><</span><span class="token1">/</span>script<span class="token1">></span> <span class="token1"><</span><span class="token1">/</span>body<span class="token1">></span> <span class="token1"><</span><span class="token1">/</span>html<span class="token1">></span> ``` ``` 可以看出来,其实真正代码是`devtools.js`,html文件是“多余”的,所以这里觉得有点坑,`devtools_page`干嘛不允许直接指定JS呢? 再来看devtools.js的代码: ``` <pre class="calibre10">``` <span class="token">// 创建自定义面板,同一个插件可以创建多个自定义面板</span> <span class="token">// 在`Panel.html`添加一个面板,几个参数依次为:panel标题、图标(其实设置了也没地方显示)、要加载的页面、加载成功后的回调</span> chrome<span class="token3">.</span>devtools<span class="token3">.</span>panels<span class="token3">.</span><span class="token4">create</span><span class="token3">(</span><span class="token2">'MyPanel'</span><span class="token3">,</span><span class="token2">'icons/3601643092096124127.PNG'</span><span class="token3">,</span><span class="token2">'theme/mypanel.html'</span><span class="token3">,</span> <span class="token5">function</span><span class="token3">(</span>panel<span class="token3">)</span> <span class="token3">{</span> console<span class="token3">.</span><span class="token4">log</span><span class="token3">(</span><span class="token2">'自定义面板创建成功!'</span><span class="token3">)</span><span class="token3">;</span> <span class="token">// 注意这个log一般看不到</span> <span class="token3">}</span><span class="token3">)</span><span class="token3">;</span> <span class="token">// 创建一个自定义侧边栏</span> chrome<span class="token3">.</span>devtools<span class="token3">.</span>panels<span class="token3">.</span>elements<span class="token3">.</span><span class="token4">createSidebarPane</span><span class="token3">(</span><span class="token2">"Images"</span><span class="token3">,</span> <span class="token5">function</span><span class="token3">(</span>sidebar<span class="token3">)</span> <span class="token3">{</span> <span class="token">// sidebar.setPage('../sidebar.html'); // 指定加载某个页面</span> sidebar<span class="token3">.</span><span class="token4">setExpression</span><span class="token3">(</span><span class="token2">'document.querySelectorAll("img")'</span><span class="token3">,</span> <span class="token2">'All Images'</span><span class="token3">)</span><span class="token3">;</span> <span class="token">// 通过表达式来指定</span> <span class="token">//sidebar.setObject({aaa: 111, bbb: 'Hello World!'}); // 直接设置显示某个对象</span> <span class="token3">}</span><span class="token3">)</span><span class="token3">;</span> ``` ``` mypanel.html ``` <pre class="calibre10">``` <span class="token1"><</span><span class="token1">!</span>DOCTYPE html<span class="token1">></span> <span class="token1"><</span>html<span class="token1">></span> <span class="token1"><</span>head<span class="token1">></span><span class="token1"><</span><span class="token1">/</span>head<span class="token1">></span> <span class="token1"><</span>body<span class="token1">></span> <span class="token1"><</span>div<span class="token1">></span>这是一个自定义面板<span class="token1"><</span><span class="token1">/</span>div<span class="token1">></span> <span class="token1"><</span><span class="token1">/</span>body<span class="token1">></span> <span class="token1"><</span><span class="token1">/</span>html<span class="token1">></span> ``` ``` setPage时的效果: ![](https://img.kancloud.cn/68/42/6842ddfd85acb9cc13c446061eed2f80_899x223.png) ![](https://img.kancloud.cn/7a/d0/7ad06902c05c01dad210b39a43bc7de8_1586x225.png) ## **更近一步** **mypanel.html** ``` <pre class="calibre10">``` <span class="token1"><</span><span class="token1">!</span>DOCTYPE html<span class="token1">></span> <span class="token1"><</span>html<span class="token1">></span> <span class="token1"><</span>head<span class="token1">></span> <span class="token1"><</span>title<span class="token1">></span>新标签页<span class="token1"><</span><span class="token1">/</span>title<span class="token1">></span> <span class="token1"><</span>meta http<span class="token1">-</span>equiv<span class="token1">=</span><span class="token2">"Content-Type"</span> content<span class="token1">=</span><span class="token2">"text/html; charset=utf-8"</span> <span class="token1">/</span><span class="token1">></span> <span class="token1"><</span>style<span class="token1">></span> html<span class="token3">,</span>body<span class="token3">{</span>height<span class="token3">:</span> <span class="token6">100</span><span class="token1">%</span><span class="token3">;</span><span class="token3">}</span> body<span class="token3">{</span>font<span class="token1">-</span>family<span class="token3">:</span> <span class="token2">'Microsoft Yahei'</span><span class="token3">;</span>margin<span class="token3">:</span><span class="token6">0</span><span class="token3">;</span>padding<span class="token3">:</span><span class="token6">0</span><span class="token3">;</span><span class="token3">}</span> <span class="token3">.</span>center <span class="token3">{</span> position<span class="token3">:</span> fixed<span class="token3">;</span> left<span class="token3">:</span> <span class="token6">0</span><span class="token3">;</span> top<span class="token3">:</span> <span class="token6">0</span><span class="token3">;</span> width<span class="token3">:</span> <span class="token6">100</span><span class="token1">%</span><span class="token3">;</span> height<span class="token3">:</span> <span class="token6">100</span><span class="token1">%</span><span class="token3">;</span> display<span class="token3">:</span> flex<span class="token3">;</span> align<span class="token1">-</span>items<span class="token3">:</span> center<span class="token3">;</span> justify<span class="token1">-</span>content<span class="token3">:</span> center<span class="token3">;</span> font<span class="token1">-</span>size<span class="token3">:</span> <span class="token6">40</span>px<span class="token3">;</span> color<span class="token3">:</span> #CCC<span class="token3">;</span> <span class="token3">}</span> <span class="token3">.</span>content <span class="token3">{</span> position<span class="token3">:</span> absolute<span class="token3">;</span> left<span class="token3">:</span> <span class="token6">20</span>px<span class="token3">;</span> top<span class="token3">:</span> <span class="token6">10</span>px<span class="token3">;</span> <span class="token3">}</span> <span class="token1"><</span><span class="token1">/</span>style<span class="token1">></span> <span class="token1"><</span><span class="token1">/</span>head<span class="token1">></span> <span class="token1"><</span>body<span class="token1">></span> <span class="token1"><</span>div class<span class="token1">=</span><span class="token2">"center"</span><span class="token1">></span><span class="token1"><</span>p<span class="token1">></span>这是一个自定义Chrome开发者工具页面<span class="token1"><</span><span class="token1">/</span>p<span class="token1">></span><span class="token1"><</span><span class="token1">/</span>div<span class="token1">></span> <span class="token1"><</span>div class<span class="token1">=</span><span class="token2">"content"</span><span class="token1">></span> <span class="token1"><</span>div<span class="token1">></span><span class="token1"><</span>a href<span class="token1">=</span><span class="token2">"javascript:;"</span> id<span class="token1">=</span><span class="token2">"check_jquery"</span><span class="token1">></span>检测当前页面jQuery<span class="token1"><</span><span class="token1">/</span>a<span class="token1">></span><span class="token1"><</span><span class="token1">/</span>div<span class="token1">></span> <span class="token1"><</span>div<span class="token1">></span><span class="token1"><</span>a href<span class="token1">=</span><span class="token2">"javascript:;"</span> id<span class="token1">=</span><span class="token2">"open_resource"</span><span class="token1">></span>查看当前页面HTML代码的第<span class="token6">20</span>行<span class="token1"><</span><span class="token1">/</span>a<span class="token1">></span><span class="token1"><</span><span class="token1">/</span>div<span class="token1">></span> <span class="token1"><</span>div<span class="token1">></span><span class="token1"><</span>a href<span class="token1">=</span><span class="token2">"javascript:;"</span> id<span class="token1">=</span><span class="token2">"test_inspect"</span><span class="token1">></span>审查当前页面第一张图片<span class="token1"><</span><span class="token1">/</span>a<span class="token1">></span><span class="token1"><</span><span class="token1">/</span>div<span class="token1">></span> <span class="token1"><</span>div<span class="token1">></span><span class="token1"><</span>a href<span class="token1">=</span><span class="token2">"javascript:;"</span> id<span class="token1">=</span><span class="token2">"get_all_resources"</span><span class="token1">></span>获取当前页面所有Resources<span class="token1"><</span><span class="token1">/</span>a<span class="token1">></span><span class="token1"><</span><span class="token1">/</span>div<span class="token1">></span> <span class="token1"><</span><span class="token1">/</span>div<span class="token1">></span> <span class="token1"><</span>script type<span class="token1">=</span><span class="token2">"text/javascript"</span> src<span class="token1">=</span><span class="token2">"js/mypanel.js"</span><span class="token1">></span><span class="token1"><</span><span class="token1">/</span>script<span class="token1">></span> <span class="token1"><</span><span class="token1">/</span>body<span class="token1">></span> <span class="token1"><</span><span class="token1">/</span>html<span class="token1">></span> ``` ``` **mypanel.js** ``` <pre class="calibre10">``` <span class="token">// 检测jQuery</span> document<span class="token3">.</span><span class="token4">getElementById</span><span class="token3">(</span><span class="token2">'check_jquery'</span><span class="token3">)</span><span class="token3">.</span><span class="token4">addEventListener</span><span class="token3">(</span><span class="token2">'click'</span><span class="token3">,</span> <span class="token5">function</span><span class="token3">(</span><span class="token3">)</span> <span class="token3">{</span> <span class="token">// 访问被检查的页面DOM需要使用inspectedWindow</span> <span class="token">// 简单例子:检测被检查页面是否使用了jQuery</span> chrome<span class="token3">.</span>devtools<span class="token3">.</span>inspectedWindow<span class="token3">.</span><span class="token4">eval</span><span class="token3">(</span><span class="token2">"jQuery.fn.jquery"</span><span class="token3">,</span> <span class="token5">function</span><span class="token3">(</span>result<span class="token3">,</span> isException<span class="token3">)</span> <span class="token3">{</span> var html <span class="token1">=</span> <span class="token2">''</span><span class="token3">;</span> <span class="token5">if</span> <span class="token3">(</span>isException<span class="token3">)</span> html <span class="token1">=</span> <span class="token2">'当前页面没有使用jQuery。'</span><span class="token3">;</span> <span class="token5">else</span> html <span class="token1">=</span> <span class="token2">'当前页面使用了jQuery,版本为:'</span><span class="token1">+</span>result<span class="token3">;</span> <span class="token4">alert</span><span class="token3">(</span>html<span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span><span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span><span class="token3">)</span><span class="token3">;</span> <span class="token">// 打开某个资源</span> document<span class="token3">.</span><span class="token4">getElementById</span><span class="token3">(</span><span class="token2">'open_resource'</span><span class="token3">)</span><span class="token3">.</span><span class="token4">addEventListener</span><span class="token3">(</span><span class="token2">'click'</span><span class="token3">,</span> <span class="token5">function</span><span class="token3">(</span><span class="token3">)</span> <span class="token3">{</span> chrome<span class="token3">.</span>devtools<span class="token3">.</span>inspectedWindow<span class="token3">.</span><span class="token4">eval</span><span class="token3">(</span><span class="token2">"window.location.href"</span><span class="token3">,</span> <span class="token5">function</span><span class="token3">(</span>result<span class="token3">,</span> isException<span class="token3">)</span> <span class="token3">{</span> chrome<span class="token3">.</span>devtools<span class="token3">.</span>panels<span class="token3">.</span><span class="token4">openResource</span><span class="token3">(</span>result<span class="token3">,</span> <span class="token6">20</span><span class="token3">,</span> <span class="token5">function</span><span class="token3">(</span><span class="token3">)</span> <span class="token3">{</span> console<span class="token3">.</span><span class="token4">log</span><span class="token3">(</span><span class="token2">'资源打开成功!'</span><span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span><span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span><span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span><span class="token3">)</span><span class="token3">;</span> <span class="token">// 审查元素</span> document<span class="token3">.</span><span class="token4">getElementById</span><span class="token3">(</span><span class="token2">'test_inspect'</span><span class="token3">)</span><span class="token3">.</span><span class="token4">addEventListener</span><span class="token3">(</span><span class="token2">'click'</span><span class="token3">,</span> <span class="token5">function</span><span class="token3">(</span><span class="token3">)</span> <span class="token3">{</span> chrome<span class="token3">.</span>devtools<span class="token3">.</span>inspectedWindow<span class="token3">.</span><span class="token4">eval</span><span class="token3">(</span><span class="token2">"inspect(document.images[0])"</span><span class="token3">,</span> <span class="token5">function</span><span class="token3">(</span>result<span class="token3">,</span> isException<span class="token3">)</span><span class="token3">{</span><span class="token3">}</span><span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span><span class="token3">)</span><span class="token3">;</span> <span class="token">// 获取所有资源</span> document<span class="token3">.</span><span class="token4">getElementById</span><span class="token3">(</span><span class="token2">'get_all_resources'</span><span class="token3">)</span><span class="token3">.</span><span class="token4">addEventListener</span><span class="token3">(</span><span class="token2">'click'</span><span class="token3">,</span> <span class="token5">function</span><span class="token3">(</span><span class="token3">)</span> <span class="token3">{</span> chrome<span class="token3">.</span>devtools<span class="token3">.</span>inspectedWindow<span class="token3">.</span><span class="token4">getResources</span><span class="token3">(</span><span class="token5">function</span><span class="token3">(</span>resources<span class="token3">)</span> <span class="token3">{</span> <span class="token4">alert</span><span class="token3">(</span>JSON<span class="token3">.</span><span class="token4">stringify</span><span class="token3">(</span>resources<span class="token3">)</span><span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span><span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span><span class="token3">)</span><span class="token3">;</span> ``` ``` ![](https://img.kancloud.cn/89/0e/890e144002dcfcfb4a2ef43f57deb5ca_244x129.png) ### 调试技巧 修改了devtools页面的代码时,需要先在[chrome://extensions](chrome://extensions/)页面按下`Ctrl+R`重新加载插件,然后关闭再打开开发者工具即可,无需刷新页面(而且只刷新页面不刷新开发者工具的话是不会生效的)。 由于devtools本身就是开发者工具页面,所以几乎没有方法可以直接调试它,直接用`chrome-extension://extid/devtools.html"`的方式打开页面肯定报错,因为不支持相关特殊API,只能先自己写一些方法屏蔽这些错误,调试通了再放开。 - ## **omnibox** `omnibox`是向用户提供搜索建议的一种方式 首先,配置文件如下: ``` <pre class="calibre10">``` <span class="token3">{</span> <span class="token">// 向地址栏注册一个关键字以提供搜索建议,只能设置一个关键字</span> <span class="token2">"omnibox"</span><span class="token3">:</span> <span class="token3">{</span> <span class="token2">"keyword"</span> <span class="token3">:</span> <span class="token2">"go"</span> <span class="token3">}</span><span class="token3">,</span> <span class="token3">}</span> ``` ``` 然后`background.js`中注册监听事件: ``` <pre class="calibre10">``` <span class="token">// omnibox 演示</span> chrome<span class="token3">.</span>omnibox<span class="token3">.</span>onInputChanged<span class="token3">.</span><span class="token4">addListener</span><span class="token3">(</span><span class="token3">(</span>text<span class="token3">,</span> suggest<span class="token3">)</span> <span class="token1">=</span><span class="token1">></span> <span class="token3">{</span> console<span class="token3">.</span><span class="token4">log</span><span class="token3">(</span><span class="token2">'inputChanged: '</span> <span class="token1">+</span> text<span class="token3">)</span><span class="token3">;</span> <span class="token5">if</span><span class="token3">(</span><span class="token1">!</span>text<span class="token3">)</span> <span class="token5">return</span><span class="token3">;</span> <span class="token5">if</span><span class="token3">(</span>text <span class="token1">==</span> <span class="token2">'美女'</span><span class="token3">)</span> <span class="token3">{</span> <span class="token4">suggest</span><span class="token3">(</span><span class="token3">[</span> <span class="token3">{</span>content<span class="token3">:</span> <span class="token2">'中国'</span> <span class="token1">+</span> text<span class="token3">,</span> description<span class="token3">:</span> <span class="token2">'你要找“中国美女”吗?'</span><span class="token3">}</span><span class="token3">,</span> <span class="token3">{</span>content<span class="token3">:</span> <span class="token2">'日本'</span> <span class="token1">+</span> text<span class="token3">,</span> description<span class="token3">:</span> <span class="token2">'你要找“日本美女”吗?'</span><span class="token3">}</span><span class="token3">,</span> <span class="token3">{</span>content<span class="token3">:</span> <span class="token2">'泰国'</span> <span class="token1">+</span> text<span class="token3">,</span> description<span class="token3">:</span> <span class="token2">'你要找“泰国美女或人妖”吗?'</span><span class="token3">}</span><span class="token3">,</span> <span class="token3">{</span>content<span class="token3">:</span> <span class="token2">'韩国'</span> <span class="token1">+</span> text<span class="token3">,</span> description<span class="token3">:</span> <span class="token2">'你要找“韩国美女”吗?'</span><span class="token3">}</span> <span class="token3">]</span><span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span> <span class="token5">else</span> <span class="token5">if</span><span class="token3">(</span>text <span class="token1">==</span> <span class="token2">'微博'</span><span class="token3">)</span> <span class="token3">{</span> <span class="token4">suggest</span><span class="token3">(</span><span class="token3">[</span> <span class="token3">{</span>content<span class="token3">:</span> <span class="token2">'新浪'</span> <span class="token1">+</span> text<span class="token3">,</span> description<span class="token3">:</span> <span class="token2">'新浪'</span> <span class="token1">+</span> text<span class="token3">}</span><span class="token3">,</span> <span class="token3">{</span>content<span class="token3">:</span> <span class="token2">'腾讯'</span> <span class="token1">+</span> text<span class="token3">,</span> description<span class="token3">:</span> <span class="token2">'腾讯'</span> <span class="token1">+</span> text<span class="token3">}</span><span class="token3">,</span> <span class="token3">{</span>content<span class="token3">:</span> <span class="token2">'搜狐'</span> <span class="token1">+</span> text<span class="token3">,</span> description<span class="token3">:</span> <span class="token2">'搜索'</span> <span class="token1">+</span> text<span class="token3">}</span><span class="token3">,</span> <span class="token3">]</span><span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span> <span class="token5">else</span> <span class="token3">{</span> <span class="token4">suggest</span><span class="token3">(</span><span class="token3">[</span> <span class="token3">{</span>content<span class="token3">:</span> <span class="token2">'百度搜索 '</span> <span class="token1">+</span> text<span class="token3">,</span> description<span class="token3">:</span> <span class="token2">'百度搜索 '</span> <span class="token1">+</span> text<span class="token3">}</span><span class="token3">,</span> <span class="token3">{</span>content<span class="token3">:</span> <span class="token2">'谷歌搜索 '</span> <span class="token1">+</span> text<span class="token3">,</span> description<span class="token3">:</span> <span class="token2">'谷歌搜索 '</span> <span class="token1">+</span> text<span class="token3">}</span><span class="token3">,</span> <span class="token3">]</span><span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span> <span class="token3">}</span><span class="token3">)</span><span class="token3">;</span> <span class="token">// 当用户接收关键字建议时触发</span> chrome<span class="token3">.</span>omnibox<span class="token3">.</span>onInputEntered<span class="token3">.</span><span class="token4">addListener</span><span class="token3">(</span><span class="token3">(</span>text<span class="token3">)</span> <span class="token1">=</span><span class="token1">></span> <span class="token3">{</span> console<span class="token3">.</span><span class="token4">log</span><span class="token3">(</span><span class="token2">'inputEntered: '</span> <span class="token1">+</span> text<span class="token3">)</span><span class="token3">;</span> <span class="token5">if</span><span class="token3">(</span><span class="token1">!</span>text<span class="token3">)</span> <span class="token5">return</span><span class="token3">;</span> var href <span class="token1">=</span> <span class="token2">''</span><span class="token3">;</span> <span class="token5">if</span><span class="token3">(</span>text<span class="token3">.</span><span class="token4">endsWith</span><span class="token3">(</span><span class="token2">'美女'</span><span class="token3">)</span><span class="token3">)</span> href <span class="token1">=</span> <span class="token2">'http://image.baidu.com/search/index?tn=baiduimage&ie=utf-8&word='</span> <span class="token1">+</span> text<span class="token3">;</span> <span class="token5">else</span> <span class="token5">if</span><span class="token3">(</span>text<span class="token3">.</span><span class="token4">startsWith</span><span class="token3">(</span><span class="token2">'百度搜索'</span><span class="token3">)</span><span class="token3">)</span> href <span class="token1">=</span> <span class="token2">'https://www.baidu.com/s?ie=UTF-8&wd='</span> <span class="token1">+</span> text<span class="token3">.</span><span class="token4">replace</span><span class="token3">(</span><span class="token2">'百度搜索 '</span><span class="token3">,</span> <span class="token2">''</span><span class="token3">)</span><span class="token3">;</span> <span class="token5">else</span> <span class="token5">if</span><span class="token3">(</span>text<span class="token3">.</span><span class="token4">startsWith</span><span class="token3">(</span><span class="token2">'谷歌搜索'</span><span class="token3">)</span><span class="token3">)</span> href <span class="token1">=</span> <span class="token2">'https://www.google.com.tw/search?q='</span> <span class="token1">+</span> text<span class="token3">.</span><span class="token4">replace</span><span class="token3">(</span><span class="token2">'谷歌搜索 '</span><span class="token3">,</span> <span class="token2">''</span><span class="token3">)</span><span class="token3">;</span> <span class="token5">else</span> href <span class="token1">=</span> <span class="token2">'https://www.baidu.com/s?ie=UTF-8&wd='</span> <span class="token1">+</span> text<span class="token3">;</span> <span class="token4">openUrlCurrentTab</span><span class="token3">(</span>href<span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span><span class="token3">)</span><span class="token3">;</span> <span class="token">// 获取当前选项卡ID</span> <span class="token5">function</span> <span class="token4">getCurrentTabId</span><span class="token3">(</span>callback<span class="token3">)</span> <span class="token3">{</span> chrome<span class="token3">.</span>tabs<span class="token3">.</span><span class="token4">query</span><span class="token3">(</span><span class="token3">{</span>active<span class="token3">:</span> <span class="token6">true</span><span class="token3">,</span> currentWindow<span class="token3">:</span> <span class="token6">true</span><span class="token3">}</span><span class="token3">,</span> <span class="token5">function</span><span class="token3">(</span>tabs<span class="token3">)</span> <span class="token3">{</span> <span class="token5">if</span><span class="token3">(</span>callback<span class="token3">)</span> <span class="token4">callback</span><span class="token3">(</span>tabs<span class="token3">.</span>length <span class="token1">?</span> tabs<span class="token3">[</span><span class="token6">0</span><span class="token3">]</span><span class="token3">.</span>id<span class="token3">:</span> <span class="token5">null</span><span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span><span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span> <span class="token">// 当前标签打开某个链接</span> <span class="token5">function</span> <span class="token4">openUrlCurrentTab</span><span class="token3">(</span>url<span class="token3">)</span> <span class="token3">{</span> <span class="token4">getCurrentTabId</span><span class="token3">(</span>tabId <span class="token1">=</span><span class="token1">></span> <span class="token3">{</span> chrome<span class="token3">.</span>tabs<span class="token3">.</span><span class="token4">update</span><span class="token3">(</span>tabId<span class="token3">,</span> <span class="token3">{</span>url<span class="token3">:</span> url<span class="token3">}</span><span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span><span class="token3">)</span> <span class="token3">}</span> ``` ``` ![](https://img.kancloud.cn/e4/1d/e41dbc92e72aae64b2094174e267aebf_463x350.gif) - ## **notification** Chrome提供了一个`chrome.notifications`API以便插件推送桌面通知,暂未找到`chrome.notifications`和HTML5自带的`Notification`的显著区别及优势。 在后台JS中,无论是使用`chrome.notifications`还是`Notification`都不需要申请权限(HTML5方式需要申请权限),直接使用即可。 代码: ``` <pre class="calibre17">``` chrome<span class="token3">.</span>notifications<span class="token3">.</span><span class="token4">create</span><span class="token3">(</span><span class="token5">null</span><span class="token3">,</span> <span class="token3">{</span> type<span class="token3">:</span> <span class="token2">'basic'</span><span class="token3">,</span> iconUrl<span class="token3">:</span> <span class="token2">'img/icon.png'</span><span class="token3">,</span> title<span class="token3">:</span> <span class="token2">'这是标题'</span><span class="token3">,</span> message<span class="token3">:</span> <span class="token2">'您刚才点击了自定义右键菜单!'</span> <span class="token3">}</span><span class="token3">)</span><span class="token3">;</span> ``` ```