这是因为content-script有一个很大的“缺陷”,也就是无法访问页面中的JS,虽然它可以操作DOM,但是DOM却不能调用它,也就是无法在DOM中通过绑定事件的方式调用content-script中的代码(包括直接写onclick和addEventListener2种方式都不行),但是,“在页面上添加一个按钮并调用插件的扩展API”是一个很常见的需求,那该怎么办呢?其实这就是本小节要讲的。
在content-script中通过DOM方式向页面注入inject-script代码示例:
(jsPath) { jsPath temp .)..() ..head.appendChild(temp); }
你以为这样就行了?执行一下你会看到如下报错:
Denying load of chrome-extension://efbllncjkjiijkppagepehoekjojdclc/js/inject.js. Resources must be listed in the web_accessible_resources manifest key in order to be loaded by pages outside the extension.意思就是你想要在web中直接访问插件中的资源的话必须显示声明才行,配置文件中增加如下:
["js/inject.js"], }
至于inject-script如何调用content-script中的代码,后面我会在专门的一个消息通信章节详细介绍。
homepage_url开发者或者插件主页设置,一般会在如下2个地方显示:
Chrome插件的8种展示形式 browserAction(浏览器右上角)通过配置browser_action可以在浏览器的右上角增加一个图标,一个browser_action可以拥有一个图标,一个tooltip,一个badge和一个popup。
示例配置如下:
图标browser_action图标推荐使用宽高都为19像素的图片,更大的图标会被缩小,格式随意,一般推荐png,可以通过manifest中default_icon字段配置,也可以调用setIcon()方法。
tooltip修改browser_action的manifest中default_title字段,或者调用setTitle()方法。
badge所谓badge就是在图标上显示一些文本,可以用来更新一些小的扩展状态提示信息。因为badge空间有限,所以只支持4个以下的字符(英文4个,中文2个)。badge无法通过配置文件来指定,必须通过代码实现,设置badge文字和颜色可以分别使用setBadgeText()和setBadgeBackgroundColor()。
)[]});
效果:
pageAction(地址栏右侧)所谓pageAction,指的是只有当某些特定页面打开才显示的图标,它和browserAction最大的区别是一个始终都显示,一个只在特定情况才显示。
需要特别说明的是早些版本的Chrome是将pageAction放在地址栏的最右边,左键单击弹出popup,右键单击则弹出相关默认的选项菜单:
而新版的Chrome更改了这一策略,pageAction和普通的browserAction一样也是放在浏览器右上角,只不过没有点亮时是灰色的,点亮了才是彩色的,灰色时无论左键还是右键单击都是弹出选项:
具体是从哪一版本开始改的没去仔细考究,反正知道v50.0的时候还是前者,v58.0的时候已改为后者。
调整之后的pageAction我们可以简单地把它看成是可以置灰的browserAction。
示例(只有打开百度才显示图标):
["declarativeContent"] .(){ chrome.declarativeContent.onPageChanged.addRules([ [ .) ][new chrome.declarativeContent.ShowPageAction()] } ]));
效果图:
右键菜单通过开发Chrome插件可以自定义浏览器的右键菜单,主要是通过chrome.contextMenusAPI实现,右键菜单可以出现在不同的上下文,比如普通页面、选中的文字、图片、链接,等等,如果有同一个插件里面定义了多个菜单,Chrome会自动组合放到以插件名字命名的二级菜单里,如下:
最简单的右键菜单示例[.());
效果:
添加右键百度搜索[.[(params) .();
效果如下:
语法说明这里只是简单列举一些常用的,完整API参见:https://developer.chrome.com/extensions/contextMenus
, [()).contextMenus.remove(menuItemId); .contextMenus.update(menuItemId, updateProperties);
override(覆盖特定页面)使用override页可以将Chrome默认的一些特定页面替换掉,改为使用扩展提供的页面。
扩展可以替代如下页面:
注意:
下面的截图是默认的新标签页和被扩展替换掉的新标签页。
代码(注意,一个插件只能替代一个默认页,以下仅为演示):
devtools(开发者工具) 预热使用过vue的应该见过这种类型的插件: