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

仅为点击分类添加active类,需默认激活首个分类的技术实现问题

解决方案

咱们先从后端模板处理初始状态的active类,再通过前端JS实现点击切换的逻辑,一步步来:

1. 修正后端Blade模板(设置初始默认active)

你原来的代码里所有<li>都固定加了ative(应该是拼写错误,改成active),我们用Blade的循环变量$loop->first判断是否为第一个分类,只给它添加active类:

<ul>
    @foreach($categories->get() as $category)
        <!-- 仅第一个分类默认添加active类 -->
        <li class="{{ $loop->first ? 'active' : '' }}">
            <a href="#" name="category" id="{{ $category->id }}">{{ $category->name }}</a>
        </li>
    @endforeach
</ul>

2. 前端JS实现点击切换active类

接下来添加前端逻辑,确保点击分类时,移除所有分类的active类,只给当前点击的分类添加,同时保留你原本的文章加载功能:

方案A:原生JavaScript(无需依赖库)

// 获取所有分类链接
const categoryLinks = document.querySelectorAll('ul li a[name="category"]');

categoryLinks.forEach(link => {
    link.addEventListener('click', function(e) {
        // 阻止默认锚点跳转行为
        e.preventDefault();
        
        // 移除所有<li>的active类
        document.querySelectorAll('ul li').forEach(li => {
            li.classList.remove('active');
        });
        
        // 给当前点击的链接的父<li>添加active类
        this.parentElement.classList.add('active');
        
        // 调用你原本的文章加载函数,传入当前分类ID
        const categoryId = this.id;
        loadPostsByCategory(categoryId); // 替换成你实际的加载函数
    });
});

// 示例:假设你原本的文章加载函数(可根据实际需求调整)
function loadPostsByCategory(categoryId) {
    // 替换成你的实际接口地址
    fetch(`/api/posts?category=${categoryId}`)
        .then(res => res.json())
        .then(posts => {
            const postsContainer = document.getElementById('posts');
            // 渲染文章到容器
            postsContainer.innerHTML = posts.map(post => `
                <div class="post-item">
                    <h3>${post.title}</h3>
                    <p>${post.excerpt}</p>
                </div>
            `).join('');
        })
        .catch(err => console.error('加载文章失败:', err));
}

方案B:jQuery(项目已引入jQuery时用)

$('ul li a[name="category"]').on('click', function(e) {
    e.preventDefault();
    
    // 移除所有<li>的active类,给当前父<li>添加
    $('ul li').removeClass('active');
    $(this).parent('li').addClass('active');
    
    // 执行你原本的文章加载逻辑
    const categoryId = $(this).attr('id');
    $.ajax({
        url: '/your-posts-endpoint', // 替换成你的接口地址
        data: { category_id: categoryId },
        success: function(html) {
            $('#posts').html(html); // 假设后端返回渲染好的文章HTML
        },
        error: function(xhr) {
            console.error('加载失败:', xhr.responseText);
        }
    });
});

额外提示

  • 注意类名拼写:你原来的代码里写的是ative,要改成active,否则样式不会生效
  • 如果分类列表是动态生成的(比如后续通过AJAX新增分类),建议用事件委托绑定点击事件,避免新分类无点击效果:
    // 原生JS事件委托示例
    document.querySelector('ul').addEventListener('click', function(e) {
        const target = e.target;
        if (target.matches('a[name="category"]')) {
            e.preventDefault();
            this.querySelectorAll('li').forEach(li => li.classList.remove('active'));
            target.parentElement.classList.add('active');
            loadPostsByCategory(target.id);
        }
    });
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 10:08:33