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

Laravel商城页AJAX筛选与Load More联动功能异常求助

问题修复方案

核心问题根因

  • 分页页码逻辑错误:点击加载更多完成后直接将page重置为1,且筛选条件变更时没有主动重置page为1。当你移除筛选条件时,page仍保留之前加载到的高页码,请求的页码超出了无筛选条件下的总页数,自然返回空数据。
  • DOM选择器不一致:beforeSend中清空的是#products节点,请求成功后写入的是#product节点,两者ID不匹配会导致内容渲染异常。
  • 加载更多的状态处理逻辑错误:加载更多完成后无需重置page,只有当筛选条件发生变化时才需要重置分页到第一页。

修复后的代码

前端JS逻辑

// 全局变量保留
var page = 1;
var isLoadMore = false; // 替换原clicked变量,语义更清晰

// 加载更多按钮点击事件
$("#load-btn").click( function(e) {
    e.preventDefault(); // 阻止submit按钮默认提交行为,必须添加
    page++;
    isLoadMore = true;
    filter();
});

// 注意:所有筛选条件变更(比如点击分类复选框)触发filter的位置,必须先重置page
// 示例:
// $(".category").change(function(){
//     page = 1; // 筛选条件变化,分页回到第一页
//     isLoadMore = false;
//     filter();
// })

function filter() {
    var url = '{{ route("front.shop.filter") }}';
    var categories = [];
    $(".category:checked").each(function(){
        categories.push($(this).val());
    });
          
    $.ajax({
        url: url,
        data: {
            categories:categories,
            page: page
        },
        type: 'post',
        beforeSend:function(){
            $('.load-more').show();
            if(!isLoadMore){
                $('#products').html(''); // 统一使用#products选择器
            }
        }
    }).done(function(data){
        setTimeout(function(){ 
            $('.load-more-skelton').hide();
            if(isLoadMore){
                $('#products').append(data.view);
                isLoadMore = false;
                // 此处不要重置page,加载更多完成后保留当前页码,下次点击继续累加
            } else {
                $('#products').html(data.view);
            }
            // 基础优化:返回内容为空时隐藏加载更多按钮
            if($.trim(data.view) == '') {
                $("#load-btn").hide();
            } else {
                $("#load-btn").show();
            }
        }, 1500);
    }).fail(function(){
        // 请求失败时回退页码,避免跳页
        if(isLoadMore) {
            page--;
            isLoadMore = false;
        }
    });
}

后端可选优化

如果需要更精准控制加载更多按钮的显隐,可以调整后端返回总页数:

public function filters(Request $request)
{
    $products = Product::where('status' , 'active');
    if($request->categories){
        $products = $products->whereIn('category_id',$request->categories);
    } 
    $products = $products->latest()->paginate(8);
    $view = view('front.includes.view',compact('products'))->render();
    return response()->json([
        'view' => $view,
        'total_page' => $products->lastPage() // 新增返回总页数
    ]); 
}

前端拿到total_page字段后,判断当page >= total_page时隐藏加载更多按钮即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 18:24:01