本文将介绍一些chrome插件的基础内容,但是也省略了一些基础的内容。并不面向新手开发者。文中将会对content-js
,inject-js
,popup
,background
做一些粗略的介绍,尤其是对它们之间的通信方面。
核心介绍
manifest.json
首先是manifest.json
,这是一个Chrome插件最重要也是必不可少的文件,用来配置所有和插件相关的配置,必须放在根目录。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
| { "manifest_version": 2, "name": "demo", "version": "1.0.0", "description": "简单的Chrome扩展demo", "icons": { "16": "img/icon.png", "48": "img/icon.png", "128": "img/icon.png" }, "background": { "page": "background.html" }, "browser_action": { "default_icon": "img/icon.png", "default_title": "这是一个示例Chrome插件", "default_popup": "popup.html" }, "content_scripts": [ { "matches": ["<all_urls>"], "js": ["js/jquery-1.8.3.js", "js/content-script.js"], "css": ["css/custom.css"], "run_at": "document_start" }, { "matches": ["*://*/*.png"], "js": ["js/show-image-content-size.js"] } ], "web_accessible_resources": ["js/inject.js"], "permissions": [ "contextMenus", "tabs", "notifications", "webRequest", "webRequestBlocking", "storage", "http://*/*", "https://*/*" ], }
|
四个核心内容
本文给出的四个核心内容为:content-js
,inject-js
,popup
,background
。下面将会做一些个人的理解介绍。
popup
是点击插件后,弹出来的小页面,当点击那个小按钮的时候,popup.html
将会调用。同时包含在popup.html
中的js文件也会被运行。popup.html无法直接写js脚本,必须通过包含的方式来写。
content-js
content-js
是Chrome插件中向页面注入脚本的一种形式,会根据配置文件中指定的时间加载。
content_scripts
中的脚本只是共享页面的DOM,而并不共享页面内嵌JavaScript的命名空间。也就是说,如果当前页面中的JavaScript有一个全局变量a
,content_scripts
中注入的脚本也可以有一个全局变量a
,两者不会相互干扰。当然你也无法通过content_scripts
访问到页面本身内嵌JavaScript的变量和函数。(http://www.ituring.com.cn/book/miniarticle/60212)
inject-js
inject-js
与原生页面的js没有差别,因为inject-js
就是将js代码注入到正在执行的Web页面中。它的实现方式是:先写一个js的文件,然后在content-js
通过如下的类似代码,将写好的js文件注入到网页中。
1 2 3 4 5 6
| var s = document.createElement('script');
s.src = chrome.extension.getURL('inject.js'); (document.head || document.body).appendChild(s); # 同时你要注入的inject.js需要在manifest中的web_accessible_resources字段里进行声明,看上面的配置文件
|
关于上面提到的content-js
和inject-js
的区别和联系,inject-js
在content-js
中进行注入。inject-js
都可以获取web页面中的js的变量内容,而content-js
不可以。
background
background
是在页面打开后就一直运行的文件,可以理解为插件和页面的枢纽。
通信
关于这些组件的通信有四种:
content-js
与inject-js
的通信
background
与content-js
的通信
background
与popup.js
的通信
popup
与content-js
的通信
四种通信方式的整体思想一致。接收方使用监听函数,发送发使用发送函数。
content-js 与 inject-js
demo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| f = document.getElementById('sb_form_go'); f.onclick = function(){
var message = document.getElementById('sb_form_q'); window.postMessage({'message':message.value}, '*'); return false; }
function injectCustomJs(jsPath) { console.log('@@@@@@@@'); jsPath = jsPath || 'js/inject.js'; var temp = document.createElement('script'); temp.setAttribute('type', 'text/javascript'); temp.src = chrome.extension.getURL(jsPath); document.body.append(temp); } console.log('11111111111111111111');
window.addEventListener("message", function(e) { console.log(e.data); }, false);
injectCustomJs()
|
others
另外的三种通信模式如下:
同时在这三种接收方式中使用的监听函数相同
1 2 3 4 5 6 7
| chrome.extension.onMessage.addListener(function(message,sender,callback){ console.log(message); callback('执行成功'); });
|
然后就是发送函数,对于发送函数可以分为两种,一种是向插件中的组件发送内容,另一种是向web页面发送内容。向web页面发送内容,实质就是发送到content-js
中。这两种发送的函数不同,分别为:chrome.runtime.sendMessag
,chrome.tabs.sendMessage
1 2 3 4 5 6 7 8 9 10 11
| chrome.tabs.query({active: true, currentWindow: true}, function(tabs) { chrome.tabs.sendMessage(tabs[0].id, message, function(response) { if(callback) callback(response); }); });
chrome.runtime.sendMessage({greeting: '你好,我是content-script呀,我主动发消息给后台!'}, function(response) { console.log('收到来自后台的回复:' + response); });
|
下面给出一个demo