>  기사  >  웹 프론트엔드  >  js Calender 캘린더 컨트롤을 함께 작성하는 방법 배우기

js Calender 캘린더 컨트롤을 함께 작성하는 방법 배우기

高洛峰
高洛峰원래의
2017-01-04 13:46:18959검색

최근에 js date 관련 함수를 보다가 갑자기 달력 컨트롤이 생각나서 한번 작성해 봤습니다. 백그라운드 프로그래머로서 제 수준이 부족해서 학습으로 작성한 이 예제를 살펴보시기 바랍니다. 태도, 함께 배우고 발전하세요!

먼저 일반적으로 사용되는 날짜 함수:

날짜(년,월,일)

var date=new Date();

연도 가져오기

var year=this.date.getFullYear();

월을 가져옵니다. 여기에 월 인덱스가 있으므로 +1

var Month =this.date.getMonth()+1;

요일 가져오기

var day=this.date.getDate();

가져오기 요일, 반환 0. 일요일 1. 월요일 2. 화요일 3. 수요일 4. 목요일 5. 금요일 6. 토요일

var week=this.date.getDay();

매월 1일이 있는 요일 구하기

var   getWeekDay=function(year,month,day){
     var date=new Date(year,month,day);
     return date.getDay();
     }
 
  var  weekstart= getWeekDay(this.year, this.month-1, 1)

그 달의 일수 구하기

var getMonthDays=function(year,month){
      var date=new Date(year,month,0);
      return date.getDate();
    }
var  monthdays= this.getMonthDays(this.year,this.month);

그렇군요. 우리가 사용하는 매개변수이며, 다음은 실제로 날짜 대응에 관한 것입니다. 요일에 대한 일부 연산과 판단, 동적 접합 태그, 제가 작성한 예시는 아래에 직접 게시합니다:

렌더링:

一起学写js Calender日历控件

<html>  
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<head>
  <style type="text/css">
 
td{ text-align: center;}
  </style>
  <script type="text/javascript">
    
window.onload=function(){
  var  Calender=function(){
    this.Init.apply(this,arguments);
  }
  Calender.prototype={
    Init:function(container,options){
      this.date=new Date();
      this.year=this.date.getFullYear();
      this.month=this.date.getMonth()+1;
      this.day=this.date.getDate();
      this.week=this.date.getDay();
      this.weekstart=this.getWeekDay(this.year, this.month-1, 1);
      this.monthdays= this.getMonthDays(this.year,this.month);
      this.containerDiv=document.getElementById(container);
      this.options=options!=null?options:{
        border:&#39;1px solid green&#39;,
        width:&#39;400px&#39;,
        height:&#39;200px&#39;,
        backgroundColor:&#39;lightgrey&#39;,
        fontColor:&#39;blue&#39;
      }
    },
    getMonthDays:function(year,month){
      var date=new Date(year,month,0);
      return date.getDate();
    },
    getWeekDay:function(year,month,day){
      var date=new Date(year,month,day);
      return date.getDay();
    },
    View:function(){
      var tablestr=&#39;<table>&#39;;
       tablestr+=&#39;<tr><td colspan="3"></td><td>年:&#39;+this.year+&#39;</td><td colspan="3">月:&#39;+this.month+&#39;</td></tr>&#39;;
      tablestr+=&#39;<tr><td width="14%">日</td><td width="14%">一</td><td width="14%">二</td><td width="14%">三</td><td width="14%">四</td><td width="14%">五</td><td width="14%">六</td></tr>&#39;;
      var index=1;
      //判断每月的第一天在哪个位置
      var style=&#39;&#39;;
      if(this.weekstart<7)
      {
        tablestr+=&#39;<tr>&#39;;
         for (var i = 0; i <this.weekstart; i++) {
           tablestr+=&#39;<td></td>&#39;;
         };
         for (var i = 0; i < 7-this.weekstart; i++) {
          style=this.day==(i+1)?"background-Color:green;":"";
           index++;
           tablestr+=&#39;<td style="&#39;+style+&#39;" val=&#39;+(this.year+&#39;-&#39;+this.month+&#39;-&#39;+(i+1))+&#39;>&#39;+(i+1)+&#39;</td>&#39;;
         };
        tablestr+=&#39;</tr>&#39;;
 
      }
      ///剩余天数对应的位置
 
      //判断整数行并且对应相应的位置
      var remaindays=this.monthdays-(7-this.weekstart);
      var row=Math.floor(remaindays%7==0?remaindays/7:((remaindays/7)+1)) ;
      var  count=Math.floor(remaindays/7);
      for (var i = 0; i < count; i++) {
         tablestr+=&#39;<tr>&#39;;
         for (var k = 0; k < 7; k++) {
           style=this.day==(index+k)?"background-Color:green;":"";
           tablestr+=&#39;<td style="&#39;+style+&#39;" val=&#39;+(this.year+&#39;-&#39;+this.month+&#39;-&#39;+(index+k))+&#39;>&#39;;
           tablestr+=index+k;
           tablestr+=&#39;</td>&#39;;
         };
         tablestr+=&#39;</tr>&#39;;
         index+=7;
      };
 
      //最后剩余的天数对应的位置(不能填充一周的那几天)
      var remaincols=this.monthdays-(index-1);
      tablestr+=&#39;<tr>&#39;;
      for (var i = 0; i < remaincols; i++) {
        style=this.day==index?"background-Color:green;":"";
        tablestr+=&#39;<td style="&#39;+style+&#39;" val=&#39;+(this.year+&#39;-&#39;+this.month+&#39;-&#39;+(index))+&#39;>&#39;;
        tablestr+=index;
        tablestr+=&#39;</td>&#39;;
        index++;
      };
      tablestr+=&#39;</tr>&#39;;
      tablestr+=&#39;</table>&#39;;
      return tablestr;
    },
    Render:function(){
      var calenderDiv=document.createElement(&#39;div&#39;);
      calenderDiv.style.border=this.options.border;
      calenderDiv.style.width=this.options.width;
      calenderDiv.style.height=this.options.height;
      calenderDiv.style.cursor=&#39;pointer&#39;;
      calenderDiv.style.backgroundColor=this.options.backgroundColor;
      // calenderDiv.style.color=this.options.fontColor;
      calenderDiv.style.color=&#39;red&#39; ;
 
      calenderDiv.onclick=function(e){
        var evt=e||window.event;
        var  target=evt.srcElement||evt.target;
 
        if(target&&target.getAttribute(&#39;val&#39;))
        {
 
          alert(target.getAttribute(&#39;val&#39;));
        }
       
      }
      var tablestr=this.View();
      this.tablestr=tablestr;
      calenderDiv.innerHTML=tablestr;
      var div=document.createElement(&#39;div&#39;);
      div.style.width=&#39;auto&#39;;
      div.style.height=&#39;auto&#39;;
       div.appendChild(calenderDiv);
 
       ///翻页div
      var pagerDiv=document.createElement(&#39;div&#39;);
      pagerDiv.style.width=&#39;auto&#39;;
      pagerDiv.style.height=&#39;auto&#39;;
 
        var that=this;
 
 
        ///重新设置参数
      var  resetPara=function(year,month,day){
          that.date=new Date(year,month,day);
          that.year=that.date.getFullYear();
          that.month=that.date.getMonth()+1;
          that.day=that.date.getDate();
          that.week=that.date.getDay();
          that.weekstart=that.getWeekDay(that.year, that.month-1, 1);
          that.monthdays= that.getMonthDays(that.year,that.month);
      }
 
      //上一页
      var preBtn=document.createElement(&#39;input&#39;);
       preBtn.type=&#39;button&#39;;
       preBtn.value=&#39;<&#39;;
 
       preBtn.onclick=function(){
           that.containerDiv.removeChild(div);
           resetPara(that.year,that.month-2,that.day);
           that.Render();
 
       }
       //下一页
       var nextBtn=document.createElement(&#39;input&#39;);
       nextBtn.type=&#39;button&#39;;
       nextBtn.value=&#39;>&#39;;
      
       nextBtn.onclick=function(){
           that.containerDiv.removeChild(div);
           resetPara(that.year,that.month,that.day);
           that.Render();
 
       }
 
       pagerDiv.appendChild(preBtn);
       pagerDiv.appendChild(nextBtn);
       div.appendChild(pagerDiv);
 
       var dropDiv=document.createElement(&#39;div&#39;);
       var  dropdivstr=&#39;&#39;;
       //选择年份
       dropdivstr+=&#39;<select id="ddlYear">&#39;;
       for (var i = 1900; i <= 2100; i++) {
        dropdivstr+= 
        i==that.year
        ?&#39;<option value="&#39;+i+&#39;" selected="true">&#39;+i+&#39;</option>&#39;
        : &#39;<option value="&#39;+i+&#39;">&#39;+i+&#39;</option>&#39;;
       };
       dropdivstr+=&#39;</select>&#39;;
       
      //选择月份
      dropdivstr+=&#39;<select id="ddlMonth">&#39;;
       for (var i = 1; i <= 12; i++) {
        dropdivstr+=
        i==that.month
        ?&#39;<option value="&#39;+i+&#39;" selected="true">&#39;+i+&#39;</option>&#39;
        : &#39;<option value="&#39;+i+&#39;">&#39;+i+&#39;</option>&#39;;
       };
       dropdivstr+=&#39;</select>&#39;;
       dropDiv.innerHTML=dropdivstr;
       div.appendChild(dropDiv);
      that.containerDiv.appendChild(div);
   
 
       ///绑定选择年份和月份的事件
       var ddlChange=function(){
           var ddlYear=document.getElementById(&#39;ddlYear&#39;);
          var ddlMonth=document.getElementById(&#39;ddlMonth&#39;);
          var  yearIndex=ddlYear.selectedIndex;
          var year=ddlYear.options[yearIndex].value;
          var  monthIndex=ddlMonth.selectedIndex;
          var month=ddlMonth.options[monthIndex].value;
          that.containerDiv.removeChild(div);
          resetPara(year,month-1,that.day);
          that.Render();
       }
 
      ddlYear.onchange=function(){
         ddlChange();
      }
 
       ddlMonth.onchange=function(){
         ddlChange();
         
      }
    }
 
  }
 
 
  var  calender=new Calender(&#39;dvTest&#39;,{
        border:&#39;1px solid green&#39;,
        width:&#39;400px&#39;,
        height:&#39;200px&#39;,
        backgroundColor:&#39;&#39;
        }
        );
  calender.Render();
  
}
  </script>
  
  
</head>
<body>
 <div id="dvTest"></div>
</body>
</html>

IE tableinnerHTML의 읽기 전용 문제를 해결하기 위해 뷰의 테이블을 div로 대체하여 코드를 다시 수정했습니다. 또한 구성 가능성을 위한 옵션이 추가되었습니다.
위의 코드는 가장 기본적인 기능에 대한 설명입니다. 좀 더 심도 깊게 살펴보면 이 글이 여러분에게 영감을 줄 수 있기를 바랍니다.

js Calender 캘린더 컨트롤을 함께 작성하는 방법에 대한 더 많은 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.