{ ... "content_scripts": [ { "all_frames": true, //, , iframe "js": ["js/hotkeys.js" ], //, "matches": [ "http://*/*", "https://*/*" ], // "run_at": "document_end" } ], ...
if(!EXT_HOTKEY_JS_INSERTED){ var EXT_HOTKEY_JS_INSERTED = true; var hotkeys = ''; var messages = ''; var timeout = ''; chrome.extension.sendRequest({operation: "hotkeys"}, function(response) { // if (response) if (response.hotkeys){ hotkeys = JSON.parse(response.hotkeys); var d = document.createElement('DIV'); // d.id = "hotkeyresponder"; //+: , , z-index document.body.appendChild(d); } }); document.addEventListener('keydown', event_handleKeyDownEvent, true); //, function event_handleKeyDownEvent(e){ if (!hotkeys) return true; var c=0; var a=0; var s=0; var k = e.keyCode; if (e.shiftKey) s = 1; if (e.altKey) a = 1; if (e.ctrlKey) c = 1; if (k==27 && !c && !a && !s){ if (document.getElementById('hotkeyresponder').style.display!='none'){ // Esc document.getElementById('hotkeyresponder').style.display="none"; e.preventDefault(); e.cancelBubble = true; e.bubbles = false; return false; } } for (var name in hotkeys){ if (hotkeys.hasOwnProperty(name)){ if (hotkeys[name].c == c && hotkeys[name].a == a && hotkeys[name].s == s){ // , , if (name == 'selectProfile' && k > 48 && k < 58 && (c || a || s)){ // <+> chrome.extension.sendRequest({operation: "hotkey", key:name, id:(k-48)}, function(response) { responseHotkey(name,response.status,response.message); }); e.preventDefault(); e.cancelBubble = true; e.bubbles = false; return false; } else if (hotkeys[name].k==k){ // . , if (name=='toggleBodyi'){ document.getElementById('togglebody').onclick(); } // , (toggle - , DOM, etc.) else{ // , chrome.extension.sendRequest({operation: "hotkey", key:name}, function(response) { responseHotkey('pp',response.status,response.message); }); } e.preventDefault(); e.cancelBubble = true; e.bubbles = false; return false; } else{ continue; } } } } } function responseHotkey(type,status,message){ // if (status == 'OK' && message){ document.getElementById('hotkeyresponder').innerHTML = message; document.getElementById('hotkeyresponder').style.display = 'block'; if (timeout) clearTimeout(timeout); timeout = setTimeout(function(){document.getElementById('hotkeyresponder').style.display='none';},2000); } } }
chrome.extension.onRequest.addListener(function(request, sender, sendResponse) { loadSettings(); // if (request.operation == 'hotkeys'){ // sendResponse({hotkeys:localStorage.hotkeys}); } else if (request.operation == 'hotkey'){ // if (request.key == 'selectProfile'){ // } // } else{ //sendResponse({}); } });
sendRequest
and onRequest
deprecated in favor of sendMessage
with similar syntax and functionality. At the time of writing this post, I didn’t test this completely, but my extensions still work without any visible problems. { ... "options_page": "options.html", ... }
<html> <head> <title>Hotkeys</title> <script type="text/javascript" src="js/tools.js"></script> <script type="text/javascript" src="js/options.js"></script> </head> <body> <!-- header' . --> <div id="tab1"> <p style="margin-top:0;"> - </p> </div> </body> </html>
... var keycodes = ['','','','','','','','','','Tab','','','','Enter','','','','','','','','','','','','','','Escape','','','','','Space','Page Up','Page Down','End','Home','Left','Up','Right','Down','','','','','Insert','Delete','','0','1','2','3','4','5','6','7','8','9','','','','','','','','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','MainM Left','MainM Right','Menu','','','NumPad 0','NumPad 1','NumPad 2','NumPad 3','NumPad 4','NumPad 5','NumPad 6','NumPad 7','NumPad 8','NumPad 9','NumPad *','NumPad +','','NumPad -','NumPad ,','NumPad /','F1','F2','F3','F4','F5','F6','F7','F8','F9','F10','F11','F12','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','=','','-','','','~','','','','','','','','','','','','','','','','','','','','','','','','','','','','\\']; var hotkeys = JSON.parse(localStorage.hotkeys); var phk = ['prevProfile', 'nextProfile', 'selectProfile', 'openOpts', 'toggleHideWidget', 'toggleWidget', 'toggleInCT', 'toggleBody', 'openWidget', 'toggleBodyi', 'actMC', 'actMG'];
initt = function(){ ... for (var i = 0; i < phk.length;i++){ var d = document.createElement('DIV'); d.innerHTML = '<h4 style="margin:0;">'+_getMessage(phk[i]+'_title')+'</h4><input type="checkbox" id="'+phk[i]+'_c"><label for="'+phk[i]+'_c">Ctrl <b>+</b></label><input type="checkbox" id="'+phk[i]+'_a"><label for="'+phk[i]+'_a">Alt <b>+</b></label><input type="checkbox" id="'+phk[i]+'_s"><label for="'+phk[i]+'_s">Shift <b>+</b></label>'+((phk[i]=='selectProfile')?('<key 1-9><input type="hidden" id="'+phk[i]+'_k" value="$"> '):('<input type="text" id="'+phk[i]+'_k">'))+'<img src="img/delete.gif" id="'+phk[i]+'_imgerr" class="err_disp" style="height:16px;display:none;" /><img src="img/ok.png" id="'+phk[i]+'_imgok" class="err_disp" style="height:16px;display:none;" /><br/><span id="result_'+phk[i]+'" class="err_disp" style="color:red"></span>'; document.getElementById('tab1').appendChild(d); } document.getElementById('tab1').innerHTML+='<button>'+_getMessage('opts_13')+'</button>'; for (var i = 0; i < phk.length;i++){ if (hotkeys[phk[i]]){ document.getElementById(phk[i]+'_c').checked = (hotkeys[phk[i]]['c']?true:false); document.getElementById(phk[i]+'_a').checked = (hotkeys[phk[i]]['a']?true:false); document.getElementById(phk[i]+'_s').checked = (hotkeys[phk[i]]['s']?true:false); if (phk[i]!='selectProfile') document.getElementById(phk[i]+'_k').value = keycodes[hotkeys[phk[i]]['k']]; } } ... var m = document.querySelectorAll('input[type=text]') for (var i = 0; i < m.length; i++){ m[i].addEventListener('keydown',function(event){this.value=(keycodes[event.keyCode]?keycodes[event.keyCode]:'');prevDef(event);return false},false); } ... }
save = function(){ // var err_els = document.getElementsByClassName('err_disp'); for (var i = 0; i < err_els.length; i++){ if (i%3==2) err_els[i].innerHTML = ''; else err_els.style.display = 'none'; } var hktp = {}; var hkts = {}; // for (var i = 0; i < phk.length; i++){ if ((document.getElementById(phk[i]+'_c').checked || document.getElementById(phk[i]+'_a').checked || document.getElementById(phk[i]+'_s').checked) && document.getElementById(phk[i]+'_k').value){ // hktp[phk[i]] = { c:document.getElementById(phk[i]+'_c').checked, a:document.getElementById(phk[i]+'_a').checked, s:document.getElementById(phk[i]+'_s').checked, k:document.getElementById(phk[i]+'_k').value, }; } else{ // - if (document.getElementById(phk[i]+'_c').checked || document.getElementById(phk[i]+'_a').checked || document.getElementById(phk[i]+'_s').checked || (document.getElementById(phk[i]+'_k').value && document.getElementById(phk[i]+'_k').value!='$')){ document.getElementById('result_'+phk[i]).innerHTML = _getMessage('opts_12'); document.getElementById(phk[i]+'_imgerr').style.display = 'inline'; } } } // for (var i = 0; i < phk.length-1; i++){ for (var j = i+1; j < phk.length; j++){ if (hktp[phk[i]] && hktp[phk[j]]) if (hktp[phk[i]].c == hktp[phk[j]].c && hktp[phk[i]].a == hktp[phk[j]].a && hktp[phk[i]].s == hktp[phk[j]].s && (hktp[phk[i]].k == hktp[phk[j]].k || ((hktp[phk[i]].k == '$' || hktp[phk[j]].k == '$') && ((hktp[phk[i]].k*1>0 && hktp[phk[i]].k*1<=9) || (hktp[phk[j]].k*1>0 && hktp[phk[j]].k*1<=9))))){ document.getElementById('result_'+phk[i]).innerHTML = _getMessage('opts_11'); document.getElementById(phk[i]+'_imgerr').style.display = 'inline'; document.getElementById('result_'+phk[j]).innerHTML = _getMessage('opts_11'); document.getElementById(phk[j]+'_imgerr').style.display = 'inline'; hktp[phk[i]] = false; hktp[phk[j]] = false; } } } // "" for (var name in hktp){ if (hktp.hasOwnProperty(name) && hktp[name]){ document.getElementById(phk[i]+'_imgok').style.display = 'inline'; hkts[name] = { c:(document.getElementById(name+'_c').checked?1:0), a:(document.getElementById(name+'_a').checked?1:0), s:(document.getElementById(name+'_s').checked?1:0), k:keycodes.in_array(document.getElementById(name+'_k').value), } } } localStorage.hotkeys = JSON.stringify(hkts); // }
Source: https://habr.com/ru/post/171565/
All Articles