VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 网站开发 > 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
      



  

相关教程