You need to enable JavaScript to run this app. 如何在DHTMLX Gantt甘特图中实现自定义日期范围筛选功能
优惠活动
大模型
产品
解决方案
定价
更多

如何在DHTMLX Gantt甘特图中实现自定义日期范围筛选功能

实现DHTMLX Gantt自定义日期范围筛选操作步骤

1. 修改HTML添加日期筛选下拉组件

找到你页面中filters_wrapper容器的代码,新增日期筛选下拉框,修改后代码如下:

<div style='height:20px; padding:5px;'>
    <div class="filters_wrapper" id="filters_wrapper">
        Search Projects:
        <input type="text" name="a12" value="" id="a12" oninput='gantt.$doFilter(this.value)' style="width: 100px;"/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        日期筛选:
        <select id="dateFilter" onchange="handleDateFilterChange(this.value)" style="width: 150px;">
            <option value="">全部</option>
            <option value="lastYear">Last Year</option>
            <option value="currentYear">Current Year</option>
            <option value="last6Months">Last 6 Months</option>
            <option value="last2Quarters">Last 2 Quarters</option>
            <option value="nextYear">Next Year</option>
        </select>
    </div>
</div>

2. 新增JS日期范围处理逻辑

在你现有JS代码的全局变量区域(比如filterValue变量定义的位置),新增以下代码:

// 存储当前选中的日期范围
let dateRangeStart = null;
let dateRangeEnd = null;

// 根据筛选类型计算对应日期范围
function getDateRangeByType(type) {
    const now = new Date();
    const currentYear = now.getFullYear();
    let start, end;
    switch(type) {
        case 'lastYear':
            start = new Date(currentYear - 1, 0, 1);
            end = new Date(currentYear - 1, 11, 31, 23, 59, 59);
            break;
        case 'currentYear':
            start = new Date(currentYear, 0, 1);
            end = new Date(currentYear, 11, 31, 23, 59, 59);
            break;
        case 'last6Months':
            start = new Date(now);
            start.setMonth(now.getMonth() - 6);
            end = new Date(now, 23, 59, 59);
            break;
        case 'last2Quarters':
            const currentQuarter = Math.floor(now.getMonth() / 3);
            // 计算两个季度前的开始月份
            let startQuarter = currentQuarter - 2;
            let startYear = currentYear;
            if (startQuarter < 0) {
                startQuarter += 4;
                startYear -= 1;
            }
            start = new Date(startYear, startQuarter * 3, 1);
            // 上个季度的最后一天
            end = new Date(currentYear, currentQuarter * 3, 0, 23, 59, 59);
            break;
        case 'nextYear':
            start = new Date(currentYear + 1, 0, 1);
            end = new Date(currentYear + 1, 11, 31, 23, 59, 59);
            break;
        default:
            start = null;
            end = null;
    }
    return {start, end};
}

// 下拉框变化事件处理
function handleDateFilterChange(type) {
    const range = getDateRangeByType(type);
    dateRangeStart = range.start;
    dateRangeEnd = range.end;
    // 重新渲染甘特图触发筛选
    gantt.render();
}

3. 修改原有onBeforeTaskDisplay事件逻辑,合并文本和日期筛选规则

你原有代码里的onBeforeTaskDisplay事件存在死代码(return之后的逻辑永远不会执行),替换为以下代码:

gantt.attachEvent("onBeforeTaskDisplay", function(id, task){
    // 先做文本筛选
    if (filterValue) {
        const normalizedText = task.text.toLowerCase();
        const normalizedValue = filterValue.toLowerCase();
        if (normalizedText.indexOf(normalizedValue) === -1) {
            return false;
        }
    }
    // 再做日期筛选
    if (dateRangeStart && dateRangeEnd) {
        // 任务的结束时间 >= 筛选开始时间 且 任务的开始时间 <= 筛选结束时间,即存在时间交集就展示
        const taskEnd = gantt.calculateEndDate(task.start_date, task.duration);
        if (taskEnd < dateRangeStart || task.start_date > dateRangeEnd) {
            return false;
        }
    }
    return true;
});

功能验证

修改完成后刷新页面即可测试:选择对应日期筛选选项,甘特图会自动过滤展示时间匹配的任务,同时支持文本搜索和日期筛选叠加使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 18:00:04