使用本机JavaScript模拟按键
Simulate key press using native JavaScript
我正在尝试在应用程序中模拟键盘命令。目前,我可以按下任何箭头键,我能够很好地捕捉事件。然而,我正在尝试模拟关键事件,但我没有任何运气。
这是我的代码:
//Event
this.remoteEvent = function(arg_event) {
var e = document.createEvent('KeyboardEvent');
var method = (typeof e.initKeyboardEvent !== 'undefined') ? "initKeyboardEvent" : "initKeyEvent";
switch (arg_event) {
case 'up':
e[method]('keydown', true, true, window, false, false, false, false, 0, 38);
break;
case 'right':
e[method]('keydown', true, true, window, false, false, false, false, 0, 39);
break;
case 'down':
e[method]('keydown', true, true, window, false, false, false, false, 0, 40);
break;
case 'left':
e[method]('keydown', true, true, window, false, false, false, false, 0, 37);
break;
case 'enter':
e[method]('keydown', true, true, window, false, false, false, false, 0, 13);
break;
}
document.dispatchEvent(e);
}
我是不是做错了什么?我的目标是不使用jQuery,并且主要与跨浏览器兼容。
编辑:这是我在调度前记录的事件:
KeyboardEvent {
altGraphKey: false
altKey: false
bubbles: true
cancelBubble: false
cancelable: true
charCode: 0
clipboardData: undefined
ctrlKey: false
currentTarget: null
defaultPrevented: false
detail: 0
eventPhase: 0
keyCode: 0
keyIdentifier: "false"
keyLocation: 0
layerX: 0
layerY: 0
location: 0
metaKey: true
pageX: 0
pageY: 0
path: NodeList[0]
repeat: false
returnValue: true
shiftKey: false
srcElement: document
target: document
timeStamp: 1410276114922
type: "keydown"
view: Window
which: 0
}
编辑2:这是我捕获事件的代码:
document.addEventListener('keydown', key_down_event, false);
//Key down event
function key_down_event(arg_event)
{
//Ignore all key events if any modifier key is pressed
if (arg_event.altKey || arg_event.ctrlKey || arg_event.metaKey || arg_event.shiftKey) return;
//Get the source
var source = arg_event.target;
var destination = null;
var direction = null;
var escape = false;
//Switch on key
switch(arg_event.keyCode)
{
case VK_LEFT: direction = 'left'; break;
case VK_RIGHT: direction = 'right'; break;
case VK_DOWN: direction = 'down'; break;
case VK_UP: direction = 'up'; break;
case VK_ESC: escape = true; break;
}
if (!direction && !escape) return;
arg_event.stopPropagation();
arg_event.preventDefault();
console.log(direction);
}
根据https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent,initKey*Event
方法被完全打破。比较它提供的不同API:
-
旧DOM2:
void initKeyEvent(in DOMString typeArg, in boolean canBubbleArg, in boolean cancelableArg, in boolean ctrlKeyArg, in boolean altKeyArg, in boolean shiftKeyArg, in boolean metaKeyArg, in unsigned long keyCodeArg, in unsigned long charCodeArg, in views::AbstractView viewArg);
-
DOM3(不支持壁虎):
void initKeyboardEvent(in DOMString typeArg, in boolean canBubbleArg, in boolean cancelableArg, in views::AbstractView viewArg, in DOMString charArg, in DOMString keyArg, in unsigned long locationArg, in DOMString modifiersListArg, in boolean repeat);
-
Webkit/闪烁:
void initKeyboardEvent(in DOMString typeArg, in boolean canBubbleArg, in boolean cancelableArg, in views::AbstractView viewArg, in DOMString keyIndentifierArg, in unsigned long locationArg, in boolean ctrlKeyArg, in boolean altKeyArg, in boolean shiftKeyArg, in boolean metaKeyArg, in boolean altGraphKeyArg)
-
MSIE:
void initKeyboardEvent(in DOMString typeArg, in boolean canBubbleArg, in boolean cancelableArg, in views::AbstractView viewArg, in DOMString keyArg, in unsigned long locationArg, in DOMString modifierListArg, in boolean repeatArt, in DOMString locationArg);
规格说明:
initKeyboardEvent方法已弃用。事件构造函数语法[…]是用于初始化KeyboardEvent的预期未来语法。
然而,我找不到详细说明构造函数初始化的规范。在此之前,您可能需要使用此polyfill。
相关文章:
- 不使用jquery模拟Javascript中的按键
- 使用 Scrapy 模拟 JavaScript 按钮点击
- 是否可以在Java中模拟Javascript风格的原型
- 使用element.click()来模拟Javascript中的Button click
- 如何模拟JavaScript对象或数组中缺少的属性或元素
- 如何在 Mechanize 中模拟 javascript
- 是否有一组限制可用于模拟JavaScript中的函数式编程
- 在 Android 中使用多个 Web 视图来模拟 Javascript 线程
- 有没有更好的方法来模拟JavaScript中的指针
- 模拟 javascript 的数组方法.面向对象的Javascript,作者:Stoyan Stefanov
- 模拟JavaScript以从下拉列表中选择
- 如何在Ruby中模拟JavaScript的逐位操作中截断大整数
- 模拟javascript点击X,Y点(用于控制银光播放器)
- Iphone->如何模拟javascript点击操作
- 如何在webview中调用或模拟javascript函数
- 表单提交模拟- Javascript菜单
- 使用c#模拟javascript _dopostback
- 将网页上的模拟javascript终端窗口保持在固定位置
- 在没有setTimeout的情况下模拟JavaScript中的文本键入效果
- 如何通过移动用户的 href 链接模拟 javascript onClick 事件