我正在开发一个谷歌浏览器扩展,它模拟了一个网页上的键盘事件。
我发现, event.initKeyboardEvent()
不会因为正常此WebKit的错误 ,我也发现了一些解决方法,如SO问题
然而,事件对象定义属性不能正常工作,因为扩展的内容脚本有自己的“平行世界”这样的内容脚本定义的属性并不网页脚本可见。
我唯一和最后的希望,DOM 4事件中的构造谷歌浏览器工作,并有可能通过构造函数正确初始化键盘事件
var event = new KeyboardEvent("keypress", {key: 'U+0041', char: 'a', ... })
不幸的是,它失败:
TypeError: illegal constructor
我没能找到在Chrome支持的事件构造的任何文件。 任何人都可以点我的一些文档/源代码?
任何其他方式来模拟在谷歌Chrome扩展键盘事件?
(注意,TextEvent,并将不会帮助,因为许多现实世界的控制听keydown
/ keyup
专)
因为当你开始从页面(反之亦然)一个内容脚本事件浏览器不保存自定义属性,在页面中注入一个脚本来接手这项工作。 下面是其中给出了这个概念的基本示例。 它是可用的,虽然key
和keyCode
属性不正确处理(那些不应该无论如何使用)。
// Example: Say, you've got a reference to a DOM element...
var elem = document.body;
// And you want to "type" "A"
var charCode = 65;
// Now, you want to generate a key event...
triggerKeyEvent(elem, charCode);
// triggerKeyEvent is implemented as follows:
function triggerKeyEvent(element, charCode) {
// We cannot pass object references, so generate an unique selector
var attribute = 'robw_' + Date.now();
element.setAttribute(attribute, '');
var selector = element.tagName + '[' + attribute + ']';
var s = document.createElement('script');
s.textContent = '(' + function(charCode, attribute, selector) {
// Get reference to element...
var element = document.querySelector(selector);
element.removeAttribute(attribute);
// Create KeyboardEvent instance
var event = document.createEvent('KeyboardEvents');
event.initKeyboardEvent(
/* type */ 'keypress',
/* bubbles */ true,
/* cancelable */ false,
/* view */ window,
/* keyIdentifier*/ '',
/* keyLocation */ 0,
/* ctrlKey */ false,
/* altKey */ false,
/* shiftKey */ false,
/* metaKey */ false,
/* altGraphKey */ false
);
// 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
});
element.dispatchEvent(event);
} + ')(' + charCode + ', "' + attribute + '", "' + selector + '")';
(document.head||document.documentElement).appendChild(s);
s.parentNode.removeChild(s);
// The script should have removed the attribute already.
// Remove the attribute in case the script fails to run.
s.removeAttribute(attribute);
}
这是一个简单的例子,其触发keypress
事件对于char“A”。 如果要触发更多相关的重要事件,不使用triggerKeyEvent
三次(因为它有一个轻微的开销)。 相反,修改triggerKeyEvent
功能,使得它触发的所有事件( keydown
, keypress
, keyup
和/或input
用正确的参数)。
如果您需要能够改变altKey
, shiftKey
等等,只需修改功能。
底线:我展示的例子是非常基本的,可以调整,以满足您的需求。
阅读更多
如果你想改变实现符合规格,阅读这些来源:
- W3C: DOM Level 3的活动规范,部分键盘事件类型
- W3C: DOM第3级事件规范,附录B:传统密钥属性:键代码,则charCode,并且其
如果您想了解更多关于脚本注入的内容脚本的概念,请参阅:
- 堆栈溢出: -使用内容脚本在页面注入代码构建一个Chrome扩展
柜面任何人有我面临触发KEYUP与特定的键码的问题。 这是一种方式。
首先我想上面没有运气@RobW的答案。 无键码过去了,总是不确定的。
于是我看着@ disya2的回答,这没有工作。
因此,这里的一些代码: -
表现
"permissions": [
"debugger"
],
ContentScript.js
chrome.runtime.sendMessage({ pressEnter: true });
Background.js
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 });
});
}
});
我发现,铬调试协议V1.1是肯定的答案,以模拟从谷歌Chrome扩展键和鼠标事件。 该协议的一部分是通过访问chrome.debugger API 。
文章来源: How to to initialize keyboard event with given char/keycode in a Chrome extension?