chrome浏览器扩展的事件处理
关于chrome扩展开发的栗子已经有很多了,问问度娘基本能满足你的欲望, 我想说的是扩展和页面间的数据传递问题。
我们知道写扩展有个必须的文件就是“manifest.json”, 这个里面定义了一个和页面打交道的文件“content.js”, 该js可以访问页面中的任何元素;但不幸的是页面却无法访问content.js中的任何方法(写扩展页面的除外啊,我说的页面是浏览器中的普通页面)。那么问题就来了:怎么才能触发content.js中的事件呢?
官方当然给出解决方案:content.js中写按钮的监听事件,比如一般button的click事件
//bt1 是页面按钮id
document.getElementById('bt1')..addEventListener(“click”,function(){
//做一些自己的事情,和background.js打交道等等
},false);
这么做当然没有问题。
但是……
如果页面中没有bt1按钮呢 ?
如果我不知道是哪个按钮调用的呢 ?
或者说,content.js中有一个方法,需要页面上随时可以调用 。。。。
解决办法就是,页面添加一个固定的按钮就叫bt1,其他的都不能叫这个名字,content.js这样就可以绑定事件了, 谁用谁调用一下bt1的click事件。
其实还有个解决办法:自定义事件 , 看代码
//页面中定义一个事件
//name 事件名称,msg传递的消息值
createCustomEvent:function(name,msg){
var evt = document.createEvent("CustomEvent");
evt.initCustomEvent(name, true, false, msg);
document.dispatchEvent(evt);
},
content.js写一个事件监听
//content.js中的监听方法
//name要和页面name相同
//evt 就是得到的结果
document.addEventListener(name, function(evt) {
var data =evt.detail; //data就是上面的msg值 //todo }
这样整个流程就通了,页面随时可以创建一个事件来调用扩展方法。
不过明白人已经看出来了,返回值呢? 是的,该方法只能传递值却不能得到结果,并且msg只能传递字符串,也没法定义回调。如果想得到返回值只能再content.js中也定义一个自定义事件,页面做监听,反过来使用上面的代码。(感觉很矬……)
这还没有完, 该方案不支持并发。当有两个地方同时调用该方法时,页面监听事件无法区分那个的返回值,得到的结果根本无法使用。
怎么办呢? 我又想到一个更矬的办法来,调用的时候传递一个回调,然后保存起来。
说不明白,看代码吧。页面代码
var sendMessage=function(msg,callback){
//获取一个自增序列当key,页面唯一
var key=getIndex();
//保存到hashtable里面,evtMap是个自定义hashtable
evtMap.add(key,callback);
//'调用自定义事件,把key带上
createCustomEvent(eventName,{"evtId":key,"msg":msg});
}
content.js可以得到这个key,回调的时候再把这个可以传过来,看看content.js
document.addEventListener(listenerName, function(evt) {
var data =evt.detail;
//todo 得到msg
var res={"evtId":data.evtId,"msg":msg }; //把页面传递的key再传回去
var evt = document.createEvent("CustomEvent");
evt.initCustomEvent(backEventName, true, false, res);
document.dispatchEvent(evt);
}, false);
再回到页面js代码
document.addListener(listenerName,function(response){
//通过key从hasttable中再次获取callback函数
var evtId=response.evtId;
var callback=evtMap.getValue(evtId);
if (callback) {
callback(response.msg);
};
});
上面就是一种比较矬的解决扩展和页面数据交互的一种方案,如果哪位高手有更好的方案不舍赐教~!! 感谢
下面把JS的Hashtable贴一下,其实度娘怀里就有
var HashTable=function(){
var size = 0;
var entry = new Object();
this.add = function (key,value){
if(!this.containsKey(key)){
size ++ ;
}
entry[key] = value;
}
this.getValue = function (key) {
return this.containsKey(key) ? entry[key] : null;
}
this.remove = function(key){
if( this.containsKey(key) && ( delete entry[key] ) ) {
size --;
}
}
this.containsKey = function(key){
return (key in entry);
}
this.containsValue = function(value){
for(var prop in entry) {
if(entry[prop] == value){
return true;
}
}
return false;
}
this.getValues = function () {
var values = new Array();
for(var prop in entry) {
values.push(entry[prop]);
}
return values;
}
this.getKeys = function () {
var keys = new Array();
for(var prop in entry) {
keys.push(prop);
}
return keys;
}
this.getSize = function () {
return size;
}
this.clear = function () {
size = 0;
entry = new Object();
}
}
chrome浏览器扩展的事件处理的更多相关文章
- Chrome浏览器扩展开发系列之十七:扩展中可用的chrome.events API
chrome.events中定义了一些常见的事件类型,可以供Chrome浏览器扩展程序发出对应的事件对象. 对于关注的事件,首先要通过addListener()在对应的事件上注册监听器,示例如下: c ...
- 哇塞,原来自己写 Google Chrome 浏览器扩展(插件)这么容易!
1. 首先新建一个记事本,命名为 manifest.json,这是写 Google Chrome 浏览器扩展必须的文件 { "manifest_version": 2, " ...
- Chrome浏览器扩展开发系列之十四
Chrome浏览器扩展开发系列之十四:本地消息机制Native messaging 时间:2015-10-08 16:17:59 阅读:1361 评论:0 收藏:0 ...
- chrome浏览器扩展--QQ群查看器(1)
QQ群查看器--chrome浏览器扩展 源码及程序下载地址:http://pan.baidu.com/share/link?shareid=3636190804&uk=1678089569 关 ...
- Chrome浏览器扩展开发系列之十九:扩展开发示例
翻译总结了这么多的官网内容,下面以一款博主开发的“沪深股票价格变化实时追踪提醒”软件为例,介绍Chrome浏览器扩展程序的开发,开发环境为Eclipse IDE+Chrome Browser. “沪深 ...
- Chrome浏览器扩展开发系列之十八:扩展的软件国际化chrome.i18n API
i18n是internationalization 的简写,这里将讨论软件国际化的问题.熟悉软件国际化的朋友应该知道,软件国际化要求,页面中所有用户可见的字符串都必须置于资源属性文件中.资源属性文件中 ...
- Chrome浏览器扩展开发系列之十六:扩展中可用的Chrome浏览器API
除了Chrome浏览器支持的chrome.* API之外,Chrome浏览器扩展还可以使用Chrome浏览器为Web页面或Chrome app提供的APIs.对于Chrome浏览器2支持的API,还可 ...
- Chrome浏览器扩展开发系列之十五:跨域访问的XMLHttpRequest对象
XMLHttpRequest对象是W3C的标准API,用于访问服务器资源.XMLHttpRequest对象支持多种文本格式,如XML和JSON等.XMLHttpRequest对象可以通过HTTP和HT ...
- Chrome浏览器扩展开发系列之十四:本地消息机制Native messaging
通过将浏览器所在客户端的本地应用注册为Chrome浏览器扩展的“本地消息主机(native messaging host)”,Chrome浏览器扩展还可以与客户端本地应用之间收发消息. 客户端的本地应 ...
随机推荐
- JS向光标指定位置插入内容
方法: function insertHtmlAtCaret(html) { var sel, range; if (window.getSelection) { // IE9 and non-IE ...
- instancetype、id、NSObject的联系和区别
1.id和instancetype都能省去具体类型,提高代码的通用性.而NSObject *则没有这种功能. 2.instancetype只能用于方法的返回类型,而id用处和NSObject *类似. ...
- Asp.net mvc上传多张图片后台存储
前台页面通过<file name="img">标签数组上传图片,后台根据Request.Files["img"]来接收前台上传的图片. 1 Syst ...
- PowerDesigner 建模
File—New Model—Physical Data Model—Physical Diagram—Model name设置为test,DBMS属性设置为Microsoft SQL Server ...
- 文件与base64二进制转换
/// <summary> /// 文件转换为Base64二进制流 /// </summary> /// <param name="FilePath" ...
- nodejs: C++扩展
Nodejs的C++扩展首先保证nodejs和v8都正确安装 下载NodeJS源码,我的放在D盘. NodeJS的C++扩展要用VS2010开发,新建一个空的Win32控制台项目,右键——属性,在常规 ...
- 斯坦福第四课:多变量线性回归(Linear Regression with Multiple Variables)
4.1 多维特征 4.2 多变量梯度下降 4.3 梯度下降法实践 1-特征缩放 4.4 梯度下降法实践 2-学习率 4.5 特征和多项式回归 4.6 正规方程 4.7 正规方程及不可逆性 ...
- MongoDB 3.2 在windows上的安装
翻译自 https://docs.mongodb.org/master/tutorial/install-mongodb-on-windows/ 在windows上安装 MongoDB 平台支持:从M ...
- Titanium系列--利用js动态获取当前时间
动态获取时间: //显示时间 function getDateTime() { var now = new Date(); var year = now.getFullYear(); var mont ...
- Matlab神经网络函数newff()新旧用法差异
摘要 在Matlab R2010a版中,如果要创建一个具有两个隐含层.且神经元数分别为5.3的前向BP网络,使用旧的语法可以这样写: net1 = newff(minmax(P), [5 3 1]); ...