我正在尝试使用JavaScript在Safari中模拟键盘事件。
我已经尝试过:
var event = document.createEvent("KeyboardEvent");
event.initKeyboardEvent("keypress", true, true, null, false, false, false, false, 115, 0);
...还有这个:
var event = document.createEvent("UIEvents");
event.initUIEvent("keypress", true, true, window, 1);
event.keyCode = 115;
但是,在尝试了两种方法之后,我遇到了同样的问题:在执行代码之后,事件对象的keyCode
/ which
属性设置为0
,而不是115
。
有人知道如何在Safari中可靠地创建和调度键盘事件吗? (如果可能,我宁愿使用普通JavaScript来实现。)
我正在研究DOM Keyboard Event Level 3 polyfill。在最新的浏览器中或使用此polyfill,您可以执行以下操作:
element.addEventListener("keydown", function(e){ console.log(e.key, e.char, e.keyCode) })
var e = new KeyboardEvent("keydown", {bubbles : true, cancelable : true, key : "Q", char : "Q", shiftKey : true});
element.dispatchEvent(e);
//If you need legacy property "keyCode"
// Note: In some browsers you can't overwrite "keyCode" property. (At least in Safari)
delete e.keyCode;
Object.defineProperty(e, "keyCode", {"value" : 666})
UPDATE:
现在,我的polyfill支持旧版属性“ keyCode”,“ charCode”和“ which”
var e = new KeyboardEvent("keydown", {
bubbles : true,
cancelable : true,
char : "Q",
key : "q",
shiftKey : true,
keyCode : 81
});
示例here
另外这里是跨浏览器的initKeyboardEvent,与我的polyfill分开:(gist)
填充demo
您是否正确调度了事件?
function simulateKeyEvent(character) {
var evt = document.createEvent("KeyboardEvent");
(evt.initKeyEvent || evt.initKeyboardEvent)("keypress", true, true, window,
0, 0, 0, 0,
0, character.charCodeAt(0))
var canceled = !body.dispatchEvent(evt);
if(canceled) {
// A handler called preventDefault
alert("canceled");
} else {
// None of the handlers called preventDefault
alert("not canceled");
}
}
如果使用jQuery,则可以这样做:
function simulateKeyPress(character) {
jQuery.event.trigger({ type : 'keypress', which : character.charCodeAt(0) });
}
这是由于Webkit中的bug。
您可以使用createEvent('Event')
而不是createEvent('KeyboardEvent')
解决Webkit错误,然后分配keyCode
属性。参见this answer和this example。
Mozilla Developer Network提供以下说明:
event = document.createEvent("KeyboardEvent")
创建事件使用:
event.initKeyEvent (type, bubbles, cancelable, viewArg,
ctrlKeyArg, altKeyArg, shiftKeyArg, metaKeyArg,
keyCodeArg, charCodeArg)
yourElement.dispatchEvent(event)
] >>我在您的代码中看不到最后一个,也许正是您所缺少的。我希望这同样适用于IE ...
我对此不是很好,但是KeyboardEvent
=>参见KeyboardEvent用initKeyEvent
初始化。这是在<input type="text" />
元素上发出事件的示例