; (function (undefined) { var _global; //工具函数 //配置合并 function extend(def, opt, override) { for (var k in opt) { if (opt.hasOwnProperty(k) && (!def.hasOwnProperty(k) || override)) { def[k] = opt[k] } } return def; } //日期格式化 function concatDate(y, m, d) { var symbol = '-'; if (m) { m = (m.toString())[1] ? m : '0' + m; } if (d) { d = (d.toString())[1] ? d : '0' + d; } return y + (m ? symbol + m : '') + (d ? symbol + d : ''); } //得到时间戳 function getTimeStamp(d) { var date = new Date(d); if (isNaN(date.getTime())) { console.error(d + ' is invalid date'); return ''; } return date.getTime(); } //polyfill if (!Array.isArray) { Array.isArray = function (arg) { return Object.prototype.toString.call(arg) === '[object Array]'; }; } //过滤非日期,格式化日期 function filterDate(arr) { if(!Array.isArray(arr)) { return []; } arr = arr || []; var dateArr = []; for (var i = 0; i < arr.length; i++) { var item = arr[i]; var date = new Date(item); if (isNaN(date.getTime())) { console.error(item + ' is invalid date') } else { var y = date.getFullYear(); var m = date.getMonth(); var d = date.getDate(); var dateStr = concatDate(y, m + 1, d); dateArr.push(dateStr); } } return dateArr; } function Schedule(opt) { var def = {}, opt = extend(def, opt, true), curDate = opt.date ? new Date(opt.date) : new Date(), disabledDate = opt.disabledDate ? filterDate(opt.disabledDate) : [], selectedDate = opt.selectedDate ? filterDate(opt.selectedDate) : [], disabledBefore = opt.disabledBefore ? getTimeStamp(opt.disabledBefore) : '', disabledAfter = opt.disabledAfter ? getTimeStamp(opt.disabledAfter) : '', showToday = opt.showToday, year = curDate.getFullYear(), month = curDate.getMonth(), currentYear = curDate.getFullYear(), currentMonth = curDate.getMonth(), currentDay = curDate.getDate(), activeDate = '', el = document.querySelector(opt.el) || document.querySelector('body'), _this = this; var bindEvent = function () { el.addEventListener('click', function (e) { switch (e.target.id) { case 'nextMonth': _this.nextMonthFun(); break; case 'nextYear': _this.nextYearFun(); break; case 'prevMonth': _this.prevMonthFun(); break; case 'prevYear': _this.prevYearFun(); break; case 'todayBtn': _this.renderToday(); break; default: break; }; //if (e.target.className.indexOf('currentDate') > -1) { // activeDate = e.target.title; // opt.clickCb && opt.clickCb(activeDate); // render(); //} }, false) } var init = function () { var scheduleHd = '
' + '
' + '' + '' + '
' + '
' + '
' + '' + '' + '
' + '
' var scheduleWeek = '' var scheduleBd = ''; var todayBtn = '
今天
' el.innerHTML = scheduleHd + scheduleWeek + scheduleBd + (showToday ? todayBtn : ''); bindEvent(); render(); } var render = function () { var fullDay = new Date(year, month + 1, 0).getDate(), //当月总天数 startWeek = new Date(year, month, 1).getDay(), //当月第一天是周几 total = (fullDay + startWeek) % 7 == 0 ? (fullDay + startWeek) : fullDay + startWeek + (7 - (fullDay + startWeek) % 7),//元素总个数 lastMonthDay = new Date(year, month, 0).getDate(), //上月最后一天 eleTemp = []; for (var i = 0; i < total; i++) { var nowDate = concatDate(year, month + 1, (i + 1 - startWeek)); var nowTimestamp = new Date(nowDate).getTime(); var isDisbale = disabledDate.indexOf(nowDate) > -1; var isSelected = selectedDate.indexOf(nowDate) > -1; if (i < startWeek) { eleTemp.push('
  • ' + (lastMonthDay - startWeek + 1 + i) + '
  • ') } else if (i < (startWeek + fullDay)) { var addClass = ''; if (isDisbale) { addClass = 'disabled' } else { isSelected && (addClass = 'selected-style'); activeDate == nowDate && (addClass = 'active-style'); concatDate(currentYear, currentMonth + 1, currentDay) == nowDate && (addClass = 'today-flag'); } if (disabledBefore && nowTimestamp < disabledBefore) { addClass = 'disabled' } if (disabledAfter && nowTimestamp > disabledAfter) { addClass = 'disabled' } eleTemp.push('
  • ' + (i + 1 - startWeek) + '
  • ') } else { eleTemp.push('
  • ' + (i + 1 - (startWeek + fullDay)) + '
  • ') } } el.querySelector('.schedule-bd').innerHTML = eleTemp.join(''); el.querySelector('.today').innerHTML = concatDate(year, month + 1); }; this.nextMonthFun = function () { if (month + 1 > 11) { year += 1; month = 0; } else { month += 1; } render(); opt.nextMonthCb && opt.nextMonthCb(year, month + 1); }; this.nextYearFun = function () { year += 1; render(); opt.nextYeayCb && opt.nextYeayCb(year, month + 1); }; this.prevMonthFun = function () { if (month - 1 < 0) { year -= 1; month = 11; } else { month -= 1; } render(); opt.prevMonthCb && opt.prevMonthCb(year, month + 1); }; this.prevYearFun = function () { year -= 1; render(); opt.prevYearCb && opt.prevYearCb(year, month + 1); } this.renderToday = function () { if (year === currentYear && month === currentMonth) { return; } year = currentYear; month = currentMonth; render(); } init(); } //将插件暴露给全局对象 _global = (function () { return this || (0, eval)('this') }()); if (typeof module !== 'undefined' && module.exports) { module.exports = Schedule; } else if (typeof define === "function" && define.amd) { define(function () { return Schedule; }) } else { !('Schedule' in _global) && (_global.Schedule = Schedule); } }());