TXT

Calendar

By Thomas Scott,2014-12-27 06:05
11 views 0
Calendar

     根据网上的梅花雨日历控件3.0修改:修正了一点小BUG~

    1.修正嵌套在Frame中报错问题;

    2.修正星期和日期表格没有对齐问题;

    3.修正选择月份下拉框时,状态栏被修改问题;

    4.增加了清空按钮;

    5.增加设置显示日期天数的设置(35天到39)

使用~把下面的“calendar.js文件内容”部分复制并拷贝到calendar.js文件中:然后新

    建一个HTML文件~

    <script language=javascript src="calendar.js"></script> <input name="s1" type="text" onfocus="calendar()" /> 就可以看到效果了。

calendar.js文件内容~

    <!--

    document.write("<div id=meizzCalendarLayer style='position: absolute; z-index:

    9999; width: 144; height: 193; display: none'>"); document.write("<iframe name=meizzCalendarIframe scrolling=no frameborder=0

    width=100% height=100%></iframe></div>");

    function document.onclick()

    {

     if(WebCalendar.eventSrc != window.event.srcElement) hiddenCalendar();

    }

var WebCalendar = new WebCalendar();

    function WebCalendar() //初始化日历的设置

    {

     this.regInfo = "梅花雨日历控件3.1(修正~水边)&#13;关闭的快捷键~[Esc]";

     this.dayShow = 38; //定义页面上要显示的天数,

    不能小于35,或大于39

     this.daysMonth = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);//

    定义1~12月的天数

     this.day = new Array(this.dayShow); //定义日历展示用的数组

     this.dayObj = new Array(this.dayShow); //定义日期展示控件数组

     this.dateStyle = null; //保存格式化后日期数组

     this.objExport = null; //日历回传的显示控件

     this.eventSrc = null; //日历显示的触发控件

     this.inputDate = null; //转化外的输入的日期

    (d/m/yyyy)

     this.thisYear = new Date().getFullYear(); //定义年的变量的初始值

     this.thisMonth = new Date().getMonth()+ 1; //定义月的变量的初始值

     this.thisDay = new Date().getDate(); //定义日的变量的初始值

     this.today = this.thisDay +"/"+ this.thisMonth +"/"+ this.thisYear;

//今天(d/m/yyyy)

     this.iframe = window.frames("meizzCalendarIframe"); //日历的 iframe

    载体

     this.calendar = getObjectById("meizzCalendarLayer"); //日历的层

     this.dateReg = ""; //日历格式验证的正则式

     this.yearFall = 50; //定义显示的年份下拉框的年差值:如果今

    年是2000年:这里设置为50:就显示19502050

     this.format = "yyyy-mm-dd"; //回传日期的格式

     this.timeShow = false; //是否返回时间

     this.drag = true; //是否允许拖动

     this.darkColor = "#95B7F3"; //控件的暗色

     this.lightColor = "#FFFFF this.btnBgColor = "#E6E6FA"; //控件的按

    钮背景色

     this.wordColor = "#000080"; //控件的文字颜色

     this.wordDark = "#DCDCDC"; //控件的暗文字颜色

     this.dayBgColor = "#F5F5FA"; //日期数字背景色

     this.todayColor = "#FF0000"; //今天在日历上的标示背景色

     this.DarkBorder = "#D4D0C8"; //日期显示的立体表达色

    }

function writeIframe()

    {

     var strIframe = "<html><head><meta http-equiv='Content-Type' content='text/html; charset=gb2312'><style>"+

     "*{font-size: 12px; font-family: 宋体}"+

     ".bg{ color: "+ WebCalendar.lightColor +"; cursor: default; background-color: "+ WebCalendar.darkColor +";}"+

     "table#tableMain{ width: 142; height: 180;}"+

     "table#tableWeek td{ width:14%;color: "+ WebCalendar.lightColor +";}"+

     "table#tableDay td{ width:14%;font-weight: bold;}"+

     "td#meizzYearHead, td#meizzYearMonth{color: "+ WebCalendar.wordColor +"}"+

     ".out { text-align: center; border-top: 1px solid "+ WebCalendar.DarkBorder +"; border-left: 1px solid "+ WebCalendar.DarkBorder +";"+

     "border-right: 1px solid "+ WebCalendar.lightColor +"; border-bottom: 1px solid "+ WebCalendar.lightColor +";}"+

     ".over{ text-align: center; border-top: 1px solid #FFFFFF; border-left: 1px solid #FFFFFF;"+

     "border-bottom: 1px solid "+ WebCalendar.DarkBorder +"; border-right: 1px solid "+ WebCalendar.DarkBorder +"}"+

     "input{ border: 1px solid "+ WebCalendar.darkColor +"; padding-top: 1px; height: 18; cursor: hand;"+

     " color:"+ WebCalendar.wordColor +"; background-color: "+ WebCalendar.btnBgColor +"}"+

     "</style></head><body onselectstart='return false' style='margin: 0px' oncontextmenu='return false'><form name=meizz>";

     if (WebCalendar.drag){ strIframe += "<scr"+"ipt language=javascript>"+

     "var drag=false, cx=0, cy=0, o = parent.WebCalendar.calendar; function document.onmousemove(){"+

     "if(parent.WebCalendar.drag && drag){if(o.style.left=='')o.style.left=0; if(o.style.top=='')o.style.top=0;"+

     "o.style.left = parseInt(o.style.left) + window.event.clientX-cx;"+

     "o.style.top = parseInt(o.style.top) + window.event.clientY-cy;}}"+

     "function document.onkeydown(){ switch(window.event.keyCode){ case 27 : parent.hiddenCalendar(); break;"+

     "case 37 : parent.prevM(); break; case 38 : parent.prevY(); break; case 39 : parent.nextM(); break; case 40 : parent.nextY(); break;"+

     "case 84 : document.forms[0].today.click(); break;} window.event.keyCode = 0; window.event.returnValue= false;}"+

     "function dragStart(){cx=window.event.clientX; cy=window.event.clientY; drag=true;}</scr"+"ipt>"}

     strIframe += "<select name=tmpYearSelect

    onblur='parent.hiddenSelect(this)'

    style='z-index:1;position:absolute;top:3;left:18;display:none'"+

     " onchange='parent.WebCalendar.thisYe "<select name=tmpMonthSelect onblur='parent.hiddenSelect(this)' style='z-index:1;

    position:absolute;top:3;left:74;display:none'"+

     " onchange='parent.WebCalendar.thisMonth=this.value;

    parent.hiddenSelect(this); parent.writeCalendar();'></select>"+

     "<table id=tableMain class=bg border=0 cellspacing=2 cellpadding=0>"+

     "<tr><td width=140 height=19 bgcolor='"+ WebCalendar.lightColor +"'>"+

     " <table width=140 id=tableHead border=0 cellspacing=1 cellpadding=0><tr align=center>"+

     " <td width=15 height=19 class=bg title='向前翻 1 &#13;快捷键~?'

    style='cursor: hand' onclick='parent.prevM()'><b>&lt;</b></td>"+

     " <td width=60 id=meizzYearHead title='点击此处选择年份'

    onclick='parent.funYearSelect(parseInt(this.innerText, 10))'"+

     " onmouseover='this.bgColor=parent.WebCalendar.darkColor; this.style.color=parent.WebCalendar.lightColor'"+

     " onmouseout='this.bgColor=parent.WebCalendar.lightColor; this.style.color=parent.WebCalendar.wordColor'></td>"+

     " <td width=50 id=meizzYearMonth title='点击此处选择月份'

    onclick='parent.funMonthSelect(parseInt(this.innerText, 10))'"+

     " onmouseover='this.bgColor=parent.WebCalendar.darkColor; this.style.color=parent.WebCalendar.lightColor'"+

     " onmouseout='this.bgColor=parent.WebCalendar.lightColor; this.style.color=parent.WebCalendar.wordColor'></td>"+

     " <td width=15 class=bg title='向后翻 1 &#13;快捷键~?'

    onclick='parent.nextM()' style='cursor: hand'><b>&gt;</b></td></tr></table>"+

     "</td></tr><tr><td height=20><table id=tableWeek border=1 width=140 cellpadding=0 cellspacing=0 ";

     if(WebCalendar.drag){strIframe += "onmousedown='dragStart()' onmouseup='drag=false' onmouseout='drag=false'";}

     strIframe += " borderColorLight='"+ WebCalendar.darkColor +"' borderColorDark='"+ WebCalendar.lightColor +"'>"+

     " <tr align=center><td height=20></td><td></td><td></td><td>

    </td><td></td><td></td><td></td></tr></table>"+

     "</td></tr><tr><td valign=top width=140 bgcolor='"+ WebCalendar.lightColor +"'>"+

     " <table id=tableDay height=120 width=140 border=0 cellspacing=1 cellpadding=0>";

     for(var x=0; x<5; x++){

     strIframe += "<tr>";

     for(var y=0; y<7; y++)

     strIframe += "<td class=out id='meizzDay"+ (x*7+y) +"'></td>";

     strIframe += "</tr>";

     }

     strIframe += "<tr>";

     for(var x=35; x<WebCalendar.dayShow; x++)

     strIframe += "<td class=out id='meizzDay"+ x +"'></td>";

     strIframe +="<td colspan="+(42-WebCalendar.dayShow).toString()+" class=out style='text-align:center;' title='"+ WebCalendar.regInfo +"'>" +

     "<input style=' background-color: " + WebCalendar.btnBgColor +";curso " type=button value='清空'

    onclick='parent.WebCalendar.objExport.value=\"\";parent.hiddenCalendar()'>" +

     "&nbsp;" +

     "<input style=' background-color: " + WebCalendar.btnBgColor +";cursor: hand; padding-top: 2px; width: 44%; height: 100%;' onfocus='this.blur()'"+

     " type=button value='关闭' onclick='parent.hiddenCalendar()'>" +

     "</td></tr></table>"+

     "</td></tr><tr><td height=20 width=140 bgcolor='"+ WebCalendar.lightColor +"'>"+

     " <table border=0 cellpadding=1 cellspacing=0 width=140>"+

     " <tr><td><input name=prevYear title='向前翻 1 &#13;快捷键~?'

    onclick='parent.prevY()' type=button value='&lt;&lt;'"+

     " onfocus='this.blur()'

    style='meizz:expression(this.disabled=parent.WebCalendar.thisYear==1000)'><input"+

     " onfocus='this.blur()' name=prevMonth title='向前翻 1 &#13;快捷键~

    ?' onclick='parent.prevM()' type=button value='&lt;&nbsp;'>"+

     " </td><td align=center><input name=today type=button value='Today' onfocus='this.blur()' style='width: 50' title='当前日期&#13;快捷键~T'"+

     " onclick=\"parent.returnDate(new Date().getDate() +'/'+ (new Date().getMonth() +1) +'/'+ new Date().getFullYear())\">"+

     " </td><td align=right><input title='向后翻 1 &#13;快捷键~?'

    name=nextMonth onclick='parent.nextM()' type=button value='&nbsp;&gt;'"+

     " onfocus='this.blur()'><input name=nextYear title='向后翻 1 &#13;

    快捷键~?' onclick='parent.nextY()' type=button value='&gt;&gt;'"+

     " onfocus='this.blur()'

    style='meizz:expression(this.disabled=parent.WebCalendar.thisYear==9999)'></td></tr></table>"+

     "</td></tr><table></form></body></html>";

     with(WebCalendar.iframe)

     {

     document.writeln(strIframe); document.close();

     for(var i=0; i<WebCalendar.dayShow; i++)

     {

     WebCalendar.dayObj[i] = eval("meizzDay"+ i);

     WebCalendar.dayObj[i].onmouseover = dayMouseOver;

     WebCalendar.dayObj[i].onmouseout = dayMouseOut;

     WebCalendar.dayObj[i].onclick = returnDate;

     }

     }

    }

function calendar() //主调函数

    {

     var e = window.event.srcElement; writeIframe();

     var o = WebCalendar.calendar.style; WebCalendar.eventSrc = e; if (arguments.length == 0) WebCalendar.objExport = e;

     else WebCalendar.objExport = eval(arguments[0]);

     WebCalendar.iframe.tableWeek.style.cursor = WebCalendar.drag ? "move" : "default";

    var t = e.offsetTop, h = e.clientHeight, l = e.offsetLeft, p = e.type; while (e = e.offsetParent){t += e.offsetTop; l += e.offsetLeft;}

     o.display = ""; WebCalendar.iframe.document.body.focus();

     var cw = WebCalendar.calendar.clientWidth, ch =

    WebCalendar.calendar.clientHeight;

     var dw = document.bod

     if (document.body.clientHeight + dt - t - h >= ch) o.top = (p=="image")? t + h : t + h + 6;

     else o.top = (t - dt < ch) ? ((p=="image")? t + h : t + h + 6) : t - ch;

     if (dw + dl - l >= cw) o.left = l; else o.left = (dw >= cw) ? dw - cw + dl : dl;

     if (!WebCalendar.timeShow) WebCalendar.dateReg =

    /^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2})$/;

     else WebCalendar.dateReg = /^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2}) (\d{1,2}):(\d{1,2}):(\d{1,2})$/;

     try{

     if (WebCalendar.objExport.value.trim() != ""){

     WebCalendar.dateStyle =

    WebCalendar.objExport.value.trim().match(WebCalendar.dateReg);

     if (WebCalendar.dateStyle == null)

     {

     WebCalendar.thisYear = new Date().getFullYear();

     WebCalendar.thisMonth = new Date().getMonth()+ 1;

     WebCalendar.thisDay = new Date().getDate();

     alert("原文本框里的日期有错误(\n可能与你定义的显示时分秒有冲

    突(");

     writeCalendar(); return false;

     }

     else

     {

     WebCalendar.thisYear = parseInt(WebCalendar.dateStyle[1], 10);

     WebCalendar.thisMonth = parseInt(WebCalendar.dateStyle[3], 10);

     WebCalendar.thisDay = parseInt(WebCalendar.dateStyle[4], 10);

     WebCalendar.inputDate = parseInt(WebCalendar.thisDay, 10) +"/"+ parseInt(WebCalendar.thisMonth, 10) +"/"+

     parseInt(WebCalendar.thisYear, 10); writeCalendar();

     }

     } else writeCalendar();

     } catch(e){writeCalendar();}

    }

function funMonthSelect() //月份的下拉框

    {

     var m = isNaN(parseInt(WebCalendar.thisMonth, 10)) ? new Date().getMonth() + 1 : parseInt(WebCalendar.thisMonth);

     var e = WebCalendar.iframe.document.forms[0].tmpMonthSelect;

     for (var i=1; i<13; i++) e.options.add(new Option(i +"", i));

     e.style.display = ""; e.value = m; e.focus(); window.status = e.style.top;

}

function funYearSelect() //年份的下拉框

    {

     var n = WebCalendar.yearFall;

     var e = WebCalendar.iframe.document.forms[0].tmpYearSelect;

     var y = isNaN(parseInt(WebCalendar.thisYear, 10)) ? new Date().getFullYear() :

    parseInt(WebCalendar.thisYear);

     y = (y <= 1000)? 1000 : ((y >= 9999)? 9999 : y);

     var min = (y - n >= 1000) ? y - n : 1000;

     var max = (y + n <= 9999) ? y + n : 9999;

     min = (max == 9999) ? max-n*2 : min;

     max = (min == 1000) ? min+n*2 : max;

     for (var i=min; i<=max; i++) e.options.add(new Option(i +"", i));

     e.style.display = ""; e.value = y; e.focus(); }

function prevM() //往前翻月份

    {

     WebCalendar.thisDay = 1;

     if (WebCalendar.thisMonth==1)

     {

     WebCalendar.thisYear WebCalendar.thisMonth=13;

     }

     WebCalendar.thisMonth--; writeCalendar();

    }

function nextM() //往后翻月份

    {

     WebCalendar.thisDay = 1;

     if (WebCalendar.thisMonth==12)

     {

     WebCalendar.thisYear++;

     WebCalendar.thisMonth=0;

     }

     WebCalendar.thisMonth++; writeCalendar();

    }

    function prevY(){WebCalendar.thisDay = 1; WebCalendar.thisYear--; writeCalendar();}//往前翻 Year

    function nextY(){WebCalendar.thisDay = 1; WebCalendar.thisYear++; writeCalendar();}//往后翻 Year

    function hiddenSelect(e){for(var i=e.options.length; i>-1; i--)e.options.remove(i);

    e.style.display="none";}

    function getObjectById(id){ if(document.all) return(eval("document.all."+ id));

return(eval(id)); }

    function hiddenCalendar(){getObjectById("meizzCalendarLayer").style.display =

    "none";};

    function appendZero(n){return(("00"+ n).substr(("00"+ n).length-2));}//日期自动补

    零程序

    function String.prototype.trim(){return this.replace(/(^\s*)|(\s*$)/g,"");}

    function dayMouseOver()

    {

     this.className = "over";

     this.style.backgroundColor = WebCalendar.darkColor;

     if(WebCalendar.day[this.id.substr(8)].split("/")[1] == WebCalendar.thisMonth)

     this.style.color = WebCalendar.lightColor;

    }

    function dayMouseOut()

    {

     this.className = "out"; var d = WebCalendar.day[this.id.substr(8)], a =

    d.split("/");

     this.style.removeAttribute('backgroundColor');

     if(a[1] == WebCalendar.thisMonth && d != WebCalendar.today)

     {

     if(WebCalendar.dateStyle && a[0] == parseInt(WebCalendar.dateStyle[4],

    10))

     this.style.color = WebCalendar.lightColor;

     this.style.color = WebCalendar.wordColor;

     }

    }

    function writeCalendar() //对日历显示的数据的处理程序

    {

     var y = WebCalendar.thisYear;

     var m = WebCalendar.thisMonth;

     var d = WebCalendar.thisDay;

     WebCalendar.daysMonth[1] = (0==y%4 && (y%100!=0 || y%400==0)) ? 29 : 28;

     if (!(y<=9999 && y >= 1000 && parseInt(m, 10)>0 && parseInt(m, 10)<13 &&

    parseInt(d, 10)>0)){

     alert("对不起:你输入了错误的日期(");

     WebCalendar.thisYear = new Date().getFullYear();

     WebCalendar.thisMonth = new Date().getMonth()+ 1;

     WebCalendar.thisDay = new Date().getDate(); }

     y = WebCalendar.thisYear;

     m = WebCalendar.thisMonth;

     d = WebCalendar.thisDay;

     WebCalendar.iframe.meizzYearHead.innerText = y +" ";

     WebCalendar.iframe.meizzYearMonth.innerText = parseInt(m, 10) +" ";

     WebCalendar.daysMonth[1] = (0==y%4 && (y%100!=0 || y%400==0)) ? 29 : 28; //闰年二月为29

     var w = new Date(y, m-1, 1).getDay();

     var prevDays = m==1 ? WebCalendar.daysMonth[11] : WebCalendar.daysMonth[m-2];

     for(var i=(w-1); i>=0; i--) //这三个 for 循环为日历赋数据源;数组

    WebCalendar.day,格式是 d/m/yyyy

     {

     WebCalendar. if(m==1) WebCalendar.day[i] = prevDays +"/"+ 12 +"/"+ (parseInt(y, 10)-1);

     prevDays--;

     }

     for(var i=1; i<=WebCalendar.daysMonth[m-1]; i++) WebCalendar.day[i+w-1] = i +"/"+ m +"/"+ y;

     for(var i=1; i<WebCalendar.dayShow-w-WebCalendar.daysMonth[m-1]+1; i++)

     {

     WebCalendar.day[WebCalendar.daysMonth[m-1]+w-1+i] = i +"/"+ (parseInt(m, 10)+1) +"/"+ y;

     if(m==12) WebCalendar.day[WebCalendar.daysMonth[m-1]+w-1+i] = i +"/"+ 1 +"/"+ (parseInt(y, 10)+1);

     }

     for(var i=0; i<WebCalendar.dayShow; i++) //这个循环是根据源数组写到日

    历里显示

     {

     var a = WebCalendar.day[i].split("/");

     WebCalendar.dayObj[i].innerText = a[0];

     WebCalendar.dayObj[i].title = a[2] +"-"+ appendZero(a[1]) +"-"+ appendZero(a[0]);

     WebCalendar.dayObj[i].bgColor = WebCalendar.dayBgColor;

     WebCalendar.dayObj[i].style.color = WebCalendar.wordColor;

     if ((i<10 && parseInt(WebCalendar.day[i], 10)>20) || (i>27 && parseInt(WebCalendar.day[i], 10)<12))

     WebCalendar.dayObj[i].style.color = WebCalendar.wordDark;

     if (WebCalendar.inputDate==WebCalendar.day[i]) //设置输入框里的日

    期在日历上的颜色

     {WebCalendar.dayObj[i].bgColor = WebCalendar.darkColor; WebCalendar.dayObj[i].style.color = WebCalendar.lightColor;}

     if (WebCalendar.day[i] == WebCalendar.today) //设置今天在日历上

    反应出来的颜色

     {WebCalendar.dayObj[i].bgColor = WebCalendar.todayColor; WebCalendar.dayObj[i].style.color = WebCalendar.lightColor;}

     }

    }

    function returnDate() //根据日期格式等返回用户选定的日期

{

     if(WebCalendar.objExport)

     {

     var returnValue;

     var a = (arguments.length==0) ?

    WebCalendar.day[this.id.substr(8)].split("/") : arguments[0].split("/");

     var d =

    WebCalendar.format.match(/^(\w{4})(-|\/)(\w{1,2})\2(\w{1,2})$/);

     if(d==null){alert("你设定的日期输出格式不对(\r\n\r\n请重新定义

    WebCalendar.format ("); return false;}

     var flag = d[3].length==2 || d[4].length==2; //判断返回的日期格式是否要

    补零

     returnValue = flag ? a[2] +d[2]+ appendZero(a[1]) +d[2]+ appendZero(a[0]) :

    a[2] +d[2]+ a[1] +d[2]+ a[0];

     if(WebCalendar.timeShow)

     {

     var h = new Date().getHours(), m = new Date().getMinutes(), s = new

    Date().getSeconds();

     returnValue += flag ? " "+ appendZero(h) +":"+ appendZero(m) +":"+

    appendZero(s) : " "+ h +":"+ m +":"+ s;

     }

     WebCalendar.objExport.value = returnValue;

     hiddenCalendar();

     }

    }

    //-->

Report this document

For any questions or suggestions please email
cust-service@docsford.com