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

Blazor应用中菜单需两次点击才能激活的问题如何解决

问题根因

你当前的代码逻辑存在事件绑定时序错误,和Blazor框架无关:

  • 你将ActiveTest方法绑定在了ul元素的点击事件上,首次点击菜单项时,只会先执行ActiveTest给所有<a>标签绑定点击回调,本次点击不会触发刚刚绑定的<a>点击事件
  • 第二次点击菜单项时,<a>标签已经完成了事件绑定,所以能正常触发高亮逻辑

修复方案

1. 修改HTML代码

移除ul标签上的onclick="ActiveTest()"属性:

<div>
   <ul class="nav">
      <li>
         <a href="#" class="active">
         <i class="fas fa-home"></i>
         <span class="name">Home</span>
         </a>
      </li>
      <li>
         <a href="#">
         <i class="fas fa-book-reader"></i>
         <span class="name">Reader</span>
         </a>
      </li>
      ...
   </ul>
</div>

2. 调整JS绑定逻辑

通用JS写法

页面加载完成后直接绑定菜单点击事件即可:

$(function () {
    $(".nav li a").click(function () {
        $(".nav li a").removeClass("active");
        $(this).addClass("active");
    });
});

适配Blazor的写法

如果是Blazor项目,建议在组件的OnAfterRenderAsync生命周期中调用绑定逻辑,避免DOM未渲染完成导致绑定失效:
首先修改JS代码,增加解绑逻辑避免重复绑定:

function initNavActive() {
    $(".nav li a").off('click').on('click', function () {
        $(".nav li a").removeClass("active");
        $(this).addClass("active");
    });
}

然后在对应Blazor组件的代码中添加初始化调用:

protected override async Task OnAfterRenderAsync(bool firstRender)
{
    if (firstRender)
    {
        await JSRuntime.InvokeVoidAsync("initNavActive");
    }
}

内容的提问来源于stack exchange,提问作者richard wallace

相关产品推荐
方舟 Agent Plan

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

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