You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Blazor JSInterop 间歇性找不到'search'函数异常问题求助

问题根源

  1. 异常未被拦截导致应用崩溃:你的catch块末尾存在throw;语句,会将已经捕获的异常重新抛出,直接导致应用终止运行,这是try-catch未达到预期效果的直接原因。
  2. 偶现找不到search函数:快速刷新页面时,Blazor服务端的渲染逻辑执行到OnAfterRenderAsync时,你的自定义JS文件还未完成加载,search函数尚未挂载到window全局对象上,因此JSInterop调用时会提示方法未定义。你在catch块中再次调用时刚好JS加载完成,所以功能可以正常执行,但之前抛出的异常依然会导致应用崩溃。
  3. 额外隐藏问题:当前代码没有判断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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 04:15:05