使用JS实现简单的日历插件

article/2025/8/25 10:40:59

实现简单的日历插件

  • 一、简要介绍
  • 二、基础代码
    • html部分
    • js部分

一、简要介绍

  实现一个如下图所示的日历,这边主要提供html部分和js部分的代码,css部分大家自行编写哦。

请添加图片描述

二、基础代码

html部分

  其实就是一个div容器,为其设置相应的id值。

	<div id="calendar" class="calendar"></div>

js部分

  我们先来简单梳理一下需要完成的步骤:
  将表格渲染出来,不然这个容器就是空的:

	var calBox = document.getElementById("calendar");var str = "<div class='title'>\<a id='calendar-pre'>&lt;上月(\" + preMonth + "月)</a><label>\"+year+"年</label><label>" +month+"\月</label> <a id='calendar-next'>下月\("+nextMonth+"月)&gt;</a> </div>"str += "<table class='calendar-table'>"str += "</table>"calBox.innerHTML = str;

  在进行完这一部分的代码编写后,就可以将表格渲染出来,但是这时表格是空的,我们需要获取时间,并将时间渲染进表格,首先是获取时间,使用到了Date对象:

	var now = new Date();//当前日期var year = now.getFullYear();// 年份var month = now.getMonth() + 1;// 月份var preMonth = now.getMonth();// 上个月var nextMonth = month + 1;// 下个月var days,whatday,predays; //days表示当月天数,predays表示上个月天数,whatday表示当月一号所在的是周几var weeks = ['一','二','三','四','五','六','日'];//设置头部是从周一开始还是周日开始var begin;//传入参数,用于设置上一个月还剩几天的天数显示function setNewDate(){//设置日期的方法if(month == 1){ //当前月为1月时,上一个月显示为12月preMonth = 12;}if(month == 12){ //当前月为12月时,下一个月显示为1月nextMonth = 1;}now.setFullYear(year, month, 0);days = now.getDate();//当前月天数now.setDate(1);//获取的是1号whatday = now.getDay();// 获取1号在周几now.setFullYear(year, month - 1, 0);predays = now.getDate();// 上个月天数begin = predays - whatday + 2; // 设置上一个月还剩几天的天数显示getCalendar(weeks, begin, whatday - 1); //传入参数,调用getCalender方法}setNewDate(); // 初始化日期

  getCalendar方法,主要是对表格进行渲染:

function getCalendar(weeks, begin, whichday){var calBox = document.getElementById("calendar"); //获取日历的dom对象var str = "<div class='title'>\<a id='calendar-pre'>&lt;上月(\" + preMonth + "月)</a><label>\"+year+"年</label><label>" +month+"\月</label> <a id='calendar-next'>下月\("+nextMonth+"月)&gt;</a> </div>" //渲染表格基础信息str += "<table class='calendar-table'>"str += "<tr>"for(var i = 0; i < 7;i++){ //渲染头部str += "<th>" + weeks[i] + "</th>"}str += "</tr>";var line = Math.ceil((days + whichday) / 7); // 行数var curIndex = 1; //当前天var start = begin; //上一个月遗留的天数显示var flag = false; //这个月的天数是否渲染完成for(var l = 0; l < line; l++){ str += "<tr>";for(var i = 0; i < 7; i++){ //一周七天if(i < whichday && l == 0){ //当i小于一号所在的周几数就表示上个月还剩余天数未渲染str += "<td style='color:#989898;'>" + start + "</td>" ; //渲染上个月的剩余天数,并置为灰色start++;}else if(curIndex > days || flag == true){ //当月天数渲染完之后,剩余的位置用于渲染下个月的天数flag == true;str += "<td style='color:#989898;'>" + (curIndex - days) + "</td>" ;curIndex++;}else{ //渲染当月的天数str += "<td>" + curIndex + "</td>" ;curIndex++;}}str += "</tr>";} str += "</table>"calBox.innerHTML = str;
}

  为两个按钮添加事件委托:

	setNewDate(); // 初始化日期calendar.addEventListener("click",function(e){ //为两个按钮设置事件委托if(e.target.id == "calendar-pre"){ //当点击上一个月的按钮时month = preMonth;preMonth = month - 1;nextMonth = month + 1;if(month == 12){ //边界值判断year--;}setNewDate(); //更新日期}if(e.target.id == "calendar-next"){ //当点击下一个月的按钮时month = nextMonth;preMonth = month - 1;nextMonth = month + 1;if(month == 1){ //边界值判断year++;}setNewDate(); //更新日期}});

  由于两个按钮是后面通过js进行添加的,所以无法对其直接进行事件的监听,需要对其父元素设置事件监听。
  这里我还为日历设置了定制功能,例如上述实现的是从周一开始的日历,要设置成周日开始的日历,只需要修改参数即可:

	var weeks = ['日','一','二','三','四','五','六'];//设置头部是从周一开始还是周日开始

  在setNewDate()方法中:

	begin = predays - whatday + 1; // 设置上一个月还剩几天的天数显示getCalendar(weeks, begin, whatday); //传入参数,调用getCalender方法

  这样子就可以实现以周日为开始的日历了:
请添加图片描述
  这次的小插件虽然实现起来不是特别的复杂,但是还是涉及到了比较多的知识,最主要的就是对日期对象的操作,这次的小demo就介绍到这里啦,有不足的地方也希望大家可以帮我指正,蟹蟹!


http://chatgpt.dhexx.cn/article/hXP2aJT4.shtml

相关文章

FullCalendar - 开源的多功能 JavaScript 日历插件

本文字数&#xff1a;747 字 9图 阅读完需&#xff1a;约 4 分钟 点击上方“青年码农”关注 回复“源码”可获取各种资料 FullCalendar 是一个支持 React、Vue、Angular 和原生 JavaScript 的日历插件&#xff0c;FullCalendar 拥有超过 300 种设置&#xff0c;支持模块化导入&…

HTML页面日历插件

web页面显示日历插件。如下图 <!DOCTYPE html> <html><head><meta charset"utf-8" /><title></title><style>body,td,.p1,.p2,.i {font-family: arial}body {margin: 6px 0 0 0;background-color: #fff;color: #000;}tab…

js日历插件

日历插件&#xff1a;bootstraprap-datetimepicker 前端插件使用步骤&#xff1a; 1.引入开发包&#xff1a; js css 文件 下载开发包&#xff0c;拷贝到项目webapp目录下 把开发包引入到jsp文件中&#xff1a; <link rel"stylesheet" type"text/css&qu…

超好用的js 日历插件 日期插件 日期日历选择控件

前情提要&#xff1a; 主要是目前项目较小&#xff0c;仅需要一个日历插件&#xff0c;就没有选择引用UI框架&#xff0c;单纯找了一个日历插件&#xff0c;外观相对简单大方&#xff0c;还不错&#xff0c;而且只需要2步就可以完成引入&#xff1a; 第一步&#xff08;有2种方…

微信小程序日历插件用法-举例为(爸妈搜日历)

一、添加插件 在小程序管理后台添加插件。 小程序管理后台地址&#xff1a;https://mp.weixin.qq.com/ 设置>第三方设置>插件管理 添加插件&#xff0c;可以直接搜索名称(爸妈搜日历)或者AppID(wx23a9cef3522e4f7c) 二、在小程序app.json文件中引入插件声明 "plugi…

前端ui组件(1):日程排班—11个优秀JavaScript 日历插件

日历是我们生活中重要的一部分。在当今世界,人们大多使用网络或移动日历。它们随处可见,包括在各种软件中:预订应用、旅行软件、项目管理、管理面板等。 出于多种原因,用户可能需要在网站上使用日历。用户需要容果从日历中选择日期来填写表格,或者在填写某些信息时提供日…

好用的日历插件(三款常用的日历插件)

1、laydate https://www.layui.com/laydate/ 全面重写的 layDate 包含了大量的更新&#xff0c;其中主要以&#xff1a;年选择器、年月选择器、日期选择器、时间选择器、日期时间选择器 五种类型的选择方式为基本核心&#xff0c;并且均支持范围选择&#xff08;即双控件&…

【典例】链表经典题目合集

目录导航 1. 删除链表中给定值为val的所有节点2. 反转一个单链表3. 返回链表中间节点&返回链表倒数第k个节点4. 链表的回文结构5. 合并两个有序链表6. 输入两个链表&#xff0c;找出它们第一个公共节点7. 分割链表8. 判断链表是否带环&找环的入口点9. 复制复杂链表10. …

链表知识点总结

目录 一、基本概念&#xff1a; 1.定义&#xff1a; 2.性质&#xff1a; 3.链表的分类&#xff1a; 单链表&#xff1a; 双向链表 单链表和双向链表的区别&#xff1a; 双向链表的作用&#xff1a; 循环链表 二、链表的主要操作&#xff1a; 1.插入操作&#xff1a; a.重…

二级指针实现单链表的插入、删除及 linux内核源码双向链表之奇技

二级指针实现单链表的插入、删除 今天看了coolshell上关于二级指针删除单链表节点的文章。 文章中Linus 举例&#xff1a; 例如&#xff0c;我见过很多人在删除一个单项链表的时候&#xff0c;维护了一个”prev”表项指针&#xff0c;然后删除当前表项&#xff0c;就像这样…

C++实现链表

C实现链表 众所周知&#xff0c;C/C语言实现的链表是由一个一个的结点构成&#xff0c;每个结点分为数据域和指针域&#xff0c;指针域中存储了其后继结点的地址&#xff0c;通过地址来访问下一个结点。 链表是一系列节点串联形成的数据结构&#xff0c;链表存储有序的元素集合…

2130. 链表最大孪生和

地址&#xff1a; 力扣https://leetcode-cn.com/problems/maximum-twin-sum-of-a-linked-list/ 题目&#xff1a; 在一个大小为 n 且 n 为 偶数 的链表中&#xff0c;对于 0 < i < (n / 2) - 1 的 i &#xff0c;第 i 个节点&#xff08;下标从 0 开始&#xff09;的孪…

链表基础【C++实现】

平台&#xff1a;Visual Studio 2022 编程工具&#xff1a;C 目录&#xff1a; 1、链表的结构体实现 2、链表的声明、开辟空间 3、链表的初始化 4、链表的连接 5、链表输出 6、完整代码实例 1、链表的结构体实现 链表由一系列结点&#xff08;链表中每一个元素称为结点&#…

体能修复6-编程-剑指offer-JZ22 链表中倒数最后k个结点

描述 输入一个长度为的链表&#xff0c;设链表中的元素的值为&#xff0c;返回该链表中倒数第个节点。 如果该链表长度小于&#xff0c;请返回一个长度为的链表。 数据范围:&#xff0c;&#xff0c; 要求&#xff1a;空间复杂度&#xff0c;时间复杂度 进阶&#xff1a;空…

Niuke:JZ36.二叉树与双向链表

文章目录 &#xff2e;iuke:JZ36.二叉树与双向链表题目描述示例思路分析代码实现 &#xff2e;iuke:JZ36.二叉树与双向链表 题目描述 描述 输入一棵二叉搜索树&#xff0c;将该二叉搜索树转换成一个排序的双向链表。如下图所示 注意: 1.要求不能创建任何新的结点&#xff0c;…

【C/C++ 数据结构】-链表(OJ题)(4)

文章目录 题一&#xff1a;反转链表法1&#xff1a;指针反向法2&#xff1a;指针翻转法3&#xff1a;头插法 题二&#xff1a;链表的中间节点法1&#xff1a;统计节点减半法法2&#xff1a;快慢指针法 题三&#xff1a;合并两个有序链表法1&#xff1a;tail拼接法法2&#xff1…

链表面试常见考题(C++实现)

链表面试常见考题&#xff08;C实现&#xff09; 常用方法&#xff1a;画图法 常用技巧&#xff1a;用于遍历搜索的游标 ListNode* cur; 用于返回值的哑节点 ListNode* dumny new ,, 单链表更新先去考虑他的next指向问题。链表元素或者边界问题可以用前继节点pre、后继节点…

剑指offer(C++)-JZ22:链表中倒数最后k个结点(数据结构-链表)

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 题目描述&#xff1a; 输入一个长度为 n 的链表&#xff0c;设链表中的元素的值为 ai &#xff0c;返回该链表中倒数第k个节点。…

单链表(带头结点)的存储结构与基本操作(c语言)------亲测可用

编程语言&#xff1a;c语言 编译环境&#xff1a;Dev-c 实现功能&#xff1a;实现功能&#xff1a;单链表&#xff08;带头结点&#xff09;结点结构体的定义&#xff0c;单链表&#xff08;带头结点&#xff09;初始化、求元素个数、插入元素、删除元素、取元素、打印所有元素…

链表OJ归纳总结 ------- C语言

一、移除链表元素 OJ链接https://leetcode.cn/problems/remove-linked-list-elements/submissions/ 1.1. | 解题思路 | 创建一个新的哨兵头节点 guard&#xff0c;创建尾节点 tail&#xff0c;创建 cur 用于遍历原链表数据。 对原链表进行遍历&#xff0c;若 cur->val ! v…