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

Laravel项目中日期选择器切换时添加加载GIF的实现方法

问题

我开发了一个展示统计数据的Laravel应用,前端Blade模板里有6个统计小部件,每个对应一项统计数据,比如总订单数的小部件代码如下:

<div class="row mt-3" id="shopify_row1">
        <div class="col-md-2" id="shopify_widget1">
            <div class="jumbotron bg-dark text-white">
                <img class="img-fluid pull-left" src="https://cdn0.iconfinder.com/data/icons/social-media-2092/100/social-35-512.png" width="32" height="32">
                <h6 class="text-secondary mt-2 px-4">Shopify</h6>
                <hr class="border border-white">
                <h5 class="text-white">Total Orders</h5>
                <span class="tot_o" id="tot_o">{{ $tot_o }}</span> 
            </div>
        </div>
</div>

初始状态下所有小部件显示当日统计数据。我添加了日期选择器来获取指定日期的数据:

<td>
      <input id="date" class="date form-control" type="date">
</td>

对应的jQuery代码如下,目前功能正常,但需要添加加载GIF效果,在日期切换后、数据更新完成前显示动画:

<script>
        $(document).on('change', '#date', function (e) {

        $.ajaxSetup({
            headers: {
                'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
            }
        });

        $.ajax({
            type: 'GET',
            url : '/shopify_data',
            data : {selected_date : $('#date').val()},
            success:function(data){

            $('#tot_o').empty(); 
            $('#tot_sum').empty(); 
            $('#avg_ov').empty(); 
            $('#cus').empty();
            $('#item_sum').empty();
            $('#orders').empty();
            var total_orders = data.tot_o;
            var total_sales = data.sum;
            var currency = data.crr;
            var avg_ov = data.avg_ov;
            var cus = data.cus;
            var item_sum = data.item_sum;
            var orders = data.orders;
            $('#tot_o').append(total_orders);
            $('#tot_sum').append(total_sales);
            $('#avg_ov').append(avg_ov);
            $('#cus').append(cus);
            $('#item_sum').append(item_sum);
            $('#orders').append(orders);
            //console.log(total_orders);

            },
            timeout:10000
        });

    });    
    </script>
解决方案

要实现加载GIF效果,需要在AJAX请求的不同阶段处理动画的显示与隐藏,具体修改如下:

1. 准备加载动画资源

先准备好加载GIF图片,放到项目的静态资源目录(比如public/images/loading.gif),也可以直接使用base64格式的动画图片避免额外请求。

2. 修改jQuery代码

核心逻辑:

  • 在AJAX请求发起前,把所有统计数据容器替换为加载动画
  • 请求成功后,替换为真实数据;请求失败/超时后,显示友好提示

修改后的完整代码:

<script>
$(document).on('change', '#date', function (e) {
    $.ajaxSetup({
        headers: {
            'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
        }
    });

    // 定义所有统计容器的选择器集合
    const statContainers = ['#tot_o', '#tot_sum', '#avg_ov', '#cus', '#item_sum', '#orders'];
    // 定义加载动画的HTML片段
    const loadingHtml = '<img src="/images/loading.gif" alt="加载中" width="24" height="24">';

    // 第一步:清空所有统计容器,显示加载动画
    statContainers.forEach(container => {
        $(container).html(loadingHtml);
    });

    $.ajax({
        type: 'GET',
        url: '/shopify_data',
        data: {selected_date: $('#date').val()},
        success: function(data) {
            // 请求成功:替换为真实统计数据
            $('#tot_o').text(data.tot_o);
            $('#tot_sum').text(data.sum);
            $('#avg_ov').text(data.avg_ov);
            $('#cus').text(data.cus);
            $('#item_sum').text(data.item_sum);
            $('#orders').text(data.orders);
        },
        error: function() {
            // 请求失败:显示加载失败提示
            statContainers.forEach(container => {
                $(container).text('加载失败');
            });
        },
        timeout: 10000,
        complete: function() {
            // 可选:无论成功失败,都可以在这里执行收尾操作
        }
    });
});    
</script>

3. 优化样式(可选)

为了让加载动画在小部件里居中显示,可以给统计容器添加CSS样式:

.tot_o, .tot_sum, .avg_ov, .cus, .item_sum, .orders {
    display: flex;
    align-items: center;
    justify-content: center;
    min-height: 30px;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 20:55:25