HTML+js实现日历课程表

这几天工作中有一个需求是做一个课程表,需要通过日历的形式展示出来。

一开始想着在网上寻找有无相关例子借鉴一下,只找到通过vue方式实现的案例。当前项目框架前端是html实现的,自己码了一下发到这里供大家参考。

一、html模块

<div class="container-div">
    <div class="row">
        <div class="col-sm-12 search-collapse">
            <form id="formId">
                <div class="select-list">
                    <ul>
                        <li>
                            <p><span th:text="#{courseinfo.catalog.courseType}">课程类型</span></p>
                            <select name="courseType" th:with="type=${@dict.getType('coursemanage_course_type')}">
                                <option value="">[[#{common.please.select}]]</option>
                                <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
                            </select>
                        </li>
                        <li>
                            <p><span th:text="#{courseinfo.catalog.courseName}">课程名称</span></p>
                            <input type="text" name="courseName" id="courseName"/>
                        </li>

                            <p><span th:text="#{courseinfo.catalog.dates}">课程日期</span></p>
                            <input type="text" class="time-input" id="beginCourseDate" placeholder="开始时间"
                                   name="beginCourseDate"/>
                            <span>-</span>
                            <input type="text" class="time-input" id="endCourseDate" placeholder="结束时间"
                                   name="endCourseDate"/>
                        </li>

                    </ul>
                </div>
            </form>
        </div>

        <div class="btn-group-sm" id="toolbar" role="group">
            <a class="btn btn-primary btn-rounded btn-sm" onclick="query()"><i class="fa fa-search"></i>&nbsp;&nbsp;<span
                    th:text="#{common.search}">search</span></a>
            <a class="btn btn-warning btn-rounded btn-sm" onclick="reset()"><i class="fa fa-refresh"></i>&nbsp;&nbsp;<span
                    th:text="#{common.reset}">reset</span></a>
            <a class="btn btn-success" onclick="add()" shiro:hasPermission="courseinfo:routine:add">
                <i class="fa fa-plus"></i> &nbsp;&nbsp;<span th:text="#{common.add}"></span>
            </a>
        </div>
        <br>
        <div id="calendar"></div>
    </div>

</div>

二、js模块

1.课程表的初始化

    function initCalendar() {

        var calendar = document.getElementById('calendar');

        if (calendar.firstChild) {
            calendar.removeChild(calendar.firstChild);
        }

        // 获取用户输入的日期
        var inputDate = document.getElementById('beginCourseDate').value;
        var today = new Date();

        // 如果用户输入了日期,则使用该日期;否则使用当前日期
        if (inputDate) {
            var dateParts = inputDate.split('-');
            var year = parseInt(dateParts[0]);
            var month = parseInt(dateParts[1]) - 1;
        } else {
            var year = today.getFullYear();
            var month = today.getMonth();
        }


        // 获取当前月份的天数
        var daysInMonth = new Date(year, month + 1, 0).getDate();
        // 计算当前月份的第一天是星期几
        var firstDayOfMonth = new Date(year, month, 1).getDay();

        // 创建表格
        var table = document.createElement('table');
        var tbody = document.createElement('tbody');

        // 添加表头
        var headerRow = document.createElement('tr');
        var daysOfWeek = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'];
        for (var i = 0; i < 7; i++) {
            var th = document.createElement('th');
            th.textContent = daysOfWeek[i];
            headerRow.appendChild(th);
        }
        tbody.appendChild(headerRow);

        // 添加日期
        var row = document.createElement('tr');
        var day = 1;
        // 添加第一行的空单元格(如果第一天不是星期天)
        for (var i = 0; i < firstDayOfMonth; i++) {
            var td = document.createElement('td');
            row.appendChild(td);
        }
        // 添加日期单元格
        for (var i = firstDayOfMonth; i < 7; i++) {
            var td = document.createElement('td');
            td.textContent = day;
            td.classList.add(getDayOfWeekClass(i));
            row.appendChild(td);
            day++;
        }
        tbody.appendChild(row);
        // 添加剩余日期
        while (day <= daysInMonth) {
            var row = document.createElement('tr');
            for (var i = 0; i < 7 && day <= daysInMonth; i++) {
                var td = document.createElement('td');
                td.textContent = day;
                td.classList.add(getDayOfWeekClass(i));
                row.appendChild(td);
                day++;
            }
            tbody.appendChild(row);
        }
        table.appendChild(tbody);
        document.getElementById('calendar').appendChild(table);

    }

// 获取星期几的类名
    function getDayOfWeekClass(dayOfWeek) {
        switch (dayOfWeek) {
            case 0:
                return 'sunday';
            case 1:
                return 'monday';
            case 2:
                return 'tuesday';
            case 3:
                return 'wednesday';
            case 4:
                return 'thursday';
            case 5:
                return 'friday';
            case 6:
                return 'saturday';
        }
    }

2.ajax获取后端课程数据

function renderCourseTable(courseRoutine,callback) {
        $.ajax({
            url: '/courseinfo/list',
            type: 'POST',
            data: courseRoutine,
            dataType: 'json',
            success: function (result) {
                courses = result.data;
                callback(courses); // 在成功获取课程数据后,调用回调函数,并传递 courses 数组作为参数
            },
            error: function () {
                alert('获取课程数据失败!');
            }
        });
    }

3.根据后端返回的课程数据对页面的课程进行填充

    function initCourseTable(courseRoutine) {
        renderCourseTable(courseRoutine,function (courses) { // 在回调函数中获取 courses 数组,并进行遍历并添加课程信息
            var dateCells = document.querySelectorAll('td:not(:empty)');
            for (var i = 0; i < dateCells.length; i++) {

                // 获取用户输入的日期
                var inputDate = document.getElementById('beginCourseDate').value;
                var today = new Date();

                // 如果用户输入了日期,则使用该日期;否则使用当前日期
                if (inputDate) {
                    var dateParts = inputDate.split('-');
                    var year = parseInt(dateParts[0]);
                    var month = parseInt(dateParts[1]) - 1;
                } else {
                    var year = today.getFullYear();
                    var month = today.getMonth();
                }
                var date = new Date(year, month, parseInt(dateCells[i].textContent));
                var course = courses.find(c => {
                    var classDate = new Date(c.classDate);
                    return classDate.getTime() === date.getTime();
                });

                if (course) {
                    //动态生成每个课程下的编辑和删除按钮
                    var editLink = document.createElement('a');
                    editLink.className = 'btn btn-success btn-xs';
                    editLink.textContent = 'Edit';
                    editLink.href = 'javascript:editCourse("'+course.id+'")';

                    var deleteLink = document.createElement('a');
                    deleteLink.className = 'btn btn-danger btn-xs';
                    deleteLink.textContent = 'Delete';
                    deleteLink.href = 'javascript:deleteCourse("'+course.id+'")';

                    // 在单元格中添加课程信息和链接
                    dateCells[i].innerHTML = parseInt(dateCells[i].textContent) + '<br>' + course.courseName + '<br>'
                        + teacher + ' ' + course.instructorName + '<br>' + classTime + ' ' + course.classTime + '<br>';
                    dateCells[i].appendChild(editLink);
                    dateCells[i].appendChild(deleteLink);
                } else {
                    // 如果没有找到课程,则只在单元格中显示日期
                    dateCells[i].innerHTML = parseInt(dateCells[i].textContent);
                }
            }
        });
    }

 4.页面加载后调用initCalendar和initCourseTable方法初始化课程表

    $(document).ready(function () {
        initCalendar();
        initCourseTable({});
    });

5.课程表的查询、重置、编辑、删除方法

//查询    
function query() {
        var formData = {
            courseType: $("select[name=courseType]").val(),
            courseName: $("input[name=courseName]").val(),
            beginCourseDate: $("input[name=beginCourseDate]").val(),
            endCourseDate: $("input[name=endCourseDate]").val()
        };
        initCalendar();
        initCourseTable(formData);
    }


//重置
 function reset() {
        $('#courseType').val('');
        $('#courseName').val('');
        $('#beginCourseDate').val('');
        $('#endCourseDate').val('');
        initCalendar();
        initCourseTable({});
    }


//编辑
   function editCourse(id) {
         //跳转页面,做相关处理
    }

//删除
    function deleteCourse(id) {

        $.ajax({
            url: '/courseinfo/routine/edit',
            type: 'POST',
            data: id,
            dataType: 'json',
            success: function (result) {
                //删除后重置页面
                initCourseTable({});
                alert('success!');
            },
            error: function () {
                alert('error!');
            }
        });

    }

css模块
 

table {
        border-collapse: collapse;
        width: 100%;
    }

    td, th {
        border: 1px solid black;
        padding: 10px;
        text-align: center;
        vertical-align: middle;
    }

    th {
        background-color: #f2f2f2;
        font-weight: bold;
    }

    .monday {
        background-color: #ffe6e6;
    }

    .tuesday {
        background-color: #e6f9ff;
    }

    .wednesday {
        background-color: #e6ffe6;
    }

    .thursday {
        background-color: #ffffcc;
    }

    .friday {
        background-color: #f9e6ff;
    }

    .saturday {
        background-color: #e6e6e6;
    }

    .sunday {
        background-color: #ffb3b3;
    }

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
HTMLJS可以很方便地实现一个简单的日历。以下是一个基本的示例: HTML部分: ``` <div id="calendar"></div> ``` JS部分: ``` // 获取当前日期 var currentDate = new Date(); // 获取年份和月份 var currentYear = currentDate.getFullYear(); var currentMonth = currentDate.getMonth(); // 显示日历 showCalendar(currentYear, currentMonth); // 上个月按钮点击事件 document.getElementById("prevMonth").addEventListener("click", function() { currentMonth--; if (currentMonth < 0) { currentYear--; currentMonth = 11; } showCalendar(currentYear, currentMonth); }); // 下个月按钮点击事件 document.getElementById("nextMonth").addEventListener("click", function() { currentMonth++; if (currentMonth > 11) { currentYear++; currentMonth = 0; } showCalendar(currentYear, currentMonth); }); // 日历显示函数 function showCalendar(year, month) { var calendarElement = document.getElementById("calendar"); var calendarHTML = ""; // 生成标题 calendarHTML += "<h2>" + year + "年" + (month + 1) + "月</h2>"; // 生成上个月按钮 calendarHTML += "<button id='prevMonth'>上个月</button>"; // 生成下个月按钮 calendarHTML += "<button id='nextMonth'>下个月</button>"; // 生成表格 calendarHTML += "<table>"; // 生成表头 calendarHTML += "<tr><th>日</th><th>一</th><th>二</th><th>三</th><th>四</th><th>五</th><th>六</th></tr>"; // 获取当月第一天和最后一天的日期对象 var firstDay = new Date(year, month, 1); var lastDay = new Date(year, month + 1, 0); // 获取当月第一天是星期几 var firstDayOfWeek = firstDay.getDay(); // 获取当月总共有多少天 var totalDays = lastDay.getDate(); // 生成日期表格 var date = 1; for (var i = 0; i < 6; i++) { calendarHTML += "<tr>"; for (var j = 0; j < 7; j++) { if (i === 0 && j < firstDayOfWeek) { // 空白格 calendarHTML += "<td></td>"; } else if (date > totalDays) { // 空白格 calendarHTML += "<td></td>"; } else { // 日期格 calendarHTML += "<td>" + date + "</td>"; date++; } } calendarHTML += "</tr>"; if (date > totalDays) { break; } } calendarHTML += "</table>"; // 将生成的日历HTML添加到页面中 calendarElement.innerHTML = calendarHTML; } ``` 这个JS函数可以根据指定的年份和月份生成对应的日历表格,并且提供了上一个月和下一个月切换的功能。在HTML中,我们只需要一个`<div>`元素来显示日历

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值