监听整个 Blazor 页面中的键盘输入

edu*_*nio 8 event-handling dom-events blazor blazor-webassembly

我正在尝试实现一个始终监听键盘输入的 Blazor 应用程序(比如说某种全屏游戏)。

我可以将按键事件侦听器视为其可能的实现,因为实际上并没有可以自动聚焦的输入字段。

是否有更好的解决方案来对屏幕任何部分的按键做出反应?

如果这是所选的一个,如何从客户端 Blazor 应用添加事件侦听器?我尝试通过这样的脚本来做到这一点失败了:

编辑:我对下面的代码进行了一些修改,以使其在修复我所询问的原始关键错误后真正起作用。

scripts/event-listener.js

window.JsFunctions = {
    addKeyboardListenerEvent: function (foo) {
        let serializeEvent = function (e) {
            if (e) {
                return {
                    key: e.key,
                    code: e.keyCode.toString(),
                    location: e.location,
                    repeat: e.repeat,
                    ctrlKey: e.ctrlKey,
                    shiftKey: e.shiftKey,
                    altKey: e.altKey,
                    metaKey: e.metaKey,
                    type: e.type
                };
            }
        };

        // window.document.addEventListener('onkeydown', function (e) { // Original error
        window.document.addEventListener('keydown', function (e) {
            DotNet.invokeMethodAsync('Numble', 'JsKeyDown', serializeEvent(e))
        });
    }
};

Run Code Online (Sandbox Code Playgroud)

index.html

<head>
    <!--  -->
    <script src="scripts/event-listener.js"></script>
</head>
Run Code Online (Sandbox Code Playgroud)

通过以下方式调用它:

protected async override Task OnAfterRenderAsync(bool firstRender)
{
    await jsRuntime.InvokeVoidAsync("JsFunctions.addKeyboardListenerEvent");
}
Run Code Online (Sandbox Code Playgroud)

并使用以下方法尝试接收事件:

using Microsoft.AspNetCore.Components.Web;
using Microsoft.JSInterop;

namespace Numble;

public static class InteropKeyPress
{
    [JSInvokable]
    public static Task JsKeyDown(KeyboardEventArgs e)
    {
        Console.WriteLine("***********************************************");
        Console.WriteLine(e.Key);
        Console.WriteLine("***********************************************");

        return Task.CompletedTask;
    }
}
Run Code Online (Sandbox Code Playgroud)

我设法执行脚本,但没有收到任何事件。

Jes*_*ood 5

事件的名称是keydown,不是onkeydown

  • `:facepalm:` 非常感谢,就是这样 (2认同)