当前位置:
首页 > 网站开发 > JavaScript >
-
JavaScript教程之一个基于chrome扩展的自动答题器(3)
)
63 {
64 // 注入自定义JS
65 injectCustomJs();
66 //创建一个名为msgFromContent的input,用于content和inject之间通讯
67 $(document.body).append($('<input />', {id: 'msgFromContent',name: 'msgFromContent',type: 'hidden'}));
68 //将设置存放到inject的通信空间中
69 document.getElementById('msgFromContent').value=JSON.stringify({cmd:'config',data:config});
70 }
71 if(whref.indexOf('www.jd.com')>-1)
72 injectCustomJs();
73
74 //记录新用户的信息
75 var _hass=encodeURIComponent($.getUrlParam('h'));
76 if(_hass!='null')//用户hass信息
77 {
78 //console.log(_hass);
79 //console.log(config);
80 //如果设置的记录姓名,而且当前hass值下面没有姓名
81 if(config['set']['save_login']==1 & !config['login_info'][_hass])
82 {
83 //获取用户名
84 var _name=$('#wol span').eq(1).html();
85
86 //用户和config['login_info']进行对比,没有的话就加入
87 if(!_name)//如果没获取到名字,就让用户输入
88 {
89 _name=prompt('未获取到姓名,请手工输入','');
90 }
91 config['login_info'][_hass]=_name;
92 }
93 config['active']=_hass;
94 }
95 //将信息保存到本地
96 chrome.storage.local.set(config);
97 });
98
99 //接受通信(从popup来的命令)
100 chrome.runtime.onMessage.addListener(function(request, sender, sendResponse)
101 {
102 //获取配置
103 if(request.cmd=='get_conf')
104 {
105 sendResponse(config);
106 }
107 //用户登录
108 else if(request.cmd=='login')
109 {
110 config['active']=request['data']['id'];
111 }
112 //用户登出
113 else if(request.cmd=='logout')
114 {
115 config['active']='';
116 }
117 //删除用户信息
118 else if(request.cmd=='del')
119 {
120 delete config['login_info'][request['data']['id']];
121 }
122 //保存设置
123 else if(request.cmd=='set_conf')
124 {
125 config['set']=request['data'];
126 }
127 //设置新题
128 else if(request.cmd=='set_new_ques')
129 {
130 config['new_ques']=config['new_ques'].concat(request['data']);
131 }
132 //删除所有自定义新题
133 else if(request.cmd=='del_new_ques')
134 {
135 config['new_ques']=[];
136 config['set']['date_version']='';
137 }
138
139 //导入用户登陆信息
140 else if(request.cmd=='add')
141 {
142 $.extend(config['login_info'],request['data']);
143 }
144 //全自动答题
145 else if(request.cmd=='auto_all_ans')
146 {
147
148 }
149 //其他
150 else
151 {
152 console.log(request.cmd);
153 }
154 //将信息保存到本地
155 chrome.storage.local.set(config);
156
157 _request=JSON.stringify(request);
158 //将接收到的命令直接发到名为msgFromContent的input中
159 document.getElementById('msgFromContent').value=_request;
160
161 });
162
163 // 向页面注入JS
164 function injectCustomJs(jsPath)
165 {
166 jsPath = jsPath || 'js/inject.js';
167 var temp = document.createElement('script');
168 temp.setAttribute('type', 'text/javascript');
169 // 获得的地址类似:chrome-extension://ihcokhadfjfchaeagdoclpnjdiokfakg/js/inject.js
170 temp.src = chrome.extension.getURL(jsPath);
171 temp.onload = function()
172 {
173 // 放在页面不好看,执行完后移除掉
174 this.parentNode.removeChild(this);
175 };
176 document.body.appendChild(temp);
177 }
178
content本身的工作很简单,一是读取或保存用户设置,二是向页面注入inject.js的代码,三是将用户的指令转交给inject.js,就像市里总是把省里的文件直接转发给我们一样
在content和inject通讯中,我选择了在页面新建一个div元素,然后将通讯内容作为div元素的html。
优势是逻辑简单,可以直接使用jquery处理;
缺点是,破坏了页面原有结构,inject需要不停轮询该元素内容,通讯内容暴露,单项通讯
inject.js代码:
1 //为jquery添加url筛选器,获取name指向的值
2 (function ($) {
3 $.getUrlParam = function (name) {
4 var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
5 var r = window.location.search.substr(1).match(reg);
6 if (r != null) return unescape(r[2]); return null;
7 }
8 })(jQuery);
9
10 window.anslist=[
11 ['打好污染防治攻坚战,要坚持源头防治,调整()结构,做到“四减四增”。','产业能源运输农业投入'],
12 ['博鳌亚洲论坛2018年年会主题为()。','开放创新的亚洲,繁荣发展的世界'],
13 ['今天,中国已经成为世界第二大经济体、第一大工业国、第一大货物贸易国、第()大外汇储备国。','一']
14 ];
15
16
17 //初始化config
18 var config = {
19 'set':{
20 'save_login': 1,
21 'sign_ans': 1,
22 'sign_ans_mouseover': 0,
23 'auto_ans': 0,
24 'dtime':3,
25 'more':1,
26 },
27 'login_info':{},
28 'active':'',
29 'new_ques':[]
30 }; // 默认配置
31
32 if(localStorage['config'])
33 {
34 $.extend(config,JSON.parse(localStorage['config']));
35 }
36 anslist=anslist.concat(config['new_ques']);
37
38
39 //载入完成后执行
40 $(function(){
41
42 //退出当前账号
43 function logout()
44 {
45 //清除localStorage、sessionStorage和Cookies
46 localStorage.clear();
47 sessionStorage.clear();
48 //跳转到index.html
49 window.location.href="https://www.dtdjzx.gov.cn/member/logout";
50 }
51 //根据hass值登录帐号
52 function login(hass,auto_all_ans)
53 {
54 //清除localStorage、sessionStorage和Cookies
55 localStorage.clear();
56 sessionStorage.clear();
57 //根据hass跳转index.html
58 window.location.href="http://xxjs.dtdjzx.gov.cn/index.html?h="+hass+'&a='+auto_all_ans+'#hhh3';
59 }
60
61 //创建一个名为msgFromContent的input,用于接收content的命令
62 //对msgFromContent进行轮询来获取命令
63 var _cmdStr;
64 var ci=setInterval(function(){
65 if(_cmdStr=$('#msgFromContent').val())
66 {
67 _cmdStr=eval('('+_cmdStr+')');
68 //用户登录
69 if(_cmdStr['cmd']=='login')
70 {
71 console.log(_cmdStr['cmd']);
72 login(_cmdStr['data']['id'],_cmdStr['data']['auto_all_ans'])
73 }
74 //用户登出
75 else if(_cmdStr['cmd']=='logout')
76 {
77 console.log(_cmdStr['cmd']);
78 logout();
79 }
80 //删除用户信息
81 else if(_cmdStr['cmd']=='del')
82 {
83 console.log(_cmdStr['cmd']);
84 }
85 //从content同步配置
86 else if(_cmdStr['cmd']=='set_conf')
87 {
88 config['set']=_cmdStr['data'];
89 //ans_plus(config['set']);
90 }
91 //自定义新题
92 else if(_cmdStr['cmd']=='set_new_ques')
93 {
94 config['new_ques']=config['new_ques'].concat(_cmdStr['data']);
95 anslist=config['new_ques'].concat(anslist);
96 }
97 //清除所有自定义新题
98 else if(_cmdStr['cmd']=='del_new_ques')
99 {
100 config['new_ques']=[];
101 }
102
103 //其他
104 else
105 {
106 //console.log(_cmdStr['cmd']);
107
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式