前言

方法是有参考网上一些资料的,比如闰年的判断,比如每个月第一天是星期几的判断。不说太多,拆分出一个个函数,希望能描述尽可能的清晰明了。

一,判断闰年

//判断闰年
function runNian(_year) {
if(_year% === || (_year% === && _year% !== ) ) {
return true;
}
else { return false; }
}

二,判断某年某月的1号是星期几

//判断某年某月的1号是星期几
function getFirstDay(_year,_month) {
var allDay = , y = _year-, i = ;
allDay = y + Math.floor(y/) - Math.floor(y/) + Math.floor(y/) + ;
for ( ; i<_month; i++) {
switch (i) {
case : allDay += ; break;
case :
if(runNian(_year)) { allDay += ; }
else { allDay += ; }
break;
case : allDay += ; break;
case : allDay += ; break;
case : allDay += ; break;
case : allDay += ; break;
case : allDay += ; break;
case : allDay += ; break;
case : allDay += ; break;
case : allDay += ; break;
case : allDay += ; break;
case : allDay += ; break;
}
}
return allDay%;
}

三,创建日历表格,显示日历(表格应该在静态页面先写好结构和样式,然后在此处拼接,这里仅做示范,不附样式)

//显示日历
function showCalendar(_year,_month,_day,firstDay) {
var i = ,
monthDay = ,
showStr = "",
_classname = "",
today = new Date();
//月份的天数
switch(_month) {
case : monthDay = ; break;
case :
if(runNian(_year)) { monthDay = ; }
else { monthDay = ; }
break;
case : monthDay = ; break;
case : monthDay = ; break;
case : monthDay = ; break;
case : monthDay = ; break;
case : monthDay = ; break;
case : monthDay = ; break;
case : monthDay = ; break;
case : monthDay = ; break;
case : monthDay = ; break;
case : monthDay = ; break;
} //输出日历表格,这部分因结构而异
showStr = "<table class='cld-w'><thead>";
//日历头部
showStr += "<tr><th colspan='7'><div class='cld-hd'><span class='cld-pre'>&lt;</span><em id='showDate' value='" + _year + "-" + _month + "-" + _day + "'>" + _year + "年" + _month + "月" + _day + "日" + "</em><span class='cld-next'>&gt;</span></div></th></tr>";
//日历星期
showStr += "<tr><th>日</th><th>一</th><th>二</th><th>三</th><th>四</th><th>五</th><th>六</th></tr>";
showStr += "</thead><tbody><tr>";
//当月第一天前的空格
for (i=; i<=firstDay; i++) {
showStr += "<td></td>";
}
//显示当前月的天数
for (i=; i<=monthDay; i++) {
//当日的日期
if(_year === today.getFullYear() && _month === today.getMonth()+ && i === today.getDate()) {
_classname = "cld-cur";
}
//当日之前的日期(这个判断是因为我有工作需求,就是要求之前的日期不能点击)
else if(_year < today.getFullYear() || (_year === today.getFullYear() && _month <= today.getMonth()) || (_year === today.getFullYear() && _month === today.getMonth()+ && i < today.getDate()) ) {
_classname = "cld-old";
}
//其他普通的日期
else { _classname = "cld-day"; }
//其他大于当月的月份的相同日期(为了让点击下一月的时候,相同的日期增加cld-cur类)
if(_day === i && (_year > today.getFullYear() || _month > today.getMonth()+)) { _classname = "cld-cur"; }
//把日期存在对应的value
showStr += "<td class=" + _classname + " value='" + _year + "-" + _month + "-" + i + "'>" + i + "</td>"; firstDay = (firstDay+)%;
if(firstDay === && i !== monthDay) {
showStr += "</tr><tr>";
}
}

//剩余的空格
if(firstDay!==) {
for (i=firstDay; i<; i++) {
showStr += "<td></td>";
}
} showStr +="</tr></tbody></table>";
//插入calendar的页面结构里
calendar.innerHTML = showStr;
}

四,在日历的头部显示当前的年月日

//显示年月日
function showDate(_year,_month,_day) {
var date = "", firstDay = getFirstDay(_year,_month,_day);
if(_day !== ) {
date = _year + "年" + _month + "月" +_day + "日";
}
else { date = "No Choose."; }
document.getElementById("showDate").innerHTML = date; //日历头部显示
showCalendar(_year,_month,_day,firstDay); //调用日历显示函数
}

五,上一月和下一月

//上一月
function preMonth(_year,_month,_day) {
if(_month == ) { showDate(_year - ,,_day); }
else { showDate(_year,_month - ,_day); }
}
//下一月
function nextMonth(_year,_month,_day) {
if(_month == ) { showDate(_year + ,,_day); }
else { showDate(_year,_month + ,_day); }
}

六,初始化,日历就出来了

//初始化
var calendar = document.createElement('div');
calendar.setAttribute('id','showCld');
document.getElementById("box").appendChild(calendar); //增加到你的box里

//获取当天的年月日
var today = new Date();
var _year = today.getFullYear(),
_month = today.getMonth() + ,
_day = today.getDate();
var firstDay = getFirstDay(_year,_month); //显示日历
showCalendar(_year,_month,_day,firstDay);

七,日历的点击事件

//日历点击的事件委托(可以查查js冒泡的应用)
calendar.onclick = function(e) {
var e = e || window.event;
var target = e.srcElement || e.target;
//把日历的头部的年月日分割成数组,这里保存在其value属性上
dayArr = document.getElementById('showDate').getAttribute('value').split('-');
if (target) {
//如果是可点击的日期
if ( target.className === "cld-day" || target.className === "cld-cur" ) {
dateArr = target.getAttribute('value').split('-');
//减0是把字符串转化成数值类型,以下一样
showDate(dateArr[0]-0,dateArr[1]-0,dateArr[2]-0);
calendar.className = "";
}
//如果是上一月的点击
else if ( target.className === "cld-pre" ) {
preMonth(dayArr[]-,dayArr[]-,dayArr[]-);
}
//如果是下一月的点击
else if ( target.className === "cld-next" ) {
nextMonth(dayArr[]-,dayArr[]-,dayArr[]-);
}
}
};

——把解释都写着代码里了,代码函数比较简单粗暴,没办法,本人对js继承封装还不熟呢。

创建一个js日历(原生JS实现日历)的更多相关文章

  1. 再谈React.js实现原生js拖拽效果

    前几天写的那个拖拽,自己留下的疑问...这次在热心博友的提示下又修正了一些小小的bug,也加了拖拽的边缘检测部分...就再聊聊拖拽吧 一.不要直接操作dom元素 react中使用了虚拟dom的概念,目 ...

  2. JS(原生js和jq方式)获取元素属性(自定义属性),删除属性(自定义属性)

    JS(原生js和jq方式)获取元素属性(自定义属性),删除属性(自定义属性) 以下内容: 一.获取元素的属性 二.设置元素的属性 三.删除元素的属性 一.获取元素的属性 1-原生JS 获取属性 .ge ...

  3. 封装一个简单的原生js焦点轮播图插件

    轮播图实现的效果为,鼠标移入左右箭头会出现,可以点击切换图片,下面的小圆点会跟随,可以循环播放(为了方便理解,没有补2张图做无缝轮播).本篇文章的主要目的是分享封装插件的思路. 轮播图我一开始是写成非 ...

  4. 一个简单用原生js实现的小游戏----FlappyBird

    这是一个特别简单的用原生js实现的一个小鸟游戏,比较简单,适合新手练习 这是html结构 <!DOCTYPE html><html lang="en">&l ...

  5. jQuery跳转到另一个页面以及原生js跳转到另一个页面

    1.原生js我们可以利用http的重定向来跳转 window.location.replace("https://www.cnblogs.com/pythonywy/"); 2.原 ...

  6. React.js实现原生js拖拽效果及思考

    一.起因&思路 不知不觉,已经好几天没写博客了...近来除了研究React,还做了公司官网... 一直想写一个原生js拖拽效果,又加上近来学react学得比较嗨.所以就用react来实现这个拖 ...

  7. 如何创建一个客户端回调:js获得服务端的内容?

    答案:表面上看去就是前端的js调用服务的C#方法,本质就是ajax,通过XMLHttpRequest对象和服务端进行交互.回调:就说回过头来调用,按理说js是一种脚本语言,怎么能用来调用服务端的呢?就 ...

  8. 【原生js】原生js的省市区三级联动

    html: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" c ...

  9. 用require.js封装原生js轮播图

    index.html页面: <!DOCTYPE html><html> <head> <meta charset="UTF-8"> ...

  10. 【原生js】原生js实现验证码短信发送倒计时

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

随机推荐

  1. HTTP必知必会(转)

    HTTP协议作为网络传输的基本协议,有着广泛的应用.HTTP协议的完整内容很多,但是其核心知识却又简单精炼.学习者应该掌握其基本结构,并且能够举一反三.这篇文章所列的,就是在实际开发中必须知道必须掌握 ...

  2. 10个devexpress ASPxPivotGrid常见问题

    原文:10个devexpress ASPxPivotGrid常见问题 1.DXperience ASPxGridView如何开启lightweight模式 描述:ASPxGridView样式主题中pa ...

  3. LwIP学习笔记——STM32 ENC28J60移植与入门

    0.前言     去年(2013年)的整理了LwIP相关代码,并在STM32上"裸奔"成功.一直没有时间深入整理,在这里借博文整理总结.LwIP的移植过程细节很多,博文也不可能一一 ...

  4. int有符号和无符号类型内存 -- C

    /* int 有符号 0xffffffff == -1 0xfffffffe == -2 最小 0x80000000 == -21 4748 3648 最大 0x7fffffff == 21 4748 ...

  5. mac os x10.11.2系统eclipse无法读取环境变量的问题

    eclipse调试Android自动化脚本的时候一直无法找到adb,遇到这么坑的问题,折腾死了,记录一下. mac os x10.11.2系统GUI程序(eclipse)无法读取~/.bash_pro ...

  6. 怎么会Sql serverW数据库模型图转化成ord于--您还可以查看属性信息字段

    1. 于Sql server数据库,创建数据库模型图 -- Database Diagrams watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamN4NTA ...

  7. BIZTALK项目中WEB引用WEBSERVICES服务时候报错

    近期工作中须要完毕通过BIZTALK完毕调用WEBLOGIC公布的WebServices服务,环境搭建好后,打开VS开发工具新建一个BIZTALK项目,加入WEB引用将对方公布的地址拷贝上去,能够正常 ...

  8. Asp.net MVC + EF + Spring.Net 项目实践(目录)

    用4篇博客来搭一个MVC的框架,可能对初学者会有一些帮助,大家共勉吧.我觉得对于中小型项目,这个框架可能还是有一定的用处的,希望能够帮助到一些人. Asp.net MVC + EF + Spring. ...

  9. Unix/Linux环境C编程新手教程(41) C语言库函数的文件操作具体解释

     上一篇博客我们解说了怎样使用Linux提供的文件操作函数,本文主要解说使用C语言提供的文件操作的库函数. 1.函数介绍 fopen(打开文件) 相关函数 open,fclose 表头文件 #in ...

  10. PHP实例——输出安全的HTML代码

    原文:PHP实例--输出安全的HTML代码 //输出安全的htmlfunction h($text, $tags = null){ $text = trim($text); //完全过滤注释 $tex ...