简单的Javascript日历

资讯频道的美国大选专题需要一个像CNN大选专题那样的选举日历功能。看了CNN的实现方式,觉得它的代码有点复杂,于是就自己写了一个简单通用的Javascript日历。主要思路是:
1.每一个表示日期的TD标签分配一个日期字符串的id,该字符串记录了TD标签所表示的日期;
2.当点击表示日期的TD标签后,在this.cache.selectedDates中保存该日期,并执行callback函数对日期进行处理;
3.每一个日历实例由this._MODULE_ID_唯一标识。
对应的主要函数分别是renderselectDatesetMoudleId

  1. //根据年份和日期呈现日历
  2. render:function(year,month){
  3.     this.preRender(year,month);
  4.     var date = new Date(year,month,1),dateString = '';
  5.     var dayCount = this.dayArray[month];
  6.     var preDayCount = date.getDay(),preDayCounter = preDayCount;
  7.     var afterDayCounter = (this.dayArray[month]+preDayCount)%7 == 0 ?
  8.             0 :
  9.             7-((this.dayArray[month]+preDayCount)%7);
  10.     var html = this.renderHeader()+'<div id="'
  11.              +this.properties.contentClass+this._MODULE_ID_+'" class="'
  12.              +this.properties.contentClass+'"><table>';
  13.     html += this.renderWeekdays();
  14.     html += '<tr>';
  15.    
  16.     //先补齐本月日期开始前的TD数
  17.     while(preDayCounter-- > 0) html += '<td>&nbsp;</td>';
  18.    
  19.     for(var i = 1; i <= dayCount; i++ ){
  20.         date = new Date(year,month,i);
  21.         dateString = this.dateToString(date);
  22.         //保存当前月的日期
  23.         this.cache.currentDateStrings.push(dateString);
  24.        
  25.         if(this.isSelectedDay(date) && this.isToday(date))
  26.             html += '<td class="'
  27.                  +this.properties.isDoubleDayClass+'" id="'
  28.                  +dateString+this._MODULE_ID_+'">'+i+'</td>';
  29.         else if(this.isSelectedDay(date))
  30.             html += '<td class="'
  31.                  +this.properties.isSelectedClass+'" id="'
  32.                  +dateString+this._MODULE_ID_+'">'+i+'</td>';
  33.         else if(this.isToday(date))
  34.             html += '<td class="'
  35.                  +this.properties.isTodayClass+'" id="'
  36.                  +dateString+this._MODULE_ID_+'">'+i+'</td>';
  37.         else 
  38.             html += '<td class="'
  39.                  +this.properties.isDateClass+'" id="'
  40.                  +dateString+this._MODULE_ID_+'">'+i+'</td>';
  41.         //如果满7个TD则换行
  42.         if((i+preDayCount) % 7 == 0) html += '</tr><tr>';
  43.     }
  44.    
  45.     //补齐本月日期结束后的TD数
  46.     while(afterDayCounter-- > 0) html += '<td>&nbsp;</td>';
  47.    
  48.     html += '</tr>';
  49.     html += '</table></div>';
  50.  
  51.     $(this.properties.holder).innerHTML = html;
  52.     this.attachEvent();
  53. }
  54. //根据TD和它的id选取日期
  55. //首先设置该TD的className改变其外观,然后在this.cache.selectedDates中增加该日期.
  56. selectDate:function(element,elementId){
  57.     if(this.properties.isMultipleSelect){
  58.         if(this.cache.selectedDates[elementId] == undefined){
  59.             element.className = this.properties.isSelectedClass;
  60.             this.cache.selectedDates[elementId] = true;
  61.         }
  62.         else 
  63.             this.deleteSelect(element,elementId);
  64.     }
  65.     else {
  66.         for(var i in this.cache.selectedDates)
  67.             this.deleteSelect($(i+this._MODULE_ID_),i);
  68.         element.className = this.properties.isSelectedClass;
  69.         this.cache.selectedDates[elementId] = true;
  70.     }
  71.     if(this.properties.callback!=null 
  72.        && this.isFunction(this.properties.callback)){
  73.         this.properties.callback(this);
  74.     }
  75. },
  76. //设置实例的唯一标识this._MODULE_ID_
  77. setMoudleId:function(){
  78.     var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
  79.     for(var i = 0 ; i < 32; i++)
  80.         this._MODULE_ID_ += chars.charAt(Math.floor(Math.random()*62));
  81. }

如果要基于这个例子来修改的话
1.如果想只改改日历的外观,修改相关的css部分即可;
2.如果想应用日历输出数据,还得写一个callback函数处理选取后的数据;
2.如果想增加功能,可以分别在this.cache和this.properties里面增加你想要的数据和参数,在calendar.prototype中修改或者增加相关的函数。

在线浏览地址(第二个样式和PageFlakes日历控件外观差不多,并附有一个简单的callback函数):http://panweizeng.com/others/example/calendar-simple/
完整的Javascript代码:http://panweizeng.com/others/example/calendar-simple/calendar-common.js

[ 分类: 学习 Learning ] 由 Pan 发表于 January 27, 2008 5:28 pm  固定链接 

简单的Javascript日历》 这篇文章一共有0 条评论   我也想说两句

还没有人对这篇文章发表评论,赶紧留一个吧。

RSS feed for comments on this post. TrackBack URI

相关文章:

发表评论