使用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.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
    });