
当月第一天,和当月最后一天的获取方式...这个就确实比较扯了,但事实上它就要这样....



第一天
new Date(year, minth-1, 1)
最后一天
new Date(year, month,0)
(function () {
var datepicker = {};
datepicker.getMonthData = function (year,month) {
var ret = [];
if(!year || !month){
var today = new Date();
year = today.getFullYear();
month = today.getMonth()+1;
}
var firstDay = new Date(year,month-1,1);
var firstDayWeekDay = firstDay.getDay();
if(firstDayWeekDay === 0)
firstDayWeekDay = 7;
var lastDayOfLastMonth = new Date(year,month-1,0);
var lastDateOfLastMonth = lastDayOfLastMonth.getDate();
var preMonthDayCount = firstDayWeekDay -1;
var lastDay = new Date(year,month,0);
var lastDate = lastDay.getDate();
//利用循环查询到一周日期
for( var i = 0; i<7*6; i++){
var date = i+1 - preMonthDayCount;
var showDate = date;
var thisMonth = month;
if(date <= 0){
thisMonth = month +1;
showDate = lastDateOfLastMonth +date;
}else if(date > lastDate){
thisMonth = month +1;
showDate = showDate-lastDate;
}if(thisMonth === 0)thisMonth = 12;
if(thisMonth === 13) thisMonth = 1;
ret.push({
month:thisMonth,
date:date,
showDate:showDate
});
}
return ret;
};
window.datepicker = datepicker;
})();
new Date(year, month-1, date)
月份需要减一
越界自动退位
getFullYear()/ getMonth()/ getDate() / getDay() [获取星期0到6]
当月第一天new Date(year, minth-1, 1)
当月最后一天new Date(year, month,0)
二、date.js
(function() { // 为了防止模块编写的时候污染外部环境,就会用匿名函数。
let datepicker = {};
datepicker.getMonthData = function(year, month) {
let ret = [];
if (!year && !month && month !==0) {
let today = new Date();
year = today.getFullYear();
month = today.getMonth() + 1;
}
let firstDay = new Date(year, month - 1, 1);
let firstDayWeekDay = firstDay.getDay();
if (firstDayWeekDay === 0) {
firstDayWeekDay = 7;
}
year = firstDay.getFullYear(); // 哪年
month = firstDay.getMonth() + 1; // 哪月
let lastDayOfLastMoth = new Date(year, month - 1, 0); // 上个月最后一天
let lastDateOfLastMonth = lastDayOfLastMoth.getDate(); // 上个月最后一天是几号
let preMonthDayCount = firstDayWeekDay - 1; // 上个月最后一天是星期几
let lastDay = new Date(year, month, 0); // 这个月最后一天
let lastDate = lastDay.getDate(); // 这个月最后一天是几号
for (let i = 0; i < 7*6; i++) {
let date = i - preMonthDayCount + 1; // 距离上个月最后一天多长时间(单位:天)
let showDate = date;
let thisMonth = month;
if (date <= 0) {
// 上一月
thisMonth = month - 1; // 上个月月份
showDate = lastDateOfLastMonth + date; // 上个月日期
} else if (date > lastDate) {
// 下一月
thisMonth = month + 1; // 下个月月份
showDate = showDate - lastDate; // 下个月日期
}
// if (thisMonth === 0) {
// thisMonth = 12;
// }
// if (thisMonth === 13) {
// thisMonth = 1;
// }
thisMonth = thisMonth === 0 ? 12 :thisMonth === 13 ? 1 : thisMonth;
ret.push({
month: thisMonth,
date: date,
showDate: showDate
});
}
return {
year: year,
month: month,
days: ret
};
};
window.datePicker = datepicker;
})();三、main.js
(function() {
let datePicker = window.datePicker;
let monthData;
let $wrapper;
datePicker.buildUi = function(year, month) {
monthData = datePicker.getMonthData(year, month);
let html = '<div class="ui-datepicker-head">'+
'<a class="ui-datepicker-btn ui-datepicker-prev-btn"><</a>'+
' <a class="ui-datepicker-btn ui-datepicker-next-btn">></a>'+
' <span class="ui-datepicker-curr-month">' + monthData.year + '- ' + monthData.month + '</span>'+
' </div>'+
' <div class="ui-datepicker-body">'+
' <table>'+
' <thead>'+
' <tr>'+
'<th>一</th>'+
' <th>二</th>'+
' <th>三</th>'+
'<th>四</th>'+
'<th>五</th>'+
' <th>六</th>'+
' <th>七</th>'+
' </tr>'+
'</thead>'+
' <tbody>';
for (let i = 0; i < monthData.days.length; i++) {
let date = monthData.days[i];
if (i % 7 === 0) {
html += '<tr>';
}
html += '<td data-date="' + date.date + '">' + date.showDate + '</td>';
if (i % 7 === 6) {
html += '</tr>';
}
}
html += '</tbody>' +
'</table>' +
'</div>';
return html;
};
datePicker.render = function(direction) {
let year,month;
if (monthData) {
year = monthData.year;
month = monthData.month;
}
if (direction === 'prev') {
month--;
}
if (direction === 'next') {
month++;
}
let html = datePicker.buildUi(year, month);
$wrapper = document.querySelector('.ui-datepicker-wrapper');
if (!$wrapper) {
$wrapper = document.createElement('div');
document.body.appendChild($wrapper);
$wrapper.className = 'ui-datepicker-wrapper';
}
$wrapper.innerHTML = html;
};
datePicker.init = function($dom) {
datePicker.render();
let $input = document.querySelector($dom);
let isOpen = false;
// $dom点击后,日历显示出来,日历位置适应。
$input.addEventListener('click', function() {
if (isOpen) {
$wrapper.classList.remove('ui-datepicker-wrapper-show');
isOpen = false;
} else {
$wrapper.classList.add('ui-datepicker-wrapper-show');
let left = $input.offsetLeft;
let top = $input.offsetTop;
let height = $input.offsetHeight;
$wrapper.style.top = top + height + 2 + 'px';
$wrapper.style.left = left + 'px';
isOpen = true;
}
}, false);
// $wrapper.querySelector('.ui-datepicker-btn').addEventListener();
// 每次渲染完重新绑定事件
// 为不变的元素绑定事件
$wrapper.addEventListener('click', function(e) {
let $target = e.target;
// let containsBtn = $target.classList.contains('ui-datepicker-btn');
if (!$target.classList.contains('ui-datepicker-btn')) {
return;
}
if ($target.classList.contains('ui-datepicker-prev-btn')) {
datePicker.render('prev');
} else if ($target.classList.contains('ui-datepicker-next-btn')) {
datePicker.render('next');
}
}, false);
$wrapper.addEventListener('click', function(e) {
let $target = e.target;
if ($target.tagName.toLowerCase() !== 'td') {
return;
}
let date = new Date(monthData.year, monthData.month - 1, $target.dataset.date);
$input.value = format(date);
$wrapper.classList.remove('ui-datepicker-wrapper-show');
isOpen = false;
})
}
function format(date) {
let ret = '';
let shuffle = function(num) {
if (num <= 9) {
return `0${num}`;
}
return num;
};
ret += date.getFullYear() + '-';
ret += shuffle(date.getMonth() + 1) + '-';
ret += shuffle(date.getDate());
return ret;
}
})();
一、优化方向:
1、如何在移动端使用这个组件。
2、页面定位比较复杂时,如何处理弹出框的位置。
3、如何让上一个月,下一个月,使用不同的样式。
4、如何让某些日期可点,某些日期不可点。
一、<a href=""> 写了href,但是里面没有赋值,导致点击a链接会重新刷新页面,一直不能跳转到上一个月。这个bug找了很久。
一、为了防止模块编写的时候污染环境,就会用匿名函数。
一、日期对象:new Date(year, month-1, date)
1、月份需要-1.
2、越界自动进(退)位
3、getFullYear() / getMonth() / getDate()
4、getYear():当前年距离1900年多少年。
5、getDay():当前日期是周几
二、日期
1、当月第一天:new Date(year, month-1, 1)。
2、当月最后一天:new Date(year, month, 0)。
3、星期一-星期天[1, 2, 3, 4, 5, 6, 0]
一、webstorm:从1到10递增快捷键:li{$}*10
一、日历制作过程
1、静态结构编写。
2、日历数据。
3、数据渲染。
4、事件处理。
当月第一天,最后一天
cursor:pointer;是鼠标指针移上去显示手形状