使用JavaScript在Safari中触发键盘事件
我正在尝试使用JavaScript在Safari中模拟键盘事件 我试过这个:使用JavaScript在Safari中触发键盘事件,javascript,safari,webkit,dom-events,keyboard-events,Javascript,Safari,Webkit,Dom Events,Keyboard Events,我正在尝试使用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.initUIEven
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
/属性设置为0
,而不是115
有人知道如何在Safari中可靠地创建和调度键盘事件吗?(如果可能的话,我更喜欢用纯JavaScript实现。)提供了以下解释:
使用event=document.createEvent(“KeyboardEvent”)
初始化keyevent
使用:
event.initKeyEvent (type, bubbles, cancelable, viewArg,
ctrlKeyArg, altKeyArg, shiftKeyArg, metaKeyArg,
keyCodeArg, charCodeArg)
使用yourElement.dispatchEvent(事件)
我看不到你代码中的最后一个,也许这就是你缺少的。我希望这也适用于IE…您是否正确地发送了事件
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) });
}
我正在工作。在最新的浏览器中或使用此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”
例子
此外,以下是与my polyfill不同的跨浏览器initKeyboardEvent:
Polyfill这是由于Webkit中存在漏洞
您可以使用createEvent('Event')
而不是createEvent('KeyboardEvent')
来解决Webkit错误,然后分配keyCode
属性。请参阅和。我不太擅长此功能,但键盘事件
=>请参阅
用initKeyEvent
初始化
下面是一个在
元素上发出事件的示例
document.getElementById(“txbox”).addEventListener(“按键”,函数(e){
警报(“事件”+e.type+”已发出!\nKey/Char代码:“+e.keyCode+”/“+e.charCode”);
},假);
document.getElementById(“btn”).addEventListener(“单击”,函数(e){
var doc=document.getElementById(“txbox”);
var kEvent=document.createEvent(“KeyboardEvent”);
initKeyEvent(“按键”,真,真,空,假,假,假,假,假,74,74);
文件调度事件(kEvent);
},假)代码>
您是在尝试执行您定义的代码还是浏览器理解的某个键组合?如果它是您自己的代码,那么最好设置一个事件包装器,您可以通过“真实”键盘界面或其他事件生成器调用它,如您在这里所述。在这个例子中,我试图模拟用户按“s”键。最终,我尝试在苹果仪表板小部件中模拟用户按下Command-R。您的代码解决了我的问题:)@acidzombie24:我的荣幸!:)不幸的是,Mozilla的实现是非标准的。至于第3点,我的问题是创建正确的事件,并在事件发生之后进行调度。而且,因为我是为苹果的仪表板开发的,所以我根本不用担心IE!(哇塞!).initKeyEvent
现在不推荐使用此选项来模拟control+C(复制快捷方式)?@claudiopro是的,您是对的,应该是(evt.initKeyEvent | | evt.initKeyboardEvent)。调用(evt,//etc.
initKeyboardEvent在Chromium中也不起作用。event.keyCode
和event.which
始终返回0。这是一个值,解决方法是使用常规事件var event=document.createEvent('event');event.initEvent('keydown',true,true);event.keyCode=76;
被否决:initKeyEvent
和initKeyboardEvent
已被否决。@K.\u不是对以前运行的答案进行否决,而是声明该答案已被否决,应该足以让每个人都清醒过来,而不会产生负面影响。此答案使用的是现代键盘事件“使用箭头键或page up/down键使可滚动区域向下滚动似乎不起作用…将您的JSFIDLE更改为在textbox上而不是在document@上发送事件。虽然它触发按键处理程序,但文本不会显示在textbox中。有什么想法吗?@termi您的演示链接已失效,似乎无法更改输入的值。”(text)元素。删除运算符的操作数不能是只读属性。它显示js:21TypeError:kEvent.initKeyEvent不是函数。(在“kEvent.initKeyEvent”(“keypress”,true,true,null,false,false,false,74,74)”中,“kEvent.initKeyEvent”未定义)
(它应该是:var-kEvent=document.createEvent(“KeyboardEvent”);kEvent.initKeyboardEvent(“keypress”),true,true,null,false,false,false,false,false,74,74);document.dispatchEvent(kEvent);
var e = new KeyboardEvent("keydown", {
bubbles : true,
cancelable : true,
char : "Q",
key : "q",
shiftKey : true,
keyCode : 81
});