Chrome扩展开发,页面栏位自动填值
参考文档:http://www.cnblogs.com/ligerleng/p/gmail_assist_2.html
http://open.chrome.360.cn/extension_dev/overview.html
一、Chrome扩展中脚本类型:
1、injected ,即通过动态方法将脚本注入到网页中,最常见的方法是通过content script 注入脚本。
需要注意:必须在manifest中的 web_accessible_resources字段中声明所需注入文件。
var s = document.createElement('script'); s.src = chrome.extension.getURL('tableInited.js'); s.onload = function() { this.parentNode.removeChild(this); }; (document.head || document.documentElement).appendChild(s);
"web_accessible_resources" : [ "oauth2/oauth2.html", "js/tableInited.js", "css/style.css", "js/table_sort_script.js", "images/sort.gif", ]
2、content script,与injected script类似,也是被注入到页面中的,区别于,它是运行在专门为它们准备的隔离环境中,只能访问和操作页面DOM,无法访问页面js代码。在mainfest中的 content_scripts字段中声明。
3、popup,用户点击扩展图标时,都可以设置弹出一个popup页面,页面中可以有运行的脚本。这类脚本与(background),都称为"完全属于扩展程序的脚本",不仅可以访问原始JS API,还可以访问chrome为扩展程序提供的专门API(即chrome.*)。
4、background,跑在后台页面中的脚本,运行在浏览器后台,与当前浏览页面无关。
后台脚本还分为运行于后台页面(background page)和 事件页面(event page)。后台页面持续运行,生命周期从打开浏览器到关闭浏览器。事件页面只在需要时处于活动状态,这两类通过persistent区别。
"background": { "scripts": ["background.js"], "persistent": false },
二、这几类脚本之间的通信
1、content script 和 完全属于扩展程序脚本之间的通信
接受端的处理方式一致(content script 可以调用chrome.runtime.* API)
chrome.runtime.onMessage.addListener( function(request, sender, sendResponse) { console.log(sender.tab ? "from a content script:" + sender.tab.url : "from the extension"); if (request.greeting == "hello") sendResponse({farewell: "goodbye"}); });
从content script向扩展程序脚本发送消息:
chrome.runtime.sendMessage({greeting: "hello"}, function(response) {
console.log(response.farewell);
});
扩展程序脚本向content script发送消息:
chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
chrome.tabs.sendMessage(tabs[0].id, {greeting: "hello"}, function(response) {
console.log(response.farewell);
});
});//和上面的区别是,这种消息发送的方向,需要你指明你信息要发到哪个页面(用户浏览的页面)中,也就是哪个tab中(chrome中每个页面都在一个tab,即标签中打开嘛)的content script;但显然上面那种就不需要,而且在接收端也不需要。
2、injected script 和 content script 之间的通信
可通过window.addEventListener和window.postMessage来实现,原理为:二者之间唯一共享的就是页面DOM元素,window就是页面元素,可以用来传递消息。
// injected script 中 if(email_data) { window.postMessage({"usrik": JSON.stringify(userik) }, '*');//userik就从GLOBALS中取得 } // content script 中 window.addEventListener("message", function(event) { if(event.data.usrik) { usrik = event.data.usrik console.log(usrik); } }, false);
三、页面自动填值,扩展源代码
mainfest.json
{ "manifest_version": 2, "name": "联合开户_资料登记", "version": "5.0", "description": "联合开户,资料登记页面自动填值", "browser_action": { "default_title": "自动填值", "default_popup": "popup.html" }, "web_accessible_resources" : [ "js/fxcp_load.js" ], "content_scripts": [ { "matches": ["https://*/accept/apply/jzkh/20000/new*"], "js": ["js/jquery-1.8.0.min.js","js/jzkh_zldj.js"] } ] }
jzkh_zldj.js
(function(){ // 通过content_script 注入脚本 var s = document.createElement('script'); s.src = chrome.extension.getURL('js/fxcp_load.js'); s.onload = function() { this.parentNode.removeChild(this); }; (document.head || document.documentElement).appendChild(s); })(); chrome.runtime.onMessage.addListener(function(message, sender, sendResponse){ sendResponse(message + " handle OK"); if(message == 'zldj'){ var str = '{"zjqsrq":"20140601"}'; var reqData = JSON.parse(str); for(var name in reqData){ var $item = $("input[name='"+name+"']"); $item && $item.val(reqData[name]);} }else if(message == "fxcp"){ window.postMessage({"command":"fxcp"}, "*"); } });
popup.html
<html> <head> <style> * { margin: 0; padding: 0; } body { width: 200px; height: 100px; } </style> </head> <body> <div> <input type="button" id="btnzldj" value="zldj" /> <br/> <input type="button" id="btnfxcp" value="fxcp" /> <div id="test">...</div> </div> <script src="js/jquery-1.8.0.min.js"></script> <script src="js/menu.js"></script> </body> </html>
menu.js
$("#btnzldj").click(function(){
$("#test").text("btnzldj send");
chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
chrome.tabs.sendMessage(tabs[0].id, "zldj", function(response) {
$("#test").text(response);
});
});
});
$("#btnfxcp").click(function(){
$("#test").text("btnfxcp send");
chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
chrome.tabs.sendMessage(tabs[0].id, "fxcp", function(response) {
$("#test").text(response);
});
});
});
fxcp_load.js
window.addEventListener("message", function(event){
if(event.data.command == "fxcp"){
if(jzkh.req_data.khlb == "0"){
dcwjjj_common.selectOldAnswer("280&2|281&1");
}else{
dcwjjj_common.selectOldAnswer("400&2|401&2");
}
}
});
浙公网安备 33010602011771号