----------------

用原生JavaScript实现的一个日历小工具,开箱即用,可用于做签到记录、日程等显示控件,具体自己发挥啦

效果如下图,可以自行美化

 >>点击体验<<

<div id="signinRecord" class="">err</div>

<style>
.selectedDate{
border-radius: 50%;
border:solid rgb(123, 155, 226) 1px;
}
#signinRecord table td{
padding: 2px;
text-align: center;
}
</style> <script> var ajaxData = '[{"id":1,"userid":41,"signintime":"2019-04-22 07:48:53"},{"id":10,"userid":41,"signintime":"2019-04-23 14:45:18"},{"id":11,"userid":41,"signintime":"2019-04-24 11:02:56"}]'; /**
* 一个原生JavaScript写的日历小工具
* @outhor l-jirong@qq.com
*/ //获取当月的天数
function _getCountDays(date,month){
var date = new Date(date);
date.setMonth(month);
date.setDate(0); return date.getDate(0);
} //月份加减
function _monthAddOrSub(_date,type){
var date = new Date(_date);
var month = date.getMonth()+1;
var year = date.getFullYear();
if(type == 'addition'){
if((month+1) == 13){
month = 1;
year = year+1;
}else{
month++;
}
}else if(type == 'subtraction'){
if((month-1) == 0){
month = 12;
year = year-1;
}else{
month--;
}
}
return year+"-"+month; } /**
*
* @param {[array]} data [请求到的数据]
* @param {[date string]} _calendarMonth [可忽略]
* @return {[type]} []
*/
function _buildCalendar(data,_calendarMonth){
var date = data.length>0?new Date(data[0].signintime):(new Date(_calendarMonth));
var month = (date.getMonth()+1);
var firstDate = date.getFullYear()+"-"+month+"-"+1;
var countdays = _getCountDays(date,month);
var signedIn = Array();
var firstDay = (new Date(firstDate)).getDay();
var signedInTarget = ""; var html = "<div class='name'>签到记录:&nbsp;&nbsp;本月已签到"+data.length+"天</div>";
html += "<table><tr>";
html += " <td colspan=4 id='calendarMonth'>"+date.getFullYear()+"-"+month+"</td><td class='changeMonthBtn' id='preMonth'>上月</td><td class='changeMonthBtn' id='nextMonth'>下月</td></tr><tr>";
html += " <td>日</td><td>一</td><td>二</td><td>三</td><td>四</td><td>五</td><td>六</td></tr><tr>"; //数据里的日期添加标记,不需要可以删除
for(var i=0;i<data.length;i++){
signedIn.push((new Date(data[i].signintime)).getDate());
} for(var d=1;d<=(countdays+firstDay);d++){
if((signedIn.indexOf(d-firstDay))!=-1){
signedInTarget = "class='selectedDate'";
}else{
signedInTarget = "";
} if(d<=(firstDay)){
html += "<td></td>";
}else if(d%7==0){
html += "<td "+signedInTarget+">"+(d-firstDay)+"</td></tr><tr>";
}else{
html += "<td "+signedInTarget+">"+(d-firstDay)+"</td>";
} } html += "</table>";
document.querySelector("#signinRecord").innerHTML=html; //切换签到记录月份
var changeMonthBtn = document.getElementsByClassName("changeMonthBtn");
for(var b=0;b<changeMonthBtn.length;b++){
changeMonthBtn[b].onclick = function(){
var calendarMonth = document.querySelector("#calendarMonth");
var cmDate = new Date(calendarMonth.innerText);
var cYear = cmDate.getFullYear();
var cMonth = cmDate.getMonth()+1;
var startTime,endTime; startTime = cYear+"-"+cMonth;
endTime = cYear+"-"+cMonth; if(this.id == 'preMonth'){
startTime = _monthAddOrSub(startTime,'subtraction');
}else if(this.id == 'nextMonth'){
startTime = _monthAddOrSub(startTime,'addition');
endTime = _monthAddOrSub(endTime,'addition');
endTime = _monthAddOrSub(endTime,'addition');
} if((new Date(startTime))>(new Date())){
alert((new Date(startTime).getMonth()+1)+'月还没到!');
return false;
}
calendarMonth.innerText = startTime;
//ajax request ···
ajaxData = new Array();
_buildCalendar(ajaxData,calendarMonth.innerText);
};
} } _buildCalendar(JSON.parse(ajaxData));
</script>

一个用原生JavaScript实现的日历小工具,开箱即用的更多相关文章

  1. 一个基于原生JavaScript开发的、轻量的验证码生成插件

    Vcode.js 一个基于原生JavaScript开发的.轻量的验证码生成插件 V: 1.0.0 DEMO:https://jofunliang.github.io/Vcode.js/example. ...

  2. 一个支持 CodeFirst/DbFirst/ModelFirst 的数据库小工具

    一个支持 CodeFirst/DbFirst/ModelFirst 的数据库小工具 Intro DbTool 是一个支持 CodeFirst/DbFirst/ModelFirst 的数据库小工具,原本 ...

  3. 介绍一个开源的在线管理SQLServer的小工具--SQLEntMan

    近来有许多人问起SQL在线管理的问题,遂将以前用过的一个开源SQL 在线管理工具修改了一下,并分享. 看下效果图: 原项目的地址:http://sourceforge.net/projects/asp ...

  4. ruby利用Zip Gem写一个简单的压缩和解压的小工具

    在UNIX下的我们怎么会沦落到用ruby写压缩和解压工具呢?直接上shell啊!但是请允许本猫这次可耻的用ruby来玩玩吧!其实ruby GEM中有很多压缩解压包,我选的是Zip,也许是因为名字符合K ...

  5. 分享一个开源的JavaScript统计图表库,40行代码实现专业统计图表

    提升程序员工作效率的工具/技巧推荐系列 推荐一个功能强大的文件搜索工具SearchMyFiles 介绍一个好用的免费流程图和UML绘制软件-Diagram Designer 介绍Windows任务管理 ...

  6. spring MVC +freemarker + easyui 实现sql查询和执行小工具总结

    项目中,有时候线下不能方便的连接项目中的数据源时刻,大部分的问题定位和处理都会存在难度,有时候,一个小工具就能实时的查询和执行当前对应的数据源的库.下面,就本人在项目中实际开发使用的小工具,实时的介绍 ...

  7. 【游戏开发】Excel表格批量转换成CSV的小工具

    一.前言 在工作的过程中,我们有时可能会面临将Excel表格转换成CSV格式文件的需求.这尤其在游戏开发中体现的最为明显,策划的数据文档大多是一些Excel表格,且不说这些表格在游戏中读取的速度,但就 ...

  8. 这些小工具让你的Android 开发更高效

    在做Android 开发过程中,会遇到一些小的问题.尽管自己动手也能解决.可是有了一些小工具,解决这些问题就得心应手了,今天就为大家推荐一下Android 开发遇到的小工具,来让你的开发更高效. Vy ...

  9. 利用ncurses库开发终端工具箱(1)—— ToDoList小工具开发

    准备工作 腾讯云服务器(Ubuntu),C++编程语言 由于想输出界面中包含中文,所以安装库 libncursesw5,依次输入下面三行命令 sudo apt-get install libncurs ...

  10. javascript学习-原生javascript的小特效(原生javascript实现链式运动)

    以下代码就不详细解析了,在我之前的多个运动效果中已经解析好多次了,重复的地方这里就不说明了,有兴趣的童鞋可以去看看之前的文章<原生javascript的小特效> <!DOCTYPE ...

随机推荐

  1. Java03-程序流程控制

    Java程序流程控制 [ 任务列表 ] 1.选择结构(if.switch) 2.循环结构(for.while.do-while) 3.跳转关键字(break.continue.return) 4.其他 ...

  2. idea遇见Command line is too long. Shorten command line for Main or also for Application default configuration?

    <property name="dynamic.classpath" value="true" /> 第一步:找到项目目录下的.idea\works ...

  3. redis如何设置密码

    密码设置 这里简单介绍一下redis如何设置密码redis密码设置有两种方式,一种需要重启redis服务,一种不需要重启redis服务. 首先,介绍一下需要重启redis服务的设置方式即找到redis ...

  4. SQL注入之时间盲注

    SQL注入之时间盲注 一.时间盲注原理 时间盲注技术的核心在于巧妙地运用数据库中的时间延迟函数(例如 MySQL 的 SLEEP() 函数或 PostgreSQL 的 PG_SLEEP() 函数)来验 ...

  5. 还在手动更改SpringBoot的环境yml配置文件?老鸟带你可视化配置

    问题说明: 在SpringBoot开发时.SpringBoot的特性:'约定大于配置',我们只需要在**application.yml **配置当前的环境变量属与那个文件 比如测试环境 'applic ...

  6. 使用DeepSeek-R1分析电影票房

    最近在学习DeepSeek-R1本地化部署的相关知识,看到了1个比较有意思的视频. 在该视频中,其主要逻辑就是当用户上传1个Excel后,之后就可以通过交互式的方式对这个Excel中的数据进行分析.但 ...

  7. 关于我这周学习SQL注入的一些笔记:

    sql注入的原理: 通过恶意的SQL语句插入到应用的输入参数中,再在后台数据库服务器上解析执行的攻击.   Web程序的三层结构: 界面层( User Interface layer ) 业务逻辑层( ...

  8. 五大股票金融数据API接口推荐:从实时行情到历史数据全覆盖

    摘要:本文将介绍五大主流的股票金融数据API接口,涵盖实时行情.历史数据.技术指标等功能,帮助开发者快速构建金融数据应用.(本文由deepseek生成) 一.StockTV API 1. 核心优势 全 ...

  9. gorm中使用乐观锁

    乐观锁简介 乐观锁(又称乐观并发控制)是一种常见的数据库并发控制策略. 乐观并发控制多数用于数据竞争(data race)不大.冲突较少的环境中,这种环境中,偶尔回滚事务的成本会低于读取数据时锁定数据 ...

  10. Chrome浏览器使用AdGuard去除百度热搜

    前言 百度的热搜会分散注意力,chrome 的 AdGuard 插件可以屏蔽广告,还可以屏蔽百度热搜 设置 > 用户过滤器 > 添加以下代码,即可屏蔽百度热搜 baidu.com##div ...