네 이 티 브 JS 달력 구성 요소 의 예제 코드 구현

이 루 고 싶 은 효과.
  • 클릭 날짜 선택 상자 에 달력
  • 이 나타 납 니 다.
  • 년,월,일의 선택 과 오늘
  • 을 포함 한 날짜 컨트롤 러 가 날 짜 를 선택 하 는 데 도움 을 줍 니 다.
  • 달력 칸 은 날짜 선택 상 자 를 처음 클릭 할 때 현재 날 짜 를 표시 합 니 다.달력 칸 의 날 짜 는 이 달의 모든 일 수 를 포함해 야 합 니 다.또한 그 달의 1 일이 일요일 이 아니라면 일요일 부터 1 일 까지 의 일 수 를 보충 해 야 합 니 다.이번 달 마지막 1 일 뒤에 토요일 까지 보충 해 야 합 니 다.
  • 날짜 컨트롤 러 와 달력 칸 의 날짜,그리고 선택 상자 의 날짜 변화 가 동기 화 된다 면.
  • 사고의 방향 을 실현 하 다.
    구성 요소 의 재 활용 성 을 위해 서 는 대상 을 대상 으로 하 는 사상 이 필요 하 다.
    모든 달력 구성 요 소 는 하나의 달력 대상 입 니 다.주로 날짜 선택 상자,날짜 제어 표시 줄,그리고 달력 칸 을 포함 합 니 다.날짜 제어 표시 줄 과 달력 칸 의 날짜 가 동기 화 되 는 변 화 를 유지 하기 위해 날짜 제어 표시 줄 과 달력 의 모든 칸 에는 Date 속성 이 포함 되 어야 합 니 다.달력 의 칸 을 클릭 하여 칸 에 저 장 된 Date 속성 을 함수 매개 변수 로 합 니 다.함수 가 날짜 제어 표시 줄 을 바 꾸 는 시간 을 호출 합 니 다.마찬가지 로 날짜 제어 표시 줄 의 시간 이 변 할 때 도 Date 속성 을 매개 변수 호출 함수 로 하고 함수 가 달력 칸 을 다시 그립 니 다.
    코드:
    
    function Calendar(parentId) {
      this.parentElement = document.getElementById(parentId);
      this.init();
    }
    Calendar.prototype = {
      init: function() {
        this.contains = document.createElement("div");
        this.contains.onselectstart = function(){return false};  //                   
        this.dateInput = document.createElement("input");
        this.datePicker = document.createElement("div");
        this.showDateBar = document.createElement("div");
        this.dateBox = document.createElement("div");
        this.icon = document.createElement("i");
        this.contains.className = 'datepicker-container';
        this.dateInput.className = 'date-input';
        this.dateInput.readOnly = true;
        var parent = this;
        this.dateInput.onclick = function(event){
          parent.onDateInputClick(event);      //                      
        };
        this.contains.onblur = function(){
          parent.datePicker.style.display = 'none';
        }
        this.datePicker.className = 'date-picker';
        this.datePicker.style.display = 'none';
        this.showDateBar.className = 'show-date';
        this.dateBox.className = 'date-box';
        this.icon.className = 'date-icon';
        this.icon.innerHTML = '\'; //iconfont        ,      
        this.datePicker.appendChild(this.showDateBar);
        this.datePicker.appendChild(this.dateBox);
        this.contains.appendChild(this.dateInput);
        this.contains.appendChild(this.icon);
        this.contains.appendChild(this.datePicker);
        this.parentElement.appendChild(this.contains); 
      },
    }
    
    날짜 제어 막대 초기 화:
    
    drawShowDateBar: function(parentElement){
        var parent = this;
        var nowDate = new Date();
        parentElement.date = nowDate;
        var nowYear = nowDate.getFullYear();
        var nowMonth = nowDate.getMonth();
        var nowDay = nowDate.getDate();
        //showDateBar    
        var contentStr ='<div class="year-input"><span>'+nowYear+' </span><i class="select-year-btn">Z</i><ul class="year-select-box" style="display : none">';
        for(var i=0;i<150;i++){
          contentStr+='<li>'+(i+1900)+' </li>';
        }
        contentStr+='</ul></div>'
              +'<div class="month-input"><i class="prev-month">[</i><select class="months-options">'
        for(var i=0;i<12;i++){
          contentStr+='<option>'+(i+1)+' </option>';
        }
        contentStr+='</select><i class="next-month">\</i></div>'
              +'<div class="day-input"><i class="prev-day">[</i><select class="days-options"></select>'
              +'<i class="next-day">\</i></div>'
              +'<button class="today-btn">  </button>'
              +'<div class="days-title">';
        var weekday = [' ', ' ', ' ', ' ', ' ', ' ', ' '];
        for (var i = 0; i < 7; i++) {
          contentStr+='<span class="day-title">'+weekday[i]+'</span>';
        }
        contentStr+='</div>';
        parentElement.innerHTML = contentStr;
        this.changeShowDateBar(nowDate);  //   showTimeBar  ,   ,           
        var yearInput = parentElement.firstChild;
        //               
        yearInput.onclick = function(){   //target this    target        ,this         
          var ul = this.lastChild;
          ul.style.display==='none'||ul.style.display==='none'? ul.style.display='inline-block':ul.style.display='none';
        };
        //             
        var yearSelectBox = yearInput.lastChild;
        var yearLi = yearSelectBox.children;
        for(var i=0;i<yearLi.length;i++){
          yearLi[i].onclick = function(){
            parent.showDateBar.date.setFullYear(this.innerText.slice(0,-1));
            parent.changeShowDateBar(parent.showDateBar.date);  //            ,     ,   ,          
          };
        }
        // month           
        var monthInput = yearInput.nextSibling;
        monthInput.firstChild.onclick = function(){
          var monthOptions = this.nextSibling;
            if(monthOptions.selectedIndex>0){
              parent.showDateBar.date.setMonth(--monthOptions.selectedIndex);
            }else{
              monthOptions.selectedIndex = 11;
              parent.showDateBar.date.setFullYear(parent.showDateBar.date.getFullYear()-1);
              parent.showDateBar.date.setMonth(11);
            }
          parent.changeShowDateBar(parent.showDateBar.date);
        };
        monthInput.lastChild.onclick = function(){
          var monthOptions = this.previousSibling;
          if(monthOptions.selectedIndex<11){
            parent.showDateBar.date.setMonth(++monthOptions.selectedIndex);
          }else{
            monthOptions.selectedIndex = 0;
            parent.showDateBar.date.setFullYear(parent.showDateBar.date.getFullYear()+1);
            parent.showDateBar.date.setMonth(0);
          }
          parent.changeShowDateBar(parent.showDateBar.date);
          
        }
        monthInput.children[1].onchange = function(){
          parent.showDateBar.date.setMonth(this.selectedIndex);
          parent.changeShowDateBar(parent.showDateBar.date)
        };
    
        // day           
        var dayInput = monthInput.nextSibling;
        dayInput.firstChild.onclick = function(){
          var dayOptions = this.nextSibling;
          if(dayOptions.selectedIndex>0){
            parent.showDateBar.date.setDate(dayOptions.selectedIndex--);
          }else{
            parent.showDateBar.date.setMonth(parent.showDateBar.date.getMonth()-1);
            parent.showDateBar.date.setDate(parent.getDaysOfMonth(parent.showDateBar.date));
          }
          parent.changeShowDateBar(parent.showDateBar.date);
        };
        dayInput.lastChild.onclick = function(){
          var dayOptions = this.previousSibling;
          if(dayOptions.selectedIndex < dayOptions.length-1){
            dayOptions.selectedIndex++;
            parent.showDateBar.date.setDate(dayOptions.selectedIndex+1);  
          }else{
            parent.showDateBar.date.setDate(1);
            parent.showDateBar.date.setMonth(parent.showDateBar.date.getMonth()+1); 
          }
          parent.changeShowDateBar(parent.showDateBar.date);
        };
        dayInput.children[1].onchange = function(){
          parent.showDateBar.date.setDate(this.selectedIndex+1);
          parent.changeShowDateBar(parent.showDateBar.date)
        };
        //           
        var todayBtn = dayInput.nextSibling;
        todayBtn.onclick = function(){
          parent.drawPicker(new Date());
          parent.changeShowDateBar(new Date());
        }  
      },
    
    
    drawShowDateBar 함 수 는 날짜 제어 표시 줄 의 연도,달,하늘의 클릭 단추 로 이벤트 처리 함 수 를 설정 합 니 다.드 롭 다운 상자 변 화 를 선택 하 는 처리 함수 도 있 습 니 다.
    날짜 제어 막대 가 초기 화 되 거나 쇼 데이트 바 의 데이트 를 변경 할 때 changeshow 데이트 바 함 수 를 호출 합 니 다.이 함 수 는 들 어 오 는 날짜 에 따라 날짜 제어 판'일'드 롭 다운 바 의 일 수 를 변경 합 니 다.매달 일수 가 다 르 기 때문에 들 어 오 는 날짜 에 따라 변경 해 야 합 니 다.들 어 오 는 날짜 에 대응 하 는 달 이 얼마나 되 는 지 계산 하고 getDaysOfMonth 함수 로 계산 합 니 다.
    
    //        
      getDaysOfMonth: function(primalDate) {
        var date = new Date(primalDate); //       ,     date
        var month = date.getMonth();
        var time = date.getTime();    //       month+1,         
        var newTime = date.setMonth(month + 1);
        return Math.ceil((newTime - time) / (24 * 60 * 60 * 1000));
      },
    
    
    changeShowDateBar : function(date){
        var yearInput = this.showDateBar.firstChild;
        var monthInput = yearInput.nextSibling;
        var dayInput = monthInput.nextSibling;
        yearInput.firstChild.innerText = date.getFullYear()+' ';
        var monthsOptions = monthInput.firstChild.nextSibling;
        monthsOptions.selectedIndex = date.getMonth();
        var daysOptions = dayInput.firstChild.nextSibling;
        var days = this.getDaysOfMonth(date);
        var dayStr = '';
        for(var i=1;i<=days;i++){
          dayStr+='<option>'+i+' </option>';
        }
        daysOptions.innerHTML = dayStr;
      // console.log(date.toLocaleDateString()+'changeShowDateBar');
        daysOptions.selectedIndex = date.getDate()-1;
        this.drawPicker(date);
      },
    
    날짜 제어 판 의 Date 가 바 뀌 면 달력 칸 의 날짜 도 바 뀌 어야 합 니 다.표시 되 는 날 짜 는 날짜 제어 판 과 일치 해 야 합 니 다.그래서 changeshow DateBar 함수 끝 에 drawPicker 함 수 를 호출 하여 달력 칸 을 다시 그립 니 다.
    달력 칸 을 그립 니 다.
    drawPicker 함 수 는 들 어 오 는 날짜 에 따라 달력 칸 을 그립 니 다.
  • 먼저 들 어 오 는 날 짜 를 계산 합 니 다.월 의 일 수 는
  • 입 니 다.
  • 은 이번 달 1 일이 무슨 요일 인지 계산한다.Date 대상 의 date.setDate(1)/를 이용 하여 일 을 1 호 로 설정 합 니 다.date.getDay()//이날 을 얻 은 것 은 주 몇
  • 입 니까?
  • 1 일이 일요일 이 아니라면 일요일 부터 1 일 까지 의 일 수 를 보충 합 니 다.oldDate.setDate(-1)//날 짜 를 원래 날짜 의 지난달 마지막 날로 설정 할 수 있 습 니 다.setDate 는 현재 날 짜 를 바 꿀 수 있 습 니 다.새로운 날 짜 를 되 돌려 주 는 것 이 아 닙 니 다.
  • 1 일부 터 이 달 마지막 날 까지 순환 합 니 다.
  • 보전 마지막 날 부터 토요일 까지 의 일수
  • drawPicker 함수:
    
    drawPicker: function(primalDate) {
        var date = new Date(primalDate); //       ,     date
        var nowMonth = date.getMonth()+1;
        var nowDate = date.getDate();
        var spanContainer = [];
        var dateBox = this.dateBox;
        dateBox.innerHTML = '';
        var time = date.getTime();
        var days = this.getDaysOfMonth(date); //         
        date.setDate(1);            // date      1 
        var firstDay = date.getDay();     //     1     
        for (var i = 0; i < firstDay; i++) {  //  1     (     ),  1      
          var tempDate = new Date(date);
          tempDate.setDate(i - firstDay + 1);
          var span = document.createElement("span");
          span.className = "unshow";
          spanContainer.push({span : span, date : tempDate});
        }
        for (var i = 1; i <= days; i++) {    //1       1 
          var span = document.createElement("span");
          span.className = 'show';
          spanContainer.push({span : span, date : new Date(date)});
          date.setDate(i + 1);
        }
        for (var i = date.getDay(); i <= 6; i++) { //            
          var span = document.createElement("span");
          span.className = "unshow";
          spanContainer.push({span : span, date : new Date(date)});
          date.setDate(date.getDate()+1);
        }
        for(var i=0;i<spanContainer.length;i++){
          var spanBox = spanContainer[i];
          var span = spanBox.span;
          span.year = spanBox.date.getFullYear(); //   span           
          span.month = spanBox.date.getMonth() + 1;
          span.date = spanBox.date.getDate();
          span.innerText = spanBox.date.getDate();
          if(span.date === nowDate&&span.month === nowMonth) //    span            ,     select
            span.className+=" select";
          var parent = this;
          span.onclick = function(){  //      
            var target = event.target;
            var selected = target.parentElement.getElementsByClassName("select");
            for(var i=0 ;i<selected.length;i++){
              selected[i].className = selected[i].className.replace(" select","");
            };
            target.className+=" select";
            parent.changeDate(target.year, target.month, target.date); 
            parent.changeShowDateBar(new Date(target.year, target.month-1, target.date));  
          };
          dateBox.appendChild(span); // span   dateBox 
        }
        this.changeDate(primalDate.getFullYear(), primalDate.getMonth()+1, primalDate.getDate())
        return;
      },
    
    
    //          
      onDateInputClick: function(event) { 
        var target = event.target;
        var value = target.value;
        var datePicker = this.datePicker;
        if(datePicker.style.display==='none'){  //      js    datePicker.style.display   none,    css      none,   display ""
          datePicker.style.display = 'block';
        }else{
          datePicker.style.display = 'none';
          return; 
        }
        if (!value) this.drawShowDateBar(this.showDateBar); //         
      },
      changeDate : function(year, month, date){
        this.dateInput.value = year+"-"+(month<10?("0"+month):month)+"-"+(date<10?("0"+date):date);
      },
    실현 효과

    좀 못 생 겼 는데..
    실현 과정 에서 만난 문제.
  • 달력 칸 그리 기 문제 입 니 다.1 일 전부터 일요일 까지 의 일 수 를 보충 하고,그 달 마지막 1 일부 터 토요일 까지 의 일 수 를 보충 해 야 한다.달력 칸 을 그 리 는 것 은 3 부분 으로 나 눌 수 있 습 니 다.그 달 앞,그 달 뒤에 있 습 니 다.1 일이 무슨 요일 인지 계산 해서 이번 주 일요일 부터 1 일 까지 의 일 수 를 그 려 야 한다.
  • 그 달의 달력 은 1 일부 터 마지막 1 일 까지 반복 적 으로 그립 니 다.마지막 1 일부 터 토요일 까지 의 일 수 를 보충 합 니 다(date.getDay()<=6)
  • 달력 칸 과 날짜 컨트롤 러 가 동기 화 되 었 습 니 다.그 릴 때 달력 칸 마다 대표 하 는 Date 를 저장 합 니 다.칸 셀 을 클릭 할 때 changeshow DateBar 함 수 를 호출 하여 셀 에 저 장 된 Date 를 입력 하고 날짜 제어 판 에 표 시 된 날 짜 를 변경 한 다음 달력 칸 을 다시 그립 니 다.
  • 매달 일수 가 다 르 기 때문에 발생 하 는'일'선택 상자 의 일수 가 다른 문제 입 니 다.changeshow DateBar 함수 에 서 는 들 어 오 는 Date 에 따라 그 달 이 며칠 인지 계산 한 다음'일'선택 상자 에 있 는 일 수 를 동적 으로 생 성 합 니 다.
  • 월 별,해 별 처리.날짜 컨트롤 바 에 서 는 달 과 일의 상하 버튼 이 있 습 니 다.달 과 해 를 넘 기 는 것 을 처리 할 때 이 달(일)이 마지막 달(일)인지 여 부 를 판단 합 니 다.이 경우 날짜 컨트롤 바 의 Date 의 년(월)에 1 을 추가 하고 표시 되 는 달(일)을 1 월(일)로 설정 하여 changeshow DateBar 함 수 를 호출 합 니 다.같은 이치 로 1 월(일)여 부 를 판단 하 다.
  • 사용 한 Date API
  • date.getFullYear()//date 를 받 은 연도
  • date.getMonth()/월 0-11
  • date.getDate()/받 은 날짜 1-31 의 숫자
  • date.getDay()//이날 을 얻 은 것 은 주 몇 0-6
  • 이다.
  • date.getTime()//date 를 받 은 시간 스탬프 ms 는
  • 을 표시 합 니 다.
  • date.setFullYear(2017); // 설치 연도
  • date.setMonth(x)/0-11 로 설정 하면 date 는 x 년 의 1-12 월 이 고 11 보다 크 면 앞으로 밀어 x+([n+1)/12]년 의 제(n+1)%12 개 월
  • 으로 뛴다.
  • 이 마이너스 라면 예 를 들 어-1 은 전년 도 마지막 달 로 바 뀔 것 이다.
  • date.setDate(x)//setMonth 와 같은 이치 로 해당 달의 일수 에 따라 달의 변동 여 부 를 자동 으로 판단 합 니 다.-1 대표 데이트 지난달 마지막 날
  • date.setTime()/시간 스탬프 에 따라 날짜
  • 을 설정 합 니 다.
    프로젝트 원본 https://github.com/wenkeShi/js-calendar
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기