Javascript 如何在Chrome扩展中使用给定的char/keycode初始化键盘事件?
我正在开发一个Google Chrome扩展,它模拟网页上的键盘事件 我发现Javascript 如何在Chrome扩展中使用给定的char/keycode初始化键盘事件?,javascript,google-chrome,google-chrome-extension,content-script,dom-events,Javascript,Google Chrome,Google Chrome Extension,Content Script,Dom Events,我正在开发一个Google Chrome扩展,它模拟网页上的键盘事件 我发现event.initKeyboardEvent()由于以下原因无法正常工作,我还发现了一些解决方法,例如: 但是,在事件对象上定义属性不起作用,因为扩展的内容脚本有自己的“并行世界”,所以内容脚本中定义的属性对网页脚本不可见 我唯一也是最后一次希望DOM 4事件构造函数在Google Chrome中工作,并且可以通过构造函数正确初始化键盘事件 var event = new KeyboardEvent("keypress
event.initKeyboardEvent()
由于以下原因无法正常工作,我还发现了一些解决方法,例如:
但是,在事件对象上定义属性不起作用,因为扩展的内容脚本有自己的“并行世界”,所以内容脚本中定义的属性对网页脚本不可见
我唯一也是最后一次希望DOM 4事件构造函数在Google Chrome中工作,并且可以通过构造函数正确初始化键盘事件
var event = new KeyboardEvent("keypress", {key: 'U+0041', char: 'a', ... })
不幸的是,它在以下方面失败:
TypeError: illegal constructor
我在Chrome中找不到任何关于受支持事件构造函数的文档。有人能给我指一些文档/源代码吗
在Google Chrome扩展中模拟键盘事件还有其他方法吗
(注意,TextEvent不会有帮助,因为许多现实世界的控件都会监听
keydown
/keydup
)因为当您启动从内容脚本到页面的事件(反之亦然)时,Chrome不会保留自定义属性,所以会在页面中插入脚本来接管此任务。这里有一个基本的例子来说明这个想法。尽管未正确处理键
和键
属性(无论如何都不应使用这些属性),但它仍然可用
这是一个触发char“a”的keypress
事件的简单示例。如果要触发更多相关的键事件,请不要使用triggerKeyEvent
三次(因为它有轻微的开销)。相反,请修改triggerKeyEvent
函数,使其使用正确的参数触发所有事件(keydown
、keypress
、keypup
和/或input
)
如果您需要能够更改altKey
、shiftKey
等,只需修改该功能。一句话:我展示的示例非常基本,可以根据您的需要进行调整 阅读更多 如果要更改实现以匹配规范,请阅读以下来源:
- W3C:
- W3C:
- 堆栈溢出:
"permissions": [
"debugger"
],
ContentScript.js
chrome.runtime.sendMessage({ pressEnter: true });
chrome.runtime.onMessage.addListener(function(message,sender,sendResponse){
if(message.pressEnter){
chrome.tabs.query({active: true}, function(tabs) {
chrome.debugger.attach({ tabId: tabs[0].id }, "1.0");
chrome.debugger.sendCommand({ tabId: tabs[0].id }, 'Input.dispatchKeyEvent', { type: 'keyUp', windowsVirtualKeyCode:13, nativeVirtualKeyCode : 13, macCharCode: 13 });
chrome.debugger.sendCommand({ tabId: tabs[0].id }, 'Input.dispatchKeyEvent', { type: 'keyDown', windowsVirtualKeyCode:13, nativeVirtualKeyCode : 13, macCharCode: 13 });
chrome.debugger.detach({ tabId: tabs[0].id });
});
}
});
Background.js
chrome.runtime.sendMessage({ pressEnter: true });
chrome.runtime.onMessage.addListener(function(message,sender,sendResponse){
if(message.pressEnter){
chrome.tabs.query({active: true}, function(tabs) {
chrome.debugger.attach({ tabId: tabs[0].id }, "1.0");
chrome.debugger.sendCommand({ tabId: tabs[0].id }, 'Input.dispatchKeyEvent', { type: 'keyUp', windowsVirtualKeyCode:13, nativeVirtualKeyCode : 13, macCharCode: 13 });
chrome.debugger.sendCommand({ tabId: tabs[0].id }, 'Input.dispatchKeyEvent', { type: 'keyDown', windowsVirtualKeyCode:13, nativeVirtualKeyCode : 13, macCharCode: 13 });
chrome.debugger.detach({ tabId: tabs[0].id });
});
}
});
好。。。我做了一些事情,例如,现在可以通过“箭头键”移动JQuery滑块。但是,文本输入控件似乎不会对按键做出反应(即,没有输入字符),唯一的按键事件是“Tab”。将退格事件发送到任何输入控件都会触发浏览器“后退”导航;到家、结束等根本不起作用。我相信这与事件不被“信任”这一事实有关,尽管我没有看到“.isTrusted”属性表明这一点(如在Firefox中)。太棒了!!谢谢我做了一些增强来修复哪个,并传入eventCare来添加一个示例?或者至少是到相关调试器协议文档的链接?可以找到相关协议命令
chrome.debugger.sendCommand()
是如何发送一个文件的。这些文件现在是。devtools协议已记录在案。它看起来像是输入。dispatchKeyEvent
可能是您使用sendCommand()
将按键事件发送到选项卡的方法,但我还没有尝试过。这非常有效,对于那些希望按enter键(如图所示)然后在enter键后选择backspace键(keycode 8)的人来说,这非常有效!为什么你似乎先发送一个键向上,然后发送一个键向下?你能确认一下它今天还在工作吗。。。(铬80+)?