JS实现日历控件

1 篇文章 0 订阅
        的确,网上各种日历控件数不胜数,但也正是因为太多,所以选择起来也是件困难的事情。前不久,因为项目要求,就去试着找了些,但总感觉都不太完美,或者因为不够简单,不需要那么复杂的功能,或者因为不好用,不适合项目。我也选一个最接近的试着去读懂,然后想把它改成我所需要的,可惜的是,根本没法读懂,也不知道是我一直都习惯自己写,确实不擅长读别人的代码,还是确实因为其代码难读,其中取的变量名都是ABC之类的,纠结了。后来索性自己花时间写了一个,虽然不一定比得上网上流传的那些,但基本功能还是都有的,就在这里贴出来,算是给自己的一次肯定吧,呵呵。

       先贴CSS部分:

    

         #calendar {
                position: relative;
                font-size: 12px;
                padding: 0;
                z-index: 9998;
                background-color: #FFF9DF;
                border: 1px solid #999;
            }#calendar .left {
                float: left;
            } #calendar .right {
                float: right;
            } #calendar .btn {
                border-radius: 3px;
                border: 1px solid #333;
                background-color: #CCC;
                cursor: pointer;
                margin: 0 3px;
                padding: 2px 5px;
                color: #111;
            }#calendar #year, #month {
                display: inline-block;
                padding: 2px 8px;
                margin: 2px auto;
                text-align: center;
                cursor: pointer;
                border: 1px solid #DDD;
            } #calendar #date .week {
                font-size: 12px;
                text-align: center;
                font-family: arial;
                font-weight: bold;
                margin: 0;
                padding: 0 7px;
                color: #FFF;
                background-color: #999;
                border: 1px solid #222;
            } #calendar #date .week:hover {
                color: #FFF;
                border: 1px solid #222;
            } #calendar #date td {
                text-align: center;
                margin: 0;
                padding: 1px;
                color: #111;
                cursor: pointer;
                background-color: #DDD;
                border: 1px solid #DDD;
            } #calendar #date td:hover {
                color: #7A6E93;
                background-color: #DFC9A7;
                border: 1px solid #F90;
            } #calendar #date .today {
                background-color: #FC0;
            }#calendar #date .before, #calendar #date .after {
                color: #AAA;
                background-color: #EEE;
            } #selYear, #selMonth {
                z-index: 9999;
                background-color: #EEE;
                border: 1px solid #DDD;
            } #selYear span, #selMonth span {
                display: block;
                font-size: 10px;
                height: 11px;
                padding: 2px 8px;
                text-align: center;
                cursor: pointer;
                border: 1px solid #DDD;
            } #selYear span:hover, #selMonth span:hover {
                background-color: #999;
            } #selYear .preYear, #selYear .afterYear {
                height: 1px;
                background-color: #EBB;
            } .bottom {
                text-align: center;
                cursor: pointer;
            } .close {
                padding: 3px 5px;;
                border-radius: 12px;
                border: 1px solid #F90;
                background-color: #7A6E93;
                color: #EEE;
            } .close:hover {
                border: 2px solid red;
            }#time {
                visibility: hidden;
                padding: 3px;
                text-align: center;
                color: #FFE;
                border-radius: 2px;
                background-color: #8B96B9;
            } #hour, #min, #sec {
                padding: 2px 5px;
            } #inputTime {
                width: 15px;
                padding: 0;
                margin: 0 auto;
                background-color: #8B96B9;
                text-align: center;
                z-index: 9999;
                border: none;
            }.selTime {
                position: relative;
                top: -2px;
                font-size: 12px;
            }

              再贴上JS部分:

        var week = new Array("日", "一", "二", "三", "四", "五", "六");
        //初始化日期时间(可以传入一个Date参数)
        function initDate(){
            calClose = false;
            var table = document.getElementById("date");
            if (table == null) {
                return;
            }
            var date = arguments[0];
            if (arguments.length == 0) {
                try {
                    var year = parseInt(document.getElementById("year").innerHTML);
                    var month = parseInt(document.getElementById("month").innerHTML) - 1;
                    date = new Date(year, month);
                } 
                catch (e) {
                    date = new Date();
                }
            }
            
            if (table.children.length != 0) 
                table.removeChild(table.children[0]);
            var tr = table.insertRow(0);
            for (var i = 0; i < 7; i++) {
                var td = tr.insertCell(tr.cells.length);
                initTd(td, week[i], "week");
            }
            var year = date.getFullYear();
            document.getElementById("year").innerHTML = year + "";
            var month = date.getMonth();
            document.getElementById("month").innerHTML = (month + 1) + "";
            var day = new Date(year, month + 1, 0).getDate();
            var w = new Date(year, month, 1).getDay();
            tr = table.insertRow(table.rows.length);
            var lastDay = new Date(year, month, 0).getDate();
            var today = -1;
            if (arguments.length == 2) {
                today = arguments[1];
            }
            for (i = 0; i < w; i++) {
                var td = tr.insertCell(tr.cells.length);
                initTd(td, lastDay - w + i, "before");
            }
            for (i = w; i < 7; i++) {
                var td = tr.insertCell(tr.cells.length);
                if (i - w + 1 == today) {
                    td.className = "today";
                }
                initTd(td, i - w + 1);
            }
            for (i = 7 - w + 1; i <= day; i++) {
                if ((i - 8 + w) % 7 == 0) {
                    tr = table.insertRow(table.rows.length);
                }
                var td = tr.insertCell(tr.cells.length);
                if (i == today) {
                    td.className = "today";
                }
                initTd(td, i);
            }
            var nextWeek = new Date(year, month + 1, 0).getDay();
            if (nextWeek != 6) {
                for (i = 1; i < 7 - nextWeek % 6; i++) {
                    var td = tr.insertCell(tr.cells.length);
                    initTd(td, i, "after");
                }
            }
        }
        
        //辅助函数,生成特定类型的td
        function initTd(td, text, className){
            td.innerHTML = text + "";
            if (className != "week") 
                td.onclick = getDate;
            if (className) {
                td.className = className;
                if (className == "before") 
                    td.title = (parseInt(document.getElementById("year").innerHTML) - 1 + Math.floor((parseInt(document.getElementById("month").innerHTML) + 10) / 12)) + "-" + ((parseInt(document.getElementById("month").innerHTML) + 10) % 12 + 1) + "-" + text;
                else 
                    if (className == "after") 
                        td.title = (parseInt(document.getElementById("year").innerHTML) + Math.floor((parseInt(document.getElementById("month").innerHTML) + 1) / 12)) + "-" + (parseInt(document.getElementById("month").innerHTML) % 12 + 1) + "-" + text;
                    else 
                        td.title = "星期" + text;
            }
            else 
                td.title = document.getElementById("year").innerHTML + "-" + document.getElementById("month").innerHTML + "-" + text;
        }
        
        //创建特定类型的span
        function createSpan(innerHTML, title, idName, className, fun){
            span = document.createElement("span");
            span.innerHTML = innerHTML;
            if (title != null && title != "undefined") {
                span.title = title;
            }
            if (idName != null && idName != "undefined") 
                span.id = idName;
            if (className != null && className != "undefined") 
                span.className = className;
            if (fun != null && fun != "undefined") {
                span.onclick = fun;
            }
            return span;
        }
        
        //上一年  按钮<<函数
        function lastYear(){
            var year = parseInt(document.getElementById("year").innerHTML) - 1;
            var month = parseInt(document.getElementById("month").innerHTML) - 1;
            initDate(new Date(year, month));
        }
        
        //上一月  按钮<函数
        function lastMonth(){
            var year = parseInt(document.getElementById("year").innerHTML);
            var month = parseInt(document.getElementById("month").innerHTML) - 2;
            initDate(new Date(year, month));
        }
        
        //下一年  按钮>>函数
        function nextYear(){
            var year = parseInt(document.getElementById("year").innerHTML) + 1;
            var month = parseInt(document.getElementById("month").innerHTML) - 1;
            initDate(new Date(year, month));
        }
        
        //下一月  按钮>函数
        function nextMonth(){
            var year = parseInt(document.getElementById("year").innerHTML);
            var month = parseInt(document.getElementById("month").innerHTML);
            initDate(new Date(year, month));
        }
        
        //选择月份 月份控件函数
        function selectMonth(){
            if (document.getElementById("selYear")) 
                document.getElementById("selYear").style.display = "none";
            var cal = document.getElementById("calendar");
            var span = document.getElementById("selMonth");
            if (span == null) {
                span = document.createElement("span");
                document.body.appendChild(span);
                span.id = "selMonth";
                span.style.position = "absolute";
                
                for (var i = 1; i < 13; i++) {
                    span.appendChild(createSpan(i, i + "月", null, null, getMonth));
                }
            }
            else {
                span.style.display = "";
            }
            var x = this.offsetLeft;
            var y = this.offsetTop;
            var tt = this;
            while (tt = tt.offsetParent) {
                y += tt.offsetTop;
                x += tt.offsetLeft;
            }
            span.style.left = (x + 1) + "px";
            span.style.top = (y + 1) + "px";
        }
        
        //选择年份 年份控件函数
        function selectYear(){
            if (document.getElementById("selMonth")) 
                document.getElementById("selMonth").style.display = "none";
            var span = document.getElementById("selYear");
            if (span == null) {
                span = document.createElement("span");
                document.body.appendChild(span);
                span.id = "selYear";
                span.style.position = "absolute";
                
                var childSpan = document.createElement("span");
                childSpan.className = "preYear";
                childSpan.onmouseover = function(){
                    minus = setInterval(function(){
                        changeSel(-1);
                    }, 100);
                }
                childSpan.onmouseout = function(){
                    clearInterval(minus);
                }
                span.appendChild(childSpan);
                
                for (var i = 0; i < 9; i++) {
                    span.appendChild(createSpan("", null, null, "yearChild", getYear));
                }
                childSpan = document.createElement("span");
                childSpan.className = "afterYear";
                childSpan.onmouseover = function(){
                    add = setInterval(function(){
                        changeSel(1);
                    }, 100);
                }
                childSpan.onmouseout = function(){
                    clearInterval(add);
                }
                span.appendChild(childSpan);
            }
            else {
                span.style.display = "";
            }
            var cal = document.getElementById("calendar");
            var x = this.offsetLeft;
            var y = this.offsetTop;
            var tt = this;
            while (tt = tt.offsetParent) {
                y += tt.offsetTop;
                x += tt.offsetLeft;
            }
            span.style.left = (x + 1) + "px";
            span.style.top = (y + 1) + "px";
            var year = parseInt(this.innerHTML) - 5;
            for (var i = 1; i < span.children.length - 1; i++) {
                span.children[i].innerHTML = year + i;
                span.children[i].title = (year + i) + "年";
            }
        }
        
        //选取月份
        function getMonth(){
            document.getElementById("month").innerHTML = this.innerHTML;
            this.parentNode.style.display = "none";
            initDate();
        }
        
        //选取年份
        function getYear(){
            document.getElementById("year").innerHTML = this.innerHTML;
            this.parentNode.style.display = "none";
            initDate();
        }
        
        //选取年份控件更改选项函数
        function changeSel(param){
            var sel = document.getElementById("selYear");
            var firstYear = parseInt(sel.children[1].innerHTML) + param - 1;
            for (var i = 1; i < sel.children.length - 1; i++) {
                sel.children[i].innerHTML = firstYear + i;
                sel.children[i].title = (firstYear + i) + "年";
            }
        }
        
        //输入时间函数
        function inputTime(ori, num){
            var cal = document.getElementById("calendar");
            var input = document.getElementById("inputTime");
            if (input == null) {
                input = document.createElement("input");
                input.id = "inputTime";
                input.style.position = "absolute";
            }
            else {
                input.style.display = "";
            }
            var x = ori.offsetLeft;
            var y = ori.offsetTop;
            var tt = ori;
            while (tt = tt.offsetParent) {
                y += tt.offsetTop;
                x += tt.offsetLeft;
            }
            input.style.left = (x + 3) + "px";
            input.style.top = (y + 2) + "px";
            input.value = ori.innerHTML;
            input.onfocus = function(){
                this.select();
            }
			var down = false;
            input.onkeydown = function(event){
                if (event.keyCode == 13) {
                    input.blur();
                }else{
					down = true;
				}
            }
			input.onkeyup = function(){
				if(down&&this.value.length >= 2){
					this.blur();
					if(ori.nextSibling){
						if(ori.style.visibility == "visible")
						ori.nextSibling.nextSibling.click();
					}
				}
			}
            input.onblur = function(){
                this.style.display = "none";
                ori.style.visibility = "visible";
                var value = this.value;
                if (value == "") 
                    return;
                var re = /^\d{1,2}$/;
                if (!re.exec(value)) {
                    return;
                }
                var numValue = parseInt(value);
                if (num == 1) {
                    if (numValue < 0 || numValue > 23) 
                        numValue = 0;
                }
                else {
                    if (numValue < 0 || numValue > 59) 
                        numValue = 0;
                }
                value = "00" + numValue;
                ori.innerHTML = value.substr(value.length - 2);
            }
            ori.style.visibility = "hidden";
            document.body.appendChild(input);
            input.focus();
        }
        
        //获取所选日期时间 关闭日历
        function getDate(){
            var value = this.title;
            if (document.getElementById("selTime").checked) {
                value += (" " + document.getElementById("hour").innerHTML + ":" + document.getElementById("min").innerHTML + ":" + document.getElementById("sec").innerHTML);
            }
            result.value = value;
            close();
        }
        
        //重新设置日历日期时间(根据传入的日期时间字符串设置)
        function resetDate(){
            if (result.value != "") {
                var re = /^\d{4}-\d{1,2}-\d{1,2}$|^\d{4}-\d{1,2}-\d{1,2}\W\d{2}:\d{2}:\d{2}/;
                if (re.exec(result.value)) {
                    var value = result.value.split(" ");
                    if (value.length == 2) {
                        var time = value[1].split(":");
                        document.getElementById("time").style.visibility = "visible";
                        document.getElementById("selTime").checked = true;
                        document.getElementById("hour").innerHTML = time[0];
                        document.getElementById("min").innerHTML = time[1];
                        document.getElementById("sec").innerHTML = time[2];
                    }
                    else {
                        document.getElementById("time").style.visibility = "hidden";
                        document.getElementById("selTime").checked = false;
                    }
                    var dateNum = value[0].split("-");
                    var year = parseInt(dateNum[0]);
                    var month = parseInt(dateNum[1]);
                    var day = parseInt(dateNum[2]);
                    initDate(new Date(year, month - 1, day), day);
                }
                else {
                    initDate(new Date());
                }
            }
            else {
                initDate(new Date());
            }
        }
        
        //关闭日历
        function close(){
            document.getElementById("calendar").style.display = "none";
            if (document.getElementById("selYear")) 
                document.getElementById("selYear").style.display = "none";
            if (document.getElementById("selMonth")) 
                document.getElementById("selMonth").style.display = "none";
        }
        
        //创建日历控件
        function createCalendar(){
            if (arguments.length == 0) {
                alert("There is no arguments, the calendar initialize failed!");
                return;
            }
            result = arguments[0];
            var x = arguments[0].offsetLeft;
            var y = arguments[0].offsetTop + arguments[0].offsetHeight;
            var tt = result;
            while (tt = tt.offsetParent) {
                y += tt.offsetTop;
                x += tt.offsetLeft;
            }
            if (document.getElementById("calendar")) {
                var calendar = document.getElementById("calendar");
                calendar.style.display = "block";
                calendar.style.position = "absolute";
                calendar.style.left = x + "px";
                calendar.style.top = y + "px";
                resetDate();
                return;
            }
            var calendar = document.createElement("table");
            
            calendar.id = "calendar";
            calendar.style.position = "absolute";
            calendar.style.left = x + "px";
            calendar.style.top = y + "px";
            var tr = calendar.insertRow(calendar.rows.length);
            var td = tr.insertCell(tr.cells.length);
            
            var span = document.createElement("span");
            span.className = "left";
            span.appendChild(createSpan("<<", "上一年", null, "btn", lastYear));
            span.appendChild(createSpan("<", "上一月", null, "btn", lastMonth));
            td.appendChild(span);
            
            td = tr.insertCell(tr.cells.length);
            td.colSpan = 2;
			span = document.createElement("span");
            span.appendChild(createSpan("", "年份", "year", null, selectYear));
            span.appendChild(createSpan("年"));
            span.appendChild(createSpan("", "月份", "month", null, selectMonth));
            span.appendChild(createSpan("月"));
			td.appendChild(span);
            
            td = tr.insertCell(tr.cells.length);
            span = document.createElement("span");
            span.className = "right";
            span.appendChild(createSpan(">", "下一月", null, "btn", nextMonth));
            span.appendChild(createSpan(">>", "下一年", null, "btn", nextYear));
            td.appendChild(span);
            
            tr = calendar.insertRow(calendar.rows.length);
            td = tr.insertCell(tr.cells.length);
            td.colSpan = 4;
            ntable = document.createElement("table");
            ntable.id = "date";
            td.appendChild(ntable);
            
            tr = calendar.insertRow(calendar.rows.length);
            tr.className = "bottom";
            td = tr.insertCell(tr.cells.length);
            td.appendChild(createSpan("关闭", "关闭", null, "close", close));
            
            td = tr.insertCell(tr.cells.length);
            td.colSpan = 2;
            var div = document.createElement("div");
            div.id = "time";
            div.appendChild(createSpan("00", "时", "hour", null, function(){
                inputTime(this, 1)
            }));
            div.appendChild(createSpan(":"));
            div.appendChild(createSpan("00", "分", "min", null, function(){
                inputTime(this, 2)
            }));
            div.appendChild(createSpan(":"));
            div.appendChild(createSpan("00", "秒", "sec", null, function(){
                inputTime(this, 3)
            }));
            td.appendChild(div);
            
            td = tr.insertCell(tr.cells.length);
            var input = document.createElement("input");
            input.type = "checkbox";
            input.id = "selTime";
            input.title = "选择是否需要时间";
            input.onclick = function(){
                if (this.checked) {
                    document.getElementById("time").style.visibility = "visible";
                }
                else {
                    document.getElementById("time").style.visibility = "hidden";
                }
            }
            td.appendChild(input);
            td.appendChild(createSpan("时间", "选择是否需要时间", null, "selTime", function(){
                this.previousSibling.click();
            }));
            document.onclick = function(){
                if (calClose) {
                    close();
                }
                else {
                    calClose = true;
                }
            }
            calendar.onclick = function(){
                calClose = false;
            }
            
            document.body.appendChild(calendar);
            resetDate();
        }

       最后就是使用了,很简单,看下面的例子就知道了(引入CSS、JS文件或者直接全部放在一个页面里(不建议))。

                 例:<input οnfοcus="createCalendar(this)"/>

        行了,一点输入框就会弹出日历了。

效果图如下:



 


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
<SCRIPT LANGUAGE="JavaScript" TYPE="text/javascript"> //创建一个数组,用于存放每个月的天数 function montharr(m0, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11)  { this[0] = m0; this[1] = m1; this[2] = m2; this[3] = m3; this[4] = m4; this[5] = m5; this[6] = m6; this[7] = m7; this[8] = m8; this[9] = m9; this[10] = m10; this[11] = m11; } //实现月历 function calendar() { var monthNames = "JanFebMarAprMayJunJulAugSepOctNovDec"; var today = new Date(); var thisDay; var monthDays = new montharr(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); year = today.getYear() +1900; thisDay = today.getDate(); if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) monthDays[1] = 29; nDays = monthDays[today.getMonth()]; firstDay = today; firstDay.setDate(1); testMe = firstDay.getDate(); if (testMe == 2) firstDay.setDate(0); startDay = firstDay.getDay(); document.write("<div id='rili' style='position:absolute;width:140px;left:300px;top:100px;'>")  document.write("<TABLE width='217' BORDER='0' CELLSPACING='0' CELLPADDING='2' BGCOLOR='#0080FF'>") document.write("<TR><TD><table border='0' cellspacing='1' cellpadding='2' bgcolor='Silver'>"); document.write("<TR><th colspan='7' bgcolor='#C8E3FF'>"); var dayNames = new Array("星期日","星期一","星期二","星期三","星期四","星期五","星期六"); var monthNames = new Array("1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"); var now = new Date(); document.writeln("<FONT STYLE='font-size:9pt;Color:#330099'>" + "公元 " + now.getYear() + "年" + monthNames[now.getMonth()] + " " + now.getDate() + "日 " + dayNames[now.getDay()] + "</FONT>"); document.writeln("</TH></TR><TR><TH BGCOLOR='#0080FF'><FONT STYLE='font-size:9pt;Color:White'>日</FONT></TH>"); document.writeln("<th bgcolor='#0080FF'><FONT STYLE='font-size:9pt;Color:White'>一</FONT></TH>"); document.writeln("<TH BGCOLOR='#0080FF'><FONT STYLE='font-size:9pt;Color:White'>二</FONT></TH>"); document.writeln("<TH BGCOLOR='#0080FF'><FONT STYLE='font-size:9pt;Color:White'>三</FONT></TH>"); document.writeln("<TH BGCOLOR='#0080FF'><FONT STYLE='font-size:9pt;Color:White'>四</FONT></TH>"); document.writeln("<TH BGCOLOR='#0080FF'><FONT STYLE='font-size:9pt;Color:White'>五</FONT></TH>"); document.writeln("<TH BGCOLOR='#0080FF'><FONT STYLE='font-size:9pt;Color:White'>六</FONT></TH>"); document.writeln("</TR><TR>"); column = 0; for (i=0; i<startDay; i++) { document.writeln("\n<TD><FONT STYLE='font-size:9pt'> </FONT></TD>"); column++; } for (i=1; i<=nDays; i++) { if (i == thisDay) { document.writeln("</TD><TD ALIGN='CENTER' BGCOLOR='#FF8040'><FONT STYLE='font-size:9pt;Color:#ffffff'><B>") } else { document.writeln("</TD><TD BGCOLOR='#FFFFFF' ALIGN='CENTER'><FONT STYLE='font-size:9pt;font-family:Arial;font-weight:bold;Color:#330066'>"); } document.writeln(i); if (i == thisDay) document.writeln("</FONT></TD>") column++; if (column == 7) { document.writeln("<TR>");  column = 0; } } document.writeln("<TR><TD COLSPAN='7' ALIGN='CENTER' VALIGN='TOP' BGCOLOR='#0080FF'>") document.writeln("<FORM NAME='clock' onSubmit='0'><FONT STYLE='font-size:9pt;Color:#ffffff'>") document.writeln(" 现在时间:<INPUT TYPE='Text' NAME='face' ALIGN='TOP'></FONT></FORM></TD></TR></TABLE>") document.writeln("</TD></TR></TABLE></div>"); } </SCRIPT>

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值