我正在尝试使用JavaScript在Safari中模拟键盘事件。
我已经尝试过了:
var event = document.createEvent("KeyboardEvent");
event.initKeyboardEvent("keypress", true, true, null, false, false, false, false, 115, 0);
...and也是这样的:
var event = document.createEvent("UIEvents");
event.initUIEvent("keypress", true, true, window, 1);
event.keyCode = 115;
但是,在尝试了这两种方法之后,我遇到了相同的问题:在执行代码之后,事件对象的keyCode
/which
属性被设置为0
,而不是115
。
有人知道如何在Safari中可靠地创建和分派键盘事件吗?(如果可能的话,我更喜欢用纯JavaScript实现它。)
发布于 2012-08-09 22:44:48
我正在研究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})
更新:
现在我的polyfill支持遗留属性"keyCode“、"charCode”和"which“
var e = new KeyboardEvent("keydown", {
bubbles : true,
cancelable : true,
char : "Q",
key : "q",
shiftKey : true,
keyCode : 81
});
示例here
另外,这里是与我的polyfill分开的跨浏览器initKeyboardEvent:(gist)
Polyfill demo
发布于 2011-05-07 17:26:23
您是否正确地调度了事件?
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) });
}
发布于 2013-01-23 05:43:28
这是由于Webkit中的bug造成的。
您可以使用createEvent('Event')
而不是createEvent('KeyboardEvent')
来解决Webkit错误,然后分配keyCode
属性。参见this answer和this example。
https://stackoverflow.com/questions/961532
复制相似问题