我创建了一个 Blazor Web assembly 项目,并在 JavaScript 中添加了一个关键侦听器,该侦听器侦听 DOM 文档上的每个击键。一切都按预期进行,但是当我打开注册了密钥侦听器的 Blazor 页面并稍后再次打开它时,Web 浏览器中会出现以下错误:
没有 ID 为“2”的跟踪对象。也许 DotNetObjectReference 实例已经被释放。(参数“dotNetObjectId”)
显然,对象“dotnethelper”已被释放,但 Javascript 仍在侦听/被调用。
基本上,我实现了Microsoft 文档中的“组件实例 .NET 方法帮助器类” 。
注意:IDisposable 被注入到顶部,并且 Dispose 函数被调用。
@code {
private KeyListenerInvokeHelper _keyListenerInvokeHelper;
private DotNetObjectReference<KeyListenerInvokeHelper>? objRef;
protected override async Task OnInitializedAsync()
{
objRef = DotNetObjectReference.Create(_keyListenerInvokeHelper);
await JS.InvokeVoidAsync("initializeKeyListener", objRef);
}
public void Dispose()
{
objRef?.Dispose();
}
}
Run Code Online (Sandbox Code Playgroud)
window.initializeKeyListener = (dotnetHelper) => {
document.addEventListener('keydown', logKey);
function logKey(e) {
dotnetHelper.invokeMethod('OnKeyDown', e.key);
console.log('key down ' + e.key); …Run Code Online (Sandbox Code Playgroud) 任何人都知道窗口事件监听器应该持续多长时间?
我最初的想法是,任何附加到文档的内容可能在页面重新加载后丢失,而附加到窗口对象的那些我希望在页面重新加载时持续存在.
但是,测试似乎表明在重新加载页面时会破坏所有事件侦听器,这是正确的吗?