Blazor JSInterop 间歇性找不到'search'函数异常问题求助
问题根源
- 异常未被拦截导致应用崩溃:你的catch块末尾存在
throw;语句,会将已经捕获的异常重新抛出,直接导致应用终止运行,这是try-catch未达到预期效果的直接原因。 - 偶现找不到
search函数:快速刷新页面时,Blazor服务端的渲染逻辑执行到OnAfterRenderAsync时,你的自定义JS文件还未完成加载,search函数尚未挂载到window全局对象上,因此JSInterop调用时会提示方法未定义。你在catch块中再次调用时刚好JS加载完成,所以功能可以正常执行,但之前抛出的异常依然会导致应用崩溃。 - 额外隐藏问题:当前代码没有判断
firstRender参数,每次页面渲染都会重复调用search函数,会给#myInput重复绑定keyup事件,导致搜索逻辑被多次触发,影响性能。
解决方案
- 移除catch块中的
throw;语句,不需要重新抛出异常即可避免应用因此崩溃。 - 调整JS代码定义,确保函数挂载到全局作用域:将JS函数修改为显式挂载到window对象,避免作用域问题导致全局找不到函数:
window.search = function(){ $(document).ready(function () { $("#myInput").on("keyup", function () { var value = $(this).val().toLowerCase(); $('div[data-role="apps"]').filter(function () { $(this).toggle($(this).text().toLowerCase().indexOf(value) > -1) }); }); }); }
- 增加JS加载判断逻辑,调用前先确认函数是否存在,避免偶现加载时序问题:
protected override async Task OnAfterRenderAsync(bool firstRender) { // 只在首次渲染完成后调用,避免重复绑定事件 if (!firstRender) return; try { // 先判断search函数是否存在 var isSearchFuncExist = await Js.InvokeAsync<bool>("eval", "typeof window.search === 'function'"); if (isSearchFuncExist) { await Js.InvokeVoidAsync("search"); } else { // 可选:延迟200ms后重试1次,适配JS加载慢的场景 await Task.Delay(200); await Js.InvokeVoidAsync("search"); } } catch (Exception e) { ErrorIsHidden = false; ErrorDescription = e.ToString(); StateHasChanged(); // 移除throw语句,不再向上抛出异常 } }
- 也可以直接将这段JS代码内联到页面文件(_Host.cshtml/Layout.cshtml)的body末尾,确保JS函数在页面初始化时就完成加载,彻底避免时序问题。
内容的提问来源于stack exchange,提问作者user7422837
相关产品推荐
相关产品推荐

