JS 학습 의 간단 한 달력 컨트롤

7471 단어 JS달력 컨트롤
이 달력 컨트롤 은 정원 용 달력 과 유사 합 니 다.다음 그림 입 니 다.
js 简易的日历控件   
 이러한 달력 컨트롤 은 실현 하기 어렵 지 않 습 니 다.다음은 제 생각 을 간단하게 분석 하 겠 습 니 다.
 우선,이 컨트롤 의 설정 가능 한 항목 입 니 다.
 
...
settings:
{
firstDayOfWeek: 1,
baseClass: "calendar",
curDayClass: "curDay",
prevMonthCellClass: "prevMonth",
nextMonthCellClass: "nextMonth",
curMonthNormalCellClass: "",
prevNextMonthDaysVisible: true
},
...
weekDayNames: [],
...
    그 중 절반 은 셀 스타일 을 제어 하 는 데 사 용 됩 니 다(너무 많은 설명 을 하지 않 음).다른 몇 개(firstDay of Week,prev NextMonth Day Visible,week Day Names)의 의 미 는 다음 과 같 습 니 다.     달력     prevNextMonthDaysVisible:이 달 이외 의 날 짜 를 표시 할 지 여부     week Day Names:요일 의 이름(색인 이 1 에서 시 작 된 배열,1 곳 의 값 은 월요일 의 디 스 플레이 이름 으로 추 정 됩 니 다)     다음은 html 코드 생 성 단계 에 들 어 갑 니 다:    1.달력 헤더 생 성:    
 
_RenderTitle: function(month, year) {
var ht = [];
//
ht.push("<tr>");
ht.push("<th colspan='7' style='width:100%;'><div style='float:left;width:10%;text-align:center;' id='", this.containerId, "_prevMonth' title=' '><</div><div style='float:left;text-align:center;width:80%'>", year, " ", month, " </div><div style='float:right;width:10%; text-align:center;' id='", this.containerId, "_nextMonth' title=' '>></div></th>");
ht.push("</tr>");
//
ht.push("<tr>");
for (var i = 0; i < 7; i++) {
var day = (i + this.settings.firstDayOfWeek) == 7 ? 7 : (i + this.settings.firstDayOfWeek) % 7;
ht.push("<th>", this.weekDayNames[day], "</th>")
}
ht.push("</tr>");
return ht.join("");
},
    날짜 부분 은'단추'를 조작 하 는 id 로 달력 컨트롤 용기 의 id 를 접두사 로 사용 하여 id 가 유일 하도록 합 니 다.    요일 부분 은 first Day of Week 설정 에 따라 week Day Name 을 가 져 옵 니 다.여기 서 관건 은 모든 단원 격 이 무슨 요일 을 대표 하 는 지 판단 하 는 것 이다.생각 은 매우 간단 하 다.    var day = (i + this.settings.firstDayOfWeek) == 7 ? 7 : (i + this.settings.firstDayOfWeek) % 7;     이렇게 하면 현재 단원 격 대표 의 주 를 얻 을 수 있다.    2.달력 생 성 주요 부분:
 
_RenderBody: function(month, year) {
var date = new Date(year, month - 1, 1);
var day = date.getDay();
var dayOfMonth = 1;
var daysOfPrevMonth = (7 - this.settings.firstDayOfWeek + day) % 7;
var totalDays = this._GetTotalDays(month, year);
var totalDaysOfPrevMonth = this._GetToalDaysOfPrevMonth(month, year);
var ht = [];
var curDate;
for (var i = 0; ; i++) {
curDate = null;
if (i % 7 == 0) {//
ht.push("<tr>");
}
ht.push("<td");
if (i >= daysOfPrevMonth && dayOfMonth <= totalDays) {//
curDate = new Date(year, month - 1, dayOfMonth);
if (Date.parse(new Date().toDateString()) - curDate == 0) {
ht.push(" class='", this.settings.curDayClass, "'");
}
else {
ht.push(" class='", this.settings.curMonthNormalCellClass, "'");
}
dayOfMonth++;
}
else if (i < daysOfPrevMonth) {//
if (this.settings.prevNextMonthDaysVisible) {
var prevMonth = month;
var prevYear = year;
if (month == 1) {
prevMonth = 12;
prevYear = prevYear - 1;
}
else {
prevMonth = prevMonth - 1;
}
curDate = new Date(prevYear, prevMonth - 1, totalDaysOfPrevMonth - (daysOfPrevMonth - i - 1));
ht.push(" class='", this.settings.prevMonthCellClass, "'");
}
}
else {//
if (this.settings.prevNextMonthDaysVisible) {
var nextMonth = month;
var nextYear = year;
if (month == 12) {
nextMonth = 1;
nextYear = prevYear + 1;
}
else {
nextMonth = nextMonth + 1;
}
curDate = new Date(nextYear, nextMonth-1, i - dayOfMonth - daysOfPrevMonth + 2);
ht.push(" class='", this.settings.nextMonthCellClass, "'");
}
}
ht.push(">");
ht.push(this._BuildCell(curDate));
ht.push("</td>");
if (i % 7 == 6) {//
ht.push("</tr>");
}
if (i % 7 == 6 && dayOfMonth - 1 >= totalDays) {
break;
}
}
return ht.join("");
},
    (1).이 달 1 일 을 가 져 오 는 것 은 무슨 요일 을 의미 합 니까?이렇게 해야만 1 호가 어느 칸 에 넣 어야 하 는 지,즉 이 달 에 어느 칸 부터 시작 해 야 하 는 지 판단 할 수 있다.    (2).이 달 날짜 표시 영역 을 제어 하기 위해 표지 변 수 를 정의 합 니 다.    (3).전시 할 지난달 의 일수 와 지난달 의 총 일 수 를 계산 합 니 다(다음 달 전시 할 일수 와 총 일 수 는 계산 하지 않 아 도 됩 니 다.다음 달 전시 할 날 짜 는 1 부터 최대 6 을 초과 하지 않 기 때 문 입 니 다).    (4).이 달의 날짜 표시:    조건 i>=days of PreventMonth&&&dayOf Month<=totalDays 가 이 달 날짜 의 표시 영역 을 결정 합 니 다.    (5).지난달 날짜 표시:    i
     if (i % 7 == 6 && dayOfMonth - 1 >= totalDays) {
break;
}
     i%7==6 은 한 줄 이 끝 났 음 을 나타 내 고,dayOFMonth-1>=totalDays 는 이 달 날짜 가 전 시 됐 음 을 나타 낸다.    (8).구조 curDate:curDate 는 각 칸 에 대응 하 는 날 짜 를 대표 합 니 다.이 달 날 짜 를 표시 할 때 curDate=new Date(year,month-1,dayOf Month);지난달 날 짜 를 표시 할 때 curDate=new Date(prevYear,prevMonth-1,totalDaysOf PrevMonth-(daysOf PrevMonth-i-1);다음 달 날 짜 를 표시 할 때 curDate=new Date(nextYear,nextMonth-1,i-dayof Month-days of PreventMonth+2),더하기 2 는 i 가 0 부터 시작 되 었 기 때문에 그 자체 가 1 이 적 었 고,dayof Month 는 이 달 날 짜 를 표시 할 때 한 번 더 추 가 했 습 니 다.    마지막 으로 다시 보 자BuildCell 은 무슨 일 을 했 습 니까?
 
_BuildCell: function(curDate) {
var ht = [];
if (curDate) {
for (var j = 0; j < this.dateLinkMappings.length; j++) {
if (Date.parse(this.dateLinkMappings[j].Date) - curDate == 0) {
ht.push("<a href='", this.dateLinkMappings[j].Link, "'>", curDate.getDate(), "</a>");
break;
}
}
if (j == this.dateLinkMappings.length) {
ht.push(curDate.getDate());
}
}
else {
ht.push("&nbsp;");
}
return ht.join("");
},
    사실 이 달력 컨트롤 의 의 도 는 사용자 가 초기 화 할 때 날짜 와 이 날짜 에 대응 하 는 링크 의 맵 을 입력 할 수 있 는 배열 입 니 다.즉,this.dateLink Mappings 입 니 다.셀 을 구축 할 때 구축 중인 날짜 가 this.dateLink Mappings 에 포함 되면 현재 셀 을형식 으로 구성 합 니 다.그렇지 않 으 면 일반적인 텍스트 형식 입 니 다.    OK,실현 논 리 는 대체적으로 이와 같 습 니 다.마지막 으로 프레젠테이션 효 과 를 보십시오.프론트 데스크 톱 호출 코드 는 다음 과 같 습 니 다. var date = new Date(); var mapping = []; mapping.push(new DateLinkMapping("3-22-2010", "javascript:alert(1)")); mapping.push(new DateLinkMapping("4-1-2010", "javascript:alert(1)")) Calendar.Init(null, mapping); Calendar.RenderCalendar("myCalendar", date.getMonth() + 1, date.getFullYear());패키지 다운로드 주소

좋은 웹페이지 즐겨찾기