【发布时间】:2019-08-16 17:00:21
【问题描述】:
我尝试在 Blazor 上编写一个简单的蛇游戏,但我找不到任何方法将我的事件绑定到文档上。
有机会在不同的元素上绑定事件,例如 div 或 input。
比如:<input onkeypress="@KeyPressInDiv"/>
在哪里public void KeyPressInDiv(UIKeyboardEventArgs ev)
{....}
我想,应该有一个 javascript 方法 document.onkeydown = function (evt) {} 的类比
我找到了几种解决此问题的方法:
1)使用JS进行绑定和调用blazor代码(取自https://github.com/aesalazar/AsteroidsWasm)
document.onkeydown = function (evt) {
evt = evt || window.event;
DotNet.invokeMethodAsync('Test.ClientSide', 'JsKeyDown', evt.keyCode);
//Prevent all but F5 and F12
if (evt.keyCode !== 116 && evt.keyCode !== 123)
evt.preventDefault();
};
document.onkeyup = function (evt) {
evt = evt || window.event;
DotNet.invokeMethodAsync('Test.ClientSide', 'JsKeyUp', evt.keyCode);
//Prevent all but F5 and F12
if (evt.keyCode !== 116 && evt.keyCode !== 123)
evt.preventDefault();
};
并在 c# 中实现一个静态类,其方法由 [JSInvokable] 和事件标记。
这项工作,但会导致每次印刷机都出现严重延迟
2) 这可以在其上添加输入标签和绑定事件。
这将比以前更快,但是:
- 它主要看起来像一个哈克然后是一个解决方案
- 我们无法捕捉到许多动作,例如向上/向下箭头
是否有直接绑定来自 blazor 的文档事件的方法?
更新 1:我创建了简单的项目以更好地解释我试图实现的目标。 https://github.com/XelMed/BlazorSnake
Snake 有 3 个实现:
1) 纯 js - 这是预期的行为
2) 使用带有 blazor 的 js - 从带有 JsInterop 的 JS 代码中调用 blazor 函数
3) 使用输入标签 - 控制 Snake 的输入标签上的绑定事件
【问题讨论】:
-
您看到了多少延迟?当我在 JS 和接收它的 C# 方法中记录按键时,我看不到超过 1-2 毫秒的差异。这就是日志语句——没有它们可能更少。