【问题标题】:Is it possible to trigger a key event on the DOM Window with Javascript/JQuery是否可以使用 Javascript/JQuery 在 DOM 窗口上触发关键事件
【发布时间】:2011-12-15 20:19:52
【问题描述】:

是否可以在 javascript 中触发 DOMWindow 或 DOMDocument 上的关键事件?基本上,我正在创建一个浏览器扩展来与网站交互,并且它们在执行特定操作时具有快捷键事件(类似于 GMail)。我发现了其他关于如何正确触发关键事件的帖子(Definitive way to trigger keypress events with jQuery),但是在将关键事件发送到文档/窗口时它们似乎不起作用。

到目前为止我已经尝试过:

var evt = document.createEvent("KeyboardEvent");
evt.initKeyboardEvent("keydown", true, true, window, false, false, false, false, 0, "o".charCodeAt(0))
window.document.dispatchEvent(evt);

和一个 jQuery 实现:

$(document).trigger({ type: 'keydown', which: "0".charCodeAt(0) });

我也试过连续做“keydown”、“keypress”和“keyup”,但也没有用。

任何帮助将不胜感激!

提前致谢。

【问题讨论】:

    标签: javascript jquery events triggers keyevent


    【解决方案1】:

    我知道您可以在使用 trigger() 时传递额外的参数,但我不确定您是否可以覆盖 event 对象的属性。你可以像这样传递数据:

    $(document).on('keydown keyup keypress', function (event, characterCode) {
        if (typeof(characterCode) == 'undefined') {
            characterCode = -1;
        }
        console.log('type = ' + event.type);
        console.log('characterCode = ' + characterCode);
    });
    

    这将是trigger() 代码:

    $(document).trigger('keydown', [ "0".charCodeAt(0) ]);
    

    这是一个演示:http://jsfiddle.net/A7cEE/(查看控制台的日志)

    您提供的 stackoverflow 答案中的代码似乎可以正常工作:

    捕捉:

    $(document).on('keydown', function (event) {
        console.log('type = ' + event.type);
        console.log('keyCode = ' + event.keyCode);
    });
    

    触发:

    var e = jQuery.Event('keydown');
    e.keyCode = "0".charCodeAt(0);
    $(document).trigger(e);
    

    演示:http://jsfiddle.net/A7cEE/1/

    请注意,.on() 是 jQuery 1.7 中的新内容,在这种情况下与 .bind() 相同。

    【讨论】:

    • 嗯,你说得对,它似乎确实在使用标准 JS,但不幸的是我试图在扩展程序(Chrome、Safari 和 FF)中运行 JS,并且由于某种原因,关键事件正在发生被阻止。我让它们在“内容”脚本中运行。我猜扩展 API 中有一些东西会阻止它们。
    【解决方案2】:

    试试这个:

    var evt = document.createEvent("KeyboardEvent");
    evt.initKeyEvent ("keydown", true, true, window, false, false, false, false, 0, "o".charCodeAt(0))
    window.document.dispatchEvent(evt);
    

    语法:

    event.initKeyEvent (type, bubbles, cancelable, viewArg, 
                        ctrlKeyArg, altKeyArg, shiftKeyArg, metaKeyArg, 
                        keyCodeArg, charCodeArg) 
    

    使用“initKeyEvent”而不是“initKeyboardEvent”。

    【讨论】:

      【解决方案3】:
      //::jQuery::
      //press "L" or "l" to open Bootstrap Login Modal Form
      $(document).keypress(function(evt){
        if (evt.charCode === 108 || evt.charCode == 76) {
          $('#login-modal')
            .modal('bs.modal.shown');
        }
      });
      

      祝你好运。

      【讨论】:

        猜你喜欢
        • 2021-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-02
        • 1970-01-01
        相关资源
        最近更新 更多