您好,欢迎访问一九零五行业门户网

纯javascript版日历控件

平时只有下班时间能code,闲来写了个纯javascript版。引用该calendar.js文件,然后给要设置成日历控件的input的id设置成calendar,该input就会变成日历控件。
<!doctype html> <html> <head> <meta charset="utf-8"> <title>日历控件</title> <script src="js/calendar.js" defer></script> </head> <body> <input id="calendar" type="text" /> </body> </html>
引用calendar.js时,一定要加defer属性。
calendar.js源码:
// javascript document var days = new array("日","一","二","三","四","五","六");//星期 var today = new date();//当天日期,备用 var month_big = new array("1","3","5","7","8","10","12"); //包含所有大月的数组 var month_small = new array("4","6","9","11"); //包含所有小月的数组 var separator = "-";//间隔符 var calendar = document.getelementbyid("calendar"); var cal_parent = calendar.parentnode;//获取父元素 var cal_width = ((calendar.clientwidth<150) ? 150 : calendar.clientwidth);//获取input的宽度,如果input宽度小于150,调整为150,150为日历块最小宽度 var cal_height = calendar.clientheight;//获取input的高度,整数 var cal_x = calendar.offsetleft;//获取input左边 距父元素的距离,整数 var cal_y = calendar.offsettop;//获取input顶部 距父元素的距离,整数 calendar.style.cursor = "pointer";//将input的鼠标设置成小手 calendar.readonly = "readonly";//设置input为只读 calendar.onblur = hidecalendar; //当input失去焦点时,隐藏cal_body calendar.onclick = showcalendar;//点击input时调用showcalendar函数 //取input宽度的七分之一再减一作为方格的边长 var pane_height = cal_width/7 - 1; function hidecalendar(){ var cal_body = document.getelementbyid("cal_body"); if(cal_body != undefined){ cal_body.parentnode.removechild(cal_body); } } //显示日历主体 function showcalendar(){ var cal_body = document.getelementbyid("cal_body"); if(cal_body != undefined){ cal_body.parentnode.removechild(cal_body); } else{ var cal_body = document.createelement("div"); cal_body.id = "cal_body"; cal_body.style.width = cal_width + "px"; cal_body.style.height = "auto"; cal_body.style.overflow = "hidden"; cal_body.style.position = "absolute"; cal_body.style.zindex = "9"; cal_body.style.left = cal_x + "px"; cal_body.style.top = (cal_y + cal_height + 5) + "px"; cal_body.style.border = "solid 1px #cccccc"; //鼠标移动到cal_body上时,禁用input的onblur事件,防止cal_body因input失去焦点而被隐藏 cal_body.onmouseover = function(){ calendar.onblur = undefined; } //鼠标从cal_body移除时,启用input的onblur事件,并且先让input获得焦点,否则当在cal_body上空白处点击后再移出在其他地方点击时,input因没有焦点而无法触发onblur事件 cal_body.onmouseout = function(){ calendar.focus(); calendar.onblur = hidecalendar; } cal_parent.appendchild(cal_body); var line1 = document.createelement("div"); line1.style.width = cal_width + "px"; line1.style.height = pane_height + "px"; line1.style.backgroundcolor = "#0ff"; var btn1 = document.createelement("div"); btn1.style.width = (cal_width/3 - 3) + "px"; btn1.style.height = pane_height + "px"; btn1.style.lineheight = pane_height + "px"; btn1.style.textalign = "center"; btn1.innerhtml = "<"; btn1.style.cursor = "pointer"; btn1.style.cssfloat = "left"; btn1.onclick = function(){ if(isvalidated()){ var old_year = parseint(document.getelementbyid("input_year").value); if(old_year > 1960){ var year = old_year - 1; var month = parseint(document.getelementbyid("input_month").value); var val = year + separator + month + separator + 1; init(val); } } }; line1.appendchild(btn1); var input_year = document.createelement("input"); input_year.id = "input_year"; input_year.style.width = (cal_width/3) + "px"; input_year.style.height = "70%"; input_year.style.cssfloat = "left"; input_year.style.textalign = "center"; input_year.onchange = function(){ changed(); }; line1.appendchild(input_year); var btn2 = document.createelement("div"); btn2.style.width = (cal_width/3 - 3) + "px"; btn2.style.height = pane_height + "px"; btn2.style.lineheight = pane_height + "px"; btn2.style.textalign = "center"; btn2.innerhtml = ">"; btn2.style.cursor = "pointer"; btn2.style.cssfloat = "left"; btn2.onclick = function(){ if(isvalidated()){ var old_year = parseint(document.getelementbyid("input_year").value); if(old_year < 2050){ var year = old_year + 1; var month = parseint(document.getelementbyid("input_month").value); var val = year + separator + month + separator + 1; init(val); } } }; line1.appendchild(btn2); var line2 = document.createelement("div"); line2.style.width = cal_width + "px"; line2.style.height = pane_height + "px"; line2.style.backgroundcolor = "#0ff"; var btn3 = document.createelement("div"); btn3.style.width = (cal_width/3 - 3) + "px"; btn3.style.height = pane_height + "px"; btn3.style.lineheight = pane_height + "px"; btn3.style.textalign = "center"; btn3.innerhtml = "<"; btn3.style.cursor = "pointer"; btn3.style.cssfloat = "left"; btn3.onclick = function(){ if(isvalidated()){ var old_month = parseint(document.getelementbyid("input_month").value) if(old_month > 1){ var year = parseint(document.getelementbyid("input_year").value); var month = old_month - 1; var val = year + separator + month + separator + 1; init(val); } else { var year = parseint(document.getelementbyid("input_year").value) - 1; var month = 12; var val = year + separator + month + separator + 1; init(val); } } }; line2.appendchild(btn3); var input_month = document.createelement("input"); input_month.id = "input_month"; input_month.style.width = (cal_width/3) + "px"; input_month.style.height = "70%"; input_month.style.cssfloat = "left"; input_month.style.textalign = "center"; input_month.onchange = function(){ changed(); }; line2.appendchild(input_month); var btn4 = document.createelement("div"); btn4.style.width = (cal_width/3 - 3) + "px"; btn4.style.height = pane_height + "px"; btn4.style.lineheight = pane_height + "px"; btn4.style.textalign = "center"; btn4.innerhtml = ">"; btn4.style.cursor = "pointer"; btn4.style.cssfloat = "left"; btn4.onclick = function(){ if(isvalidated()){ var old_month = parseint(document.getelementbyid("input_month").value) if(old_month < 12){ var year = parseint(document.getelementbyid("input_year").value); var month = parseint(document.getelementbyid("input_month").value) + 1; var val = year + separator + month + separator + 1; init(val); } else { var year = parseint(document.getelementbyid("input_year").value) + 1; var month = 1; var val = year + separator + month + separator + 1; init(val); } } }; line2.appendchild(btn4); cal_body.appendchild(line1); cal_body.appendchild(line2); for(var i=0; i < 7; i++){ var pane = document.createelement("div"); pane.classname = "pane"; pane.style.width = pane_height + "px"; pane.style.height = pane_height + "px"; pane.style.lineheight = pane_height + "px"; pane.style.textalign = "center"; pane.style.cssfloat = "left"; pane.innerhtml = days[i]; cal_body.appendchild(pane); } init(calendar.value); } } function init(val){ clearpane(); var cal_body = document.getelementbyid("cal_body"); var temp_date; var year; var month; var date; if(val == ""){ temp_date = today; calendar.value = today.toformatstring(separator); } else{ year = val.year(); month = val.month(separator); date = val.date(separator); temp_date = new date(year,month,date); } year = temp_date.getfullyear(); month = temp_date.getmonth() + 1; date = temp_date.getdate(); temp_date.setdate(1); var start = temp_date.getday() + 7; var end; if(array_contain(month_big, month)){ end = start + 31; } else if(array_contain(month_small, month)){ end = start + 30; } else{ if(isleapyear(year)){ end = start + 29; } else{ end = start + 28; } } for(var i = 7; i < start; i++){ var pane = document.createelement("div"); pane.classname = "pane"; pane.style.width = pane_height + "px"; pane.style.height = pane_height + "px"; pane.style.lineheight = pane_height + "px"; pane.style.textalign = "center"; pane.style.cssfloat = "left"; cal_body.appendchild(pane); } for(var i = start; i < end; i++){ var pane = document.createelement("div"); pane.classname = "pane"; pane.style.width = pane_height + "px"; pane.style.height = pane_height + "px"; pane.style.lineheight = pane_height + "px"; pane.style.textalign = "center"; pane.style.cssfloat = "left"; pane.innerhtml = i - start + 1; pane.style.cursor = "pointer"; pane.onmouseover = function(){ this.style.backgroundcolor = '#0ff'; } if(date == (i - start + 1)) pane.style.backgroundcolor = '#0ff'; else{ pane.onmouseout = function(){ this.style.backgroundcolor = ''; } } pane.onclick = function(){ calendar.value = year + separator + month + separator + this.innerhtml; cal_body.parentnode.removechild(cal_body); } cal_body.appendchild(pane); document.getelementbyid("input_year").value = year; document.getelementbyid("input_month").value = month; } } //格式化输出 date.prototype.toformatstring = function(separator){ var result = this.getfullyear() + separator + (this.getmonth() + 1) + separator + this.getdate(); return result; }; //从格式化字符串中获取年份 string.prototype.year = function(){ var str = this.substring(0,4); return str; }; //从格式化字符串中获取月份 string.prototype.month = function(separator){ var start = this.indexof(separator) + 1; var end = this.lastindexof(separator); return parseint(this.substring(start, end)) - 1; }; //从格式化字符串中获取日期 string.prototype.date = function(separator){ var start = this.lastindexof(separator) + 1; return this.substring(start); }; //判断数组array中是否包含元素obj的函数,包含则返回true,不包含则返回false function array_contain(array, obj){ for (var i = 0; i < array.length; i++){ if (array[i] == obj) return true; } return false; } //判断年份year是否为闰年,是闰年则返回true,否则返回false function isleapyear(year){ var a = year % 4; var b = year % 100; var c = year % 400; if( ( (a == 0) && (b != 0) ) || (c == 0) ){ return true; } return false; } //清除方格 function clearpane(){ var limit = document.getelementsbyclassname("pane").length; for(var i=7; i < limit; i++){ var pane = document.getelementsbyclassname("pane").item(7); pane.parentnode.removechild(pane); } } //判断输入是否合法 function isvalidated(){ var year = document.getelementbyid("input_year").value; var month = document.getelementbyid("input_month").value; if(isnan(year) || isnan(month)){ alert("请输入正确的年份/月份"); return false; } else{ if(year%1 != 0 || month%1 != 0){ alert("请输入正确的年份/月份"); return false; } else{ year = parseint(year); if(year < 1960 || year > 2050){ alert("请输入1960~2050之间的年份!"); return false; } else if(month < 1 || month >12){ alert("请输入正确的月份!"); return false; } else{ return true; } } } } //年份月份发生变化时处理函数 function changed(){ if(isvalidated()){ var year = document.getelementbyid("input_year").value; var month = document.getelementbyid("input_month").value; var val = year + separator + month + separator + 1; init(val); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
更多纯javascript版日历控件。
其它类似信息

推荐信息