用JavaScript转发事件

Cha*_*l72 5 javascript events

有没有简单的方法可以在Javascript中“转发”事件?我的最终目标是通过以下方式增强UI响应能力:我有一个网站,其中只有一个输入文本字段,可将查询提交到后端数据库。如果用户在输入字段不清晰时按下某个键,则我想捕获文档级别的keypress事件,并将其转发到输入字段。(这似乎是提高UI响应能力的一种相当普遍的方法,例如Google在其主要搜索网站上执行此操作。)

所以我有一个像这样的文本输入字段:

<input id="query" onkeydown="f(event)">
Run Code Online (Sandbox Code Playgroud)

我尝试转发这样的事件:

function handler(ev)
{
    var query = document.getElementById("query");
    query.dispatchEvent(ev);
}

document.addEventListener("keydown", handler, false);
Run Code Online (Sandbox Code Playgroud)

现在,忽略了跨浏览器问题与addEventListenerdispatchEvent,这并不甚至在Firefox浏览器同时支持这些功能。Javascript解释器引发异常: Error: uncaught exception: [Exception... "Component returned failure code: 0x80070057 (NS_ERROR_ILLEGAL_VALUE) [nsIDOMEventTarget.dispatchEvent]"

那么,是否有可能转发这样的事件?还是我需要使用创建一个新事件initKeyEvent,然后将该事件分派到输入元素?

Wil*_*ilk 3

以下是键盘事件的示例:

HTML 文件(index.html):

<!DOCTYPE html>
<html>
    <head>
        <title>Stackoverflow</title>
        <script type="text/javascript" src="sof.js"> </script>
    </head>
    <body>
        <input id="query" onkeydown="f(event);"/>
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

JavaScript 文件(sof.js):

function simulateKeyDown () {
    // DOM Level 3 events
    var evt = document.createEvent ("KeyboardEvent");
    // DOM Level 3 events
    evt.initKeyboardEvent ("keydown", false, false, null, false, false, false, false, 0, 0);
    var query = document.getElementById ('query');
    query.dispatchEvent (evt);
}

window.onload = function () {
    document.addEventListener ('keydown', simulateKeyDown, false);
}

function f (ev) {
    console.log ('ciao');
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,当加载窗口时,它将一个新的处理程序附加到文档的keydown事件。当按下某个键时,将创建一个新的KeyboardEvent事件,并初始化(使用“keydown”),然后分派到输入元素。是的,它有点复杂,但它有效;)

欲了解更多信息:

  1. 创建事件
  2. 事件 initKeyEvent