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

求助:为何jQuery的.empty()方法无法清空已追加HTML元素的容器?

解决jQuery empty()方法对追加元素不生效的问题

嘿,我一眼就看出问题所在了——不是empty()没起作用,是你存储假期数据的数组从来没被清空过!

你看,你在事件外部声明了monthHolidayName这些数组,每次切换月份时,代码只是往数组里追加当前月份的新数据,之前月份的旧数据还留在数组里。虽然你调用了$("#holidays").empty()清空了页面元素,但接下来的循环会把数组里所有旧数据+新数据一起重新追加到页面上,看起来就像清空操作没生效一样。

修复方案:每次切换月份时先清空数组

把数组清空的代码放到change事件的最开头,这样每次切换都能从零开始收集当前月份的假期数据:

$('#monthSelect').change(function(){
    // 关键:先清空所有存储假期数据的数组
    monthHolidayName = [];
    monthHolidayDescription = [];
    monthHolidayDay = [];
    monthHolidayMonth = [];
    monthHolidayIsoDate = [];

    var selectedMonth = $('#monthSelect').val();
    var numSelectedMonth = parseInt(selectedMonth) + 1;

    for(i = 0; i < result['data']['holidays'].length; i++){
        var holidayMonth = result['data']['holidays'][i]['date']['datetime']['month'];
        if(holidayMonth === numSelectedMonth){
            monthHolidayName.push(result['data']['holidays'][i]['name']);
            monthHolidayDescription.push(result['data']['holidays'][i]['description']);
            monthHolidayDay.push(result['data']['holidays'][i]['date']['datetime']['day']);
            monthHolidayMonth.push(result['data']['holidays'][i]['date']['datetime']['month']);
            monthHolidayIsoDate.push(result['data']['holidays'][i]['date']['iso']);
        }
    }

    $("#holidays").empty();

    // 后续追加代码不变
    for(i = 0; i < monthHolidayName.length; i++){
        var holidayName = monthHolidayName[i];
        var holidayDescription = monthHolidayDescription[i];
        var holidayDay = monthHolidayDay[i];
        var holidayDayMonth = monthHolidayMonth[i];
        var holidayIsoDate = monthHolidayIsoDate[i];
        // 顺便修复你这里的日期格式化错误:Date.parse返回的是时间戳,不能直接调用toString带格式
        var date = new Date(holidayIsoDate);
        var dateParsed = date.toLocaleString('en-US', { month: 'long', day: 'numeric' }) 
                        // 手动添加序数词后缀(比如1st、2nd)
                        .replace(/\d+/, function(n) {
                            var s = ['th', 'st', 'nd', 'rd'];
                            var v = n % 100;
                            return n + (s[(v-20)%10] || s[v] || s[0]);
                        });

        $("#holidays").append(`<div class="list-group-item list-group-item-action"><div style="text-decoration: underline; text-align: center;">${holidayName}</div><div style="text-align: center">${holidayDescription}</div><small class="text-muted">${holidayIsoDate}</small></div>`);
    }
});

额外优化:用单个数组存储假期对象(更简洁)

其实你不需要声明这么多单独的数组,直接把符合条件的假期对象存到一个数组里,代码会更简洁易维护:

$('#monthSelect').change(function(){
    // 用一个数组存储当前月份的所有假期对象
    let currentMonthHolidays = [];
    var selectedMonth = $('#monthSelect').val();
    var numSelectedMonth = parseInt(selectedMonth) + 1;

    for(i = 0; i < result['data']['holidays'].length; i++){
        let holiday = result['data']['holidays'][i];
        if(holiday['date']['datetime']['month'] === numSelectedMonth){
            currentMonthHolidays.push(holiday);
        }
    }

    $("#holidays").empty();

    for(i = 0; i < currentMonthHolidays.length; i++){
        let holiday = currentMonthHolidays[i];
        var date = new Date(holiday['date']['iso']);
        var dateParsed = date.toLocaleString('en-US', { month: 'long', day: 'numeric' }) 
                        .replace(/\d+/, function(n) {
                            var s = ['th', 'st', 'nd', 'rd'];
                            var v = n % 100;
                            return n + (s[(v-20)%10] || s[v] || s[0]);
                        });

        $("#holidays").append(`<div class="list-group-item list-group-item-action"><div style="text-decoration: underline; text-align: center;">${holiday['name']}</div><div style="text-align: center">${holiday['description']}</div><small class="text-muted">${holiday['date']['iso']}</small></div>`);
    }
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 22:37:36