JS横向日历控件

在网上复制的,修改了一下兼容性,可以兼容谷歌、火狐、苹果、欧朋、IE所有版本


1. [代码][JavaScript]代码     

001 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
002 <html xmlns="http://www.w3.org/1999/xhtml">
003  <head>
004   <title> new document </title>
005   <meta name="generator" content="editplus" />
006   <meta name="author" content="" />
007   <meta name="keywords" content="" />
008   <meta name="description" content="" />
009  <style type="text/css">
010     *{font-size:14px}
011     /*日期最外层*/
012     #logCalendar{width:950px;border-top:1px solid #ccc;border-left:1px solid #ccc}
013     /*日期内部所有单元格*/
014     #logCalendar td{
015         border-right:1px solid #ccc;border-bottom:1px solid #ccc;
016         padding-left:5px;text-align:center;
017         height:22px;line-height:22px;
018     }
019     #daysList{border-top:1px solid #ccc;border-left:1px solid #ccc}
020     /*日期列表所有单元格*/
021     #daysList td{text-align:center;height:22px}
022   
023     /*周次及星期几的输入框*/
024     .bd{border:0;text-align:center;color:#00f}
025     /*日期默认样式*/
026     .unSelectDay{
027         color:#00f;font-weight:normal;
028         padding:3px;cursor:pointer;
029         text-decoration:underline
030     }
031     /*当前点击的日期样式*/
032     .selectDay{color:#fff;font-weight:bold;background:#FEB0B0;padding:1px;text-decoration:none;cursor:normal}
033     /*周末样式*/
034     .weekEnd{color:#f00}
035   
036     .test{color:#f00;text-decoration:none}
037  </style>
038  <script type="text/javascript">
039      //2007-12-21 工作日志日期组件 yanwei
040      //使用闭包隐藏所有变量和函数,防止与外界冲突
041      var logDateControl = (function () {
042          var curSelEl;    //当前选中的日期
043          var styleData = [], dataStyle = {};
044          //获取指定id的元素
045          var $ = function (id) { return document.getElementById(id) }
046          //计算指定日期是第几周(默认为当前日期),该计算方法比较严密准确
047          var isIE = isIE || (function () {
048              var browser = function (str) { return navigator.userAgent.indexOf(str) > -1 }
049              return browser("MSIE") && browser("compatible") && !browser("Opera");
050          })();
051          //对于非IE浏览器的处理
052          if (!isIE) {
053              //innerText
054              HTMLElement.prototype.__defineSetter__("innerText"function (sText) {this.textContent = sText });
055              HTMLElement.prototype.__defineGetter__("innerText"function () { returnthis.textContent })
056          }
057          //触发click事件
058          var doClickEvent = function (obj) {
059              obj = obj || window;
060              if (isIE) { return obj.click() }
061              var e = document.createEvent("MouseEvents");
062              e.initEvent("click"truetrue);
063              obj.dispatchEvent(e);
064          }
065          //绑定事件
066          var attachEvent = function (evt, handler, obj) {
067              obj = obj || window;
068              if (obj.addEventListener) {
069                  obj.addEventListener(evt, handler, false);
070              else {
071                  obj.attachEvent("on" + evt, handler);
072              }
073          }
074   
075          var calWeek = function (dt) {
076              var calDay = dt || new Date();    //当前要计算的时间
077              var firstDay = new Date(calDay.getFullYear(), 0, 1);    //本年第一天
078              //计算当前是本年的第几天,00:00为当天开始
079              var daysAll = Math.floor((calDay - firstDay) / 1000 / 60 / 60 / 24) + 1;
080              //本年第一天星期几
081              var firstDayWeekday = firstDay.getDay();
082              //该结果加到第一周的周一,便于后面计算
083              var diffDay = firstDayWeekday == 0 ? 6 : firstDayWeekday - 1;
084              daysAll = daysAll + diffDay;
085              return Math.ceil(daysAll / 7);    //返回计算结果
086          }
087          //计算一个月多少天,年份4位数字,月份1-2位数字(应该是js日期格式如1月传入0),数据非法返回-1
088          var getDaysLen = function (year, month) {
089              if (!(/^\d{4}$/.test(year) && /^\d{1,2}$/.test(month))) { return -1 }
090              var monthDays = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
091              //存在2月29日
092              if (month == 1 && new Date(year, 1, 29).getMonth() == 1) { monthDays[1] = 29 }
093              return monthDays[month]
094          }
095          //显示日期列表,传入年、月(按日常月份传入。如二月传入2)、及显示位置
096          var displayDayList = function (year, month, pos) {
097              var daysList = [];
098              var cells1 = $(pos).rows[0].cells;
099              var cells2 = $(pos).rows[1].cells;
100              var daysArr = ["日""一""二""三""四""五""六"];
101              //下面的month-1转换为js月份表示
102              for (var i = 1, l = getDaysLen(year, --month) + 1; i < l; i++) {
103                  var wd = new Date(year, month, i).getDay();
104                  cells1[i - 1].className = "";
105                  if (wd == 0 || wd == 6) { cells1[i - 1].className = "weekEnd"; }    //为周末添加特殊样式
106                  //_oldCls保存当前日期的默认样式
107                  cells1[i - 1].innerHTML = daysArr[wd];
108                  cells2[i - 1].className = "unSelectDay";
109                  cells2[i - 1].setAttribute("_oldCls""unSelectDay");
110                  cells2[i - 1].innerHTML = i > 9 ? i : "0" + i;
111                  //匹配用户自定义样式
112                  var dtStr = year + "|" + (month + 1) + "|" + i;
113                  if (("," + styleData.join() + ",").indexOf("," + dtStr + ",") > -1) {
114                      cells2[i - 1].className = "unSelectDay " + dataStyle[dtStr];
115                      cells2[i - 1].setAttribute("_oldCls""unSelectDay " + dataStyle[dtStr]);
116                  }
117              }
118              //如果是当前月则选中当日
119              if (new Date().getMonth() == month) {
120                  curSelEl = cells2[new Date().getDate() - 1];
121                  curSelEl.className = "selectDay";
122              }
123              for (var j = i - 1; j < 31; j++) {
124                  cells1[j].className = cells2[j].className = "";
125                  cells1[j].innerHTML = cells2[j].innerHTML = "  ";
126              }
127              $(pos).onclick = function (e) { changeInfo(e) }
128          }
129          //根据选择的值进行处理周次和周几的调整,可以直接传入保存日期内容的dom元素,或者函数根据点击位置判断
130          var changeInfo = function (e) {
131              e = e || event;
132              var el = e.target || e.srcElement || e;    //最后一个e:可能是传入的对象
133              var day = el.innerText;
134              //alert(day);
135              if (!/^\d{1,2}$/.test(day)) return;    //如果不是日期什么都不做
136              //恢复之前选中日期的样式
137              if (curSelEl) { curSelEl.className = curSelEl.getAttribute("_oldCls") }
138              curSelEl = el;    //保存当前处理的元素
139              //更新选中日期的样式
140              el.className = "selectDay";
141              var dt = new Date($("year").value, $("month").value - 1, day);
142              //更新信息
143              $("day").value = day;    //日期
144   
145              $("weekday").value = ["日""一""二""三""四""五""六"][dt.getDay()];    //星期几
146              $("week").value = calWeek(dt);    //第几周
147   
148          }
149          //键盘事件监听
150          var listenKey = function (e) {
151              var keyCode = (e || event).keyCode;
152              var p = curSelEl.parentNode.cells;
153              var cellIndex;
154              if (keyCode == "37") {  //left
155                  cellIndex = curSelEl.cellIndex != 0 ? curSelEl.cellIndex : p.length;
156                  doClickEvent(p[cellIndex - 1])
157              }
158              if (keyCode == "39") {  //right
159                  cellIndex = curSelEl.cellIndex != (p.length - 1) ? curSelEl.cellIndex : -1;
160                  doClickEvent(p[cellIndex + 1])
161              }
162          }
163          //初始化
164          if (window.attachEvent) {
165              window.attachEvent("onload", docInit);
166          else {
167              window.addEventListener("load", docInit, false);
168          }
169          function docInit() {
170              var curDate = new Date(), curYear = curDate.getFullYear();
171              //显示上下十年
172              for (var i = -10; i < 10; i++) { $("year").add(new Option(curYear + i, curYear + i)) }
173              $("year").selectedIndex = 10;    //默认选中当前年份
174              $("month").selectedIndex = curDate.getMonth();    //当前月份
175              $("day").value = curDate.getDate();    //当前日期
176   
177              $("weekday").value = ["日""一""二""三""四""五""六"][curDate.getDay()];    //当前星期几
178              $("week").value = calWeek();    //当前第几周
179              //改变日期或年份更新日期列表
180              $("year").onchange = $("month").onchange = function () { displayDayList($("year").value, $("month").value, "daysList") };
181              //显示当月日期列表,并高亮当天的日期
182              displayDayList(curDate.getFullYear(), curDate.getMonth() + 1, "daysList");
183          }
184   
185          //对外设定样式的接口。
186          //格式:([2007,10,12],"color:#f00") ([[2007,10,20],[2007,11,25]],"color:#00f")
187          //如果月份小于10不要带0
188          var setDateStyle = function (dateArr, style) {
189              if (typeof dateArr != "object"return;
190              if (dateArr instanceof Array) {
191                  if (dateArr[0] instanceof Array) {
192                      for (var i = 0; i < dateArr.length; i++) setDateStyle(dateArr[i], style);
193                  }
194                  var dataStr = dateArr.join("|");
195                  styleData.push(dataStr);
196                  dataStyle[dataStr] = style;
197                  return;
198              }
199          }
200          //对外接口
201          return { setDateStyle: setDateStyle }
202      })();
203      //测试样式设定
204      logDateControl.setDateStyle([[2007, 12, 15], [2007, 11, 12]], "test");
205  </script>
206  </head>
207   
208  <body>
209   <table cellpadding="3" cellspacing="0" id="logCalendar">
210     <tr>
211         <td>第<input type="text" name="week" class="bd" id="week" readonly size="2">周</td>
212         <td>星期<input type="text" name="weekday" class="bd" id="weekday" readonly size="2"></td>
213         <td rowspan="2" style="padding:0">
214             <table width="100%" cellpadding="3" height="100%" cellspacing="0"id="daysList">
215                 <tr>
216                     <td></td><td></td><td></td><td></td><td></td>
217                     <td></td><td></td><td></td><td></td><td></td>
218                     <td></td><td></td><td></td><td></td><td></td>
219                     <td></td><td></td><td></td><td></td><td></td>
220                     <td></td><td></td><td></td><td></td><td></td>
221                     <td></td><td></td><td></td><td></td><td></td><td></td>
222                 </tr>
223                 <tr>
224                     <td></td><td></td><td></td><td></td><td></td>
225                     <td></td><td></td><td></td><td></td><td></td>
226                     <td></td><td></td><td></td><td></td><td></td>
227                     <td></td><td></td><td></td><td></td><td></td>
228                     <td></td><td></td><td></td><td></td><td></td>
229                     <td></td><td></td><td></td><td></td><td></td><td></td>
230                 </tr>
231             </table>
232         </td>
233     </tr>
234     <tr>
235         <td><select name="year" id="year"></select>年 <select name="month" id="month">
236     <option value="1">1</option>
237     <option value="2">2</option>
238     <option value="3">3</option>
239     <option value="4">4</option>
240     <option value="5">5</option>
241     <option value="6">6</option>
242     <option value="7">7</option>
243     <option value="8">8</option>
244     <option value="9">9</option>
245     <option value="10">10</option>
246     <option value="11">11</option>
247     <option value="12">12</option>
248   </select>月</td>
249         <td>日期<input type="text" name="day" size="2" class="bd" id="day" id="day"></td>
250     </tr>
251   </table>
252  </body>
253 </html>
254  注:
255 在IE 6.0 中会出现有些td没有边框的情况,在其中敲上一个空格符,就可以了

2. [图片] QQ截图20130530162225.png    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值