Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/430.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在Chrome扩展中使用给定的char/keycode初始化键盘事件?_Javascript_Google Chrome_Google Chrome Extension_Content Script_Dom Events - Fatal编程技术网

Javascript 如何在Chrome扩展中使用给定的char/keycode初始化键盘事件?

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

我正在开发一个Google Chrome扩展,它模拟网页上的键盘事件

我发现
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:
如果您想进一步了解内容脚本中脚本注入的概念,请参阅:

  • 堆栈溢出:

我发现chrome调试器协议v1.1是模拟Google chrome扩展中的按键和鼠标事件的明确答案。协议的一部分可以通过访问。

以防任何人遇到我使用特定密钥码触发密钥更新的问题。这是一种方式

首先,我尝试了上面的@RobW答案,但运气不佳。未传递任何键码,始终未定义

然后我研究了迪斯亚的答案,它确实起了作用

下面是一些代码:-

清单

"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+)?