0%
这是一片思考的空间 -- arthinking
Spring 重构&代码整洁之道 软件设计 JVM 并发编程 数据结构与算法 分布式 存储 网络 微服务 设计模式
Java技术栈 - 涉及Java技术体系

Chrome插件开发实例 - 开关灯(browser action)

这里通过一个网页开关灯的例子来演示browser action,除了browser action之外,还会涉及到其他很多的chrome api或者manifest.json配置项。

20130614000050

这个文件包含的文件如下:

background.html

背景页,一个单独的长时间运行的脚本,是一个运行在扩展程序中的html页面。在应用的整个生命周期都存在,在同一个时间只有一个实例处于活动状态。

background.js

背景页的JS,一般不需要上面的background.html也可以,manifest.json中按照如下配置就可以了:

"background": {
"scripts": ["background.js"]
}

func.js

一个需要注入到页面中的 content script

icon.png

应用的图标 19px * 19px

jquery-2.0.2.js

需要注入页面中使用的jquery库

manifest.json

应用的配置文件

popup.html

点击浏览器工具栏时,应用的弹窗页面

popup.js

弹窗页面对应的JS文件,在popup.html中引入。

下面就逐个文件说明:

manifest.json

{
"manifest_version": 2,
"name": "pv show",
"description": "MSG_ext_desc",
"version": "2",
"default_locale": "en",
"icons": {
"48": "images/icon_16.png",
"48": "images/icon.png",
"128": "images/icon_128.png"
},
"permissions": [
"tabs",
"http:///",
"https:///",
"notifications"
],
"browser_action": {
"default_icon": "images/icon.png",
"default_popup": "options.html",
"default_title": "网页流量统计"
},
"background": {
"scripts": ["background.js"]
}
}

popup.html

开关灯
关灯
开灯

popup.js

/*
*

  • 这个JS文件表示对popup.html文档的操作
  • 比如直接在这里写的document也是代表了popup.html的文档流
    */

// 这里的document代表了popup.html的文档流,所以也是注册这个页面中的dom事件
document.addEventListener('DOMContentLoaded', function(){
var divs = document.querySelectorAll('div');
var obj = {"name":"root", "password":"123"};
for(var i=0; i<divs.length; i++){
divs[i].addEventListener('click', function(e){
// var jsonText = JSON.stringify(e); // 转换报错
// console.log(jsonText);
// chrome.tabs.executeScript(null,
// {code:"switchLight('"+ obj +"');", allFrames: true}); // 这里如果传递一个e事件对象的话,会自动转换为字符串字面值,导致对象变成了字符串
// 向页面注入JavaScript 脚本执行,由于这里调用的是一个JS方法switchLight(),该方法在func.js文件中,所以可以在background.js中把该JS(content script)注入到web页面中。
chrome.tabs.executeScript(null,
{code:"switchLight('"+ e.target.id +"');", allFrames: true});
// console.log("send");
// chrome.extension.sendRequest(e); // 发送请求方法可以传递JSON对象,但是这里chrome把e事件对象转换为JSON字符串时会报错:Uncaught TypeError: Converting circular structure to JSON
});
}
});

func.js

// 一个简单的方法直接设置document.body的背景颜色,即开关灯效果
// 由于这个content script是注入到web页面中的,所以这里的document也就是代表web页面中的文档
function switchLight(lightAction){
console.log(lightAction);
if(lightAction == 'off'){
document.body.style.backgroundColor='#000';
} else {
document.body.style.backgroundColor='#fff';
}
}

background.html

背景页,应用的整个生命周期都存在,这个页面只是简单的引用了background.js文件,不用也可以,见上面的说明。

bakcground.js

/**

  • 注册标签页更新时的事件
  • 这里调用了initialize()事件,把func.js注入当前标签页中
    */
    chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
    initialize(tabId);
    });

/**

  • 注册切换标签页时的事件
  • 这里调用了initialize()事件,把func.js注入当前标签页中
    */
    chrome.tabs.onSelectionChanged.addListener(function(tabId, selectInfo) {
    initialize(tabId);
    });

/**

  • 初始化方法 ,注入func.js事件
  • @param {Object} tabId
    */
    function initialize(tabId){
    chrome.tabs.executeScript(tabId, {file: "func.js", allFrames: true});
    chrome.tabs.executeScript(tabId, {file: "jquery-2.0.2.js", allFrames: true});
    }

/**

  • 启动一个chrome.extension.onRequest事件监听器用来处理消息
    */
    chrome.extension.onRequest.addListener(
    function(request, sender, sendResponse) {
    chrome.tabs.executeScript(null, {code: "switchLight("+ request +");", allFrames: true});
    });

源代码稍后补充...

欢迎关注我的其它发布渠道

订阅IT宅
内功修炼
Java技术栈
Java架构杂谈是IT宅精品文章公众号,欢迎订阅:
📄 网络基础知识:两万字长文50+张趣图带你领悟网络编程的内功心法 📄 HTTP发展史:三万长文50+趣图带你领悟web编程的内功心法 📄 HTTP/1.1:可扩展,可靠性,请求应答,无状态,明文传输 📄 HTTP/1.1报文详解:Method,URI,URL,消息头,消息体,状态行 📄 HTTP常用请求头大揭秘 📄 HTTPS:网络安全攻坚战 📄 HTTP/2:网络安全传输的快车道 📄 HTTP/3:让传输效率再一次起飞 📄 高性能网络编程:图解Socket核心内幕以及五大IO模型 📄 高性能网络编程:三分钟短文快速了解信号驱动式IO 📄 高性能网络编程:彻底弄懂IO复用 - IO处理杀手锏,带您深入了解select,poll,epoll 📄 高性能网络编程:异步IO:新时代的IO处理利器 📄 高性能网络编程:网络编程范式 - 高性能服务器就这么回事 📄 高性能网络编程:性能追击 - 万字长文30+图揭秘8大主流服务器程序线程模型
📄 Java内存模型:如果有人给你撕逼Java内存模型,就把这些问题甩给他 📄 一文带你彻底理解同步和锁的本质(干货) 📄 AQS与并发包中锁的通用实现 📄 ReentrantLock介绍与使用 📄 ReentrantReadWriteLock介绍与使用 📄 ReentrantLock的Condition原理解析 📄 如何优雅的中断线程 📄 如何优雅的挂起线程 📄 图解几个好玩的并发辅助工具类 📄 图解BlockingQueue阻塞队列
📄 消息队列那么多,为什么建议深入了解下RabbitMQ? 📄 高并发异步解耦利器:RocketMQ究竟强在哪里? 📄 Kafka必知必会18问:30+图带您看透Kafka
📄 洞悉MySQL底层架构:游走在缓冲与磁盘之间 📄 SQL运行内幕:从执行原理看调优的本质 📄 洞悉Redis技术内幕:缓存,数据结构,并发,集群与算法