【问题标题】:JS keydown + keypress + preventDefaultJS keydown + keypress + preventDefault
【发布时间】:2022-01-25 14:25:36
【问题描述】:

我们有什么:

  1. keydown event + preventDefault 阻止 keypress event(证明:https://stackoverflow.com/a/57401334/9398364)
  2. stopPropagation 根本没有帮助
  3. 我们无法使用 dispatchEvent 模拟按键,因为我们不知道无法打印的 event.key 值的完整列表(我们不能使用 event.key.codePointAt(0) 将其作为 unicode 值抛出)

我们需要什么:

  1. 禁用默认浏览器按键反应(即tab 在 chrome 中按下)而无需巨大的开关表达式

  2. 检测keydown事件,因为我们需要shift、ctrl和其他按键事件 (event.code 很重要)

  3. 检测keypress事件,因为我们需要在没有input事件的情况下输入unicode字符(event.key很重要)和而不检查它是否是不可打印的字符(例如shift和@987654338 @)

怎么做?

更新: 似乎非 unicode event.key 的长度 >1(来源:https://stackoverflow.com/a/70401792/9398364) 有证据吗?

【问题讨论】:

  • 也许使用正则表达式(例如:/\w|\d|ctrl|shift/)测试 keydown 是否对您的应用程序有用,否则 preventDefault() ?
  • @JeanWill 即使可行,这也太脏且太慢了。我需要所有曾经存在过的钥匙

标签: javascript events


【解决方案1】:

这样解决:

    window.addEventListener('keydown', function (event)
        {
            onKeyboard(event.code);
            if (event.key.length === 1 && !event.ctrlKey && !event.metaKey)
            {
                const utf16Code = event.key.codePointAt(0);
                onKeyboardInput(utf16Code);
            }
            event.preventDefault();
        }, false);

【讨论】:

    猜你喜欢
    • 2011-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-14
    • 2013-04-01
    • 2011-11-17
    相关资源
    最近更新 更多