Keydown哪个不能正常使用Chrome扩展程序
我一直在努力解决谷歌扩展的问题,你一直是我最后的希望! :))
好吧,我想点击我的chrome扩展程序上的按钮,这将导致页面扩展程序上的keydown模拟正在运行。
我认为chrome在我的想法上有一些安全问题,它会阻止键盘模拟(使事件isTrusted:false)并删除哪个属性。
我写的函数在jsfiddle上工作正常,但看起来chrome扩展以不同的方式完成它。
这是内容脚本文件:
chrome.runtime.onMessage.addListener(function (request, sender, sendResponse) { if(request.action == "scrollToTop"){ } else if(request.action == "scrollToBottom"){ } else if(request.action == "enter"){ triggerKeyboardEvent(document,13); } function triggerKeyboardEvent(el, keyCode){ var event = new Event("keydown", {"bubbles":true, "cancelable":true}); event.which = keyCode; el.dispatchEvent(event); } }); chrome.runtime.sendMessage({action : "show"});
登录jsFiddle写道:
Event {isTrusted: false, which: 13}
登录网站:
document.addEventListener('keydown',function (e) { console.log(e) }
写道:
Event {isTrusted: false}
感谢@ BG101和@Rob WI发现该解决方案是脚本注入!
唯一的事情就是根据MDN KeyboardEvent.initKeyboardEvent()进行了描述,所以我用以下代码替换了代码:
var event = new Event(event, {"bubbles":true, "cancelable":true});
此外,因为我希望触发器在文档上运行,我删除了元素选择器的东西。 这是我得到的:
chrome.runtime.onMessage.addListener(function (request, sender, sendResponse) { if(request.action == "scrollToTop"){ triggerKeyboardEventOnDocument("keydown",38); } else if(request.action == "scrollToBottom"){ triggerKeyboardEventOnDocument("keydown",40); } else if(request.action == "enter"){ triggerKeyboardEventOnDocument("keydown",13); } function triggerKeyboardEventOnDocument(event, keyCode){ var script = document.createElement('script'); script.textContent = '(' + function(event, charCode) { //Create Event var event = new Event(event, {"bubbles":true, "cancelable":true}); // Define custom values // This part requires the script to be run in the page's context var getterCode = {get: function() {return charCode}}; var getterChar = {get: function() {return String.fromCharCode(charCode)}}; Object.defineProperties(event, { charCode: getterCode, which: getterCode, keyCode: getterCode, // Not fully correct key: getterChar, // Not fully correct char: getterChar }); document.dispatchEvent(event); } + ')(' + '\"' + event + '\", '+ keyCode + ')'; (document.head||document.documentElement).appendChild(script); script.parentNode.removeChild(script); } }); chrome.runtime.sendMessage({action : "show"});