使用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

我正在尝试使用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/事件对象的哪些属性被设置为0,而不是115

有人知道如何在Safari中可靠地创建和调度键盘事件吗?如果可能的话,我更喜欢用纯JavaScript实现它。

提供了以下解释:

使用event=document.createEventKeyboardEvent创建事件 初始化keyevent 使用:

event.initKeyEvent (type, bubbles, cancelable, viewArg, 
       ctrlKeyArg, altKeyArg, shiftKeyArg, metaKeyArg, 
           keyCodeArg, charCodeArg)
使用yourElement.dispatchEventevent
我看不到你代码中的最后一个,也许这就是你缺少的。我希望这也适用于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

var e = new KeyboardEvent("keydown", {
    bubbles : true,
    cancelable : true,
    char : "Q",
    key : "q",
    shiftKey : true,
    keyCode : 81
});
例子

此外,以下是与my polyfill不同的跨浏览器initKeyboardEvent:

Polyfill

这是由于Webkit中存在漏洞


您可以使用createEvent'Event'而不是createEvent'KeyboardEvent'来解决Webkit错误,然后分配keyCode属性。请参阅和。

我对此不太擅长,但KeyboardEvent=>请参阅 使用initKeyEvent初始化。 下面是一个在元素上发出事件的示例 document.getElementByIdtxbox.addEventListenerkeypress,函数E{ alertEvent+e.type+已发出!\nKey/Char代码:+e.keyCode+/+e.charCode; },假; document.getElementByIdbtn.AddEventListener单击,函数E{ var doc=document.getElementByIdtxbox; var kEvent=document.createEventKeyboardEvent; kEvent.initKeyEventkeypress,真,真,空,假,假,假,假,74,74; doc.dispatchEventkEvent; },假;
您是否正在尝试执行您定义的代码或浏览器理解的某个键组合?如果它是您自己的代码,那么最好设置一个事件包装器,您可以通过真正的键盘接口或其他事件生成器调用它,正如您在这里描述的那样。在这个例子中,我试图模拟用户按下s。最终,我尝试在苹果仪表板小部件中模拟用户按下Command-R。您的代码解决了我的问题:@acidzombie24:我的荣幸!:不幸的是,Mozilla的实现是非标准的。至于第3点,我的问题是创建正确的事件,并在事件发生之后进行调度。而且,因为我是为苹果的仪表板开发的,所以我根本不用担心IE!哇!。initKeyEvent现在不推荐使用它来模拟control+C复制快捷方式?@claudiopro是的,你是对的,它应该是evt.initKeyEvent | | evt.initKeyboardEvent.callevt,//等等。initKeyboardEvent在Chromium中也不起作用。event.keyCode和event.whichalways返回0。这是一个事件,解决方法是使用常规事件var event=document.createEvent'event';initEvent'keydown',true,true;event.keyCode=76;被否决:initKeyEvent和initKeyboardEvent已被否决。@K.\u与其对以前有效的答案进行否决,不如声明该答案已被否决,这样就足以让每个人都清醒过来,而不会对Carter造成负面影响。这个答案使用了现代键盘事件,它似乎不适用于使用箭头键或page up/down键使可滚动区域向下滚动…将JSFIDLE更改为在textbox而不是document@上发送事件。虽然它触发按键处理程序,但文本不会显示在文本框中。有什么想法吗?@termi您的演示链接已失效,似乎也无法更改输入文本元素的值。删除运算符的操作数不能是只读属性。它显示js:21TypeError:kEvent.initKeyEvent不是函数。在“kEvent.initKeyEventkeypress,true,true,null,false,false,false,74,74”中,“kEvent.initKeyEvent”在safari中未定义:它应该是:var-kEvent=document.createEventKeyboardEvent;kEvent.initKeyboardEventkeypress,真,真,空,假,假,假,假,74,74;document.dispatchEventkEvent;