📄 jquery-calendar.js
字号:
/* Get a setting value, defaulting if necessary. */ _get: function(name) { return (this._settings[name] != null ? this._settings[name] : popUpCal._defaults[name]); }, /* Parse existing date and initialise calendar. */ _setDateFromField: function(input) { this._input = $(input); var dateFormat = this._get('dateFormat'); var currentDate = this._input.val().split(dateFormat.charAt(3)); if (currentDate.length == 3) { this._currentDay = parseInt(currentDate[dateFormat.indexOf('D')], 10); this._currentMonth = parseInt(currentDate[dateFormat.indexOf('M')], 10) - 1; this._currentYear = parseInt(currentDate[dateFormat.indexOf('Y')], 10); } else { var date = new Date(); this._currentDay = date.getDate(); this._currentMonth = date.getMonth(); this._currentYear = date.getFullYear(); } this._selectedDay = this._currentDay; this._selectedMonth = this._currentMonth; this._selectedYear = this._currentYear; this._adjustDate(); }, /* Set the date directly. */ _setDate: function(date) { this._selectedDay = this._currentDay = date.getDate(); this._selectedMonth = this._currentMonth = date.getMonth(); this._selectedYear = this._currentYear = date.getFullYear(); this._adjustDate(); }, /* Retrieve the date directly. */ _getDate: function() { return new Date(this._currentYear, this._currentMonth, this._currentDay); }, /* Generate the HTML for the current state of the calendar. */ _generateCalendar: function() { var today = this._currentDate; today = new Date(today.getFullYear(), today.getMonth(), today.getDate()); // clear time // build the calendar HTML var controls = '<div class="calendar_control">' + '<a class="calendar_clear" onclick="popUpCal._clearDate(' + this._id + ');">' + this._get('clearText') + '</a>' + '<a class="calendar_close" onclick="popUpCal.hideCalendar(' + this._id + ');">' + this._get('closeText') + '</a></div>'; var prompt = this._get('prompt'); var closeAtTop = this._get('closeAtTop'); var hideIfNoPrevNext = this._get('hideIfNoPrevNext'); // controls and links var html = (prompt ? '<div class="calendar_prompt">' + prompt + '</div>' : '') + (closeAtTop && !this._inline ? controls : '') + '<div class="calendar_links">' + (this._canAdjustMonth(-1) ? '<a class="calendar_prev" ' + 'onclick="popUpCal._adjustDate(' + this._id + ', -1, \'M\');">' + this._get('prevText') + '</a>' : (hideIfNoPrevNext ? '' : '<label class="calendar_prev">' + this._get('prevText') + '</label>')) + (this._isInRange(today) ? '<a class="calendar_current" ' + 'onclick="popUpCal._gotoToday(' + this._id + ');">' + this._get('currentText') + '</a>' : '') + (this._canAdjustMonth(+1) ? '<a class="calendar_next" ' + 'onclick="popUpCal._adjustDate(' + this._id + ', +1, \'M\');">' + this._get('nextText') + '</a>' : (hideIfNoPrevNext ? '' : '<label class="calendar_next">' + this._get('nextText') + '</label>')) + '</div><div class="calendar_header">'; var minDate = this._get('minDate'); var maxDate = this._get('maxDate'); // month selection var monthNames = this._get('monthNames'); if (!this._get('changeMonth')) { html += monthNames[this._selectedMonth] + ' '; } else { var inMinYear = (minDate && minDate.getFullYear() == this._selectedYear); var inMaxYear = (maxDate && maxDate.getFullYear() == this._selectedYear); html += '<select class="calendar_newMonth" ' + 'onchange="popUpCal._selectMonthYear(' + this._id + ', this, \'M\');" ' + 'onclick="popUpCal._clickMonthYear(' + this._id + ');">'; for (var month = 0; month < 12; month++) { if ((!inMinYear || month >= minDate.getMonth()) && (!inMaxYear || month <= maxDate.getMonth())) { html += '<option value="' + month + '"' + (month == this._selectedMonth ? ' selected="selected"' : '') + '>' + monthNames[month] + '</option>'; } } html += '</select>'; } // year selection if (!this._get('changeYear')) { html += this._selectedYear; } else { // determine range of years to display var years = this._get('yearRange').split(':'); var year = 0; var endYear = 0; if (years.length != 2) { year = this._selectedYear - 10; endYear = this._selectedYear + 10; } else if (years[0].charAt(0) == '+' || years[0].charAt(0) == '-') { year = this._selectedYear + parseInt(years[0], 10); endYear = this._selectedYear + parseInt(years[1], 10); } else { year = parseInt(years[0], 10); endYear = parseInt(years[1], 10); } year = (minDate ? Math.max(year, minDate.getFullYear()) : year); endYear = (maxDate ? Math.min(endYear, maxDate.getFullYear()) : endYear); html += '<select class="calendar_newYear" onchange="popUpCal._selectMonthYear(' + this._id + ', this, \'Y\');" ' + 'onclick="popUpCal._clickMonthYear(' + this._id + ');">'; for (; year <= endYear; year++) { html += '<option value="' + year + '"' + (year == this._selectedYear ? ' selected="selected"' : '') + '>' + year + '</option>'; } html += '</select>'; } html += '</div><table class="calendar" cellpadding="0" cellspacing="0"><thead>' + '<tr class="calendar_titleRow">'; var firstDay = this._get('firstDay'); var changeFirstDay = this._get('changeFirstDay'); var dayNames = this._get('dayNames'); for (var dow = 0; dow < 7; dow++) { // days of the week html += '<td>' + (!changeFirstDay ? '' : '<a onclick="popUpCal._changeFirstDay(' + this._id + ', this);">') + dayNames[(dow + firstDay) % 7] + (changeFirstDay ? '</a>' : '') + '</td>'; } html += '</tr></thead><tbody>'; var daysInMonth = this._getDaysInMonth(this._selectedYear, this._selectedMonth); this._selectedDay = Math.min(this._selectedDay, daysInMonth); var leadDays = (this._getFirstDayOfMonth(this._selectedYear, this._selectedMonth) - firstDay + 7) % 7; var currentDate = new Date(this._currentYear, this._currentMonth, this._currentDay); var selectedDate = new Date(this._selectedYear, this._selectedMonth, this._selectedDay); var printDate = new Date(this._selectedYear, this._selectedMonth, 1 - leadDays); var numRows = Math.ceil((leadDays + daysInMonth) / 7); // calculate the number of rows to generate var customDate = this._get('customDate'); var showOtherMonths = this._get('showOtherMonths'); for (var row = 0; row < numRows; row++) { // create calendar rows html += '<tr class="calendar_daysRow">'; for (var dow = 0; dow < 7; dow++) { // create calendar days var customSettings = (customDate ? customDate(printDate) : [true, '']); var otherMonth = (printDate.getMonth() != this._selectedMonth); var unselectable = otherMonth || !customSettings[0] || (minDate && printDate < minDate) || (maxDate && printDate > maxDate); html += '<td class="calendar_daysCell' + ((dow + firstDay + 6) % 7 >= 5 ? ' calendar_weekEndCell' : '') + // highlight weekends (otherMonth ? ' calendar_otherMonth' : '') + // highlight days from other months //(printDate.getTime() == selectedDate.getTime() ? ' calendar_daysCellOver' : '') + // highlight selected day (unselectable ? ' calendar_unselectable' : '') + // highlight unselectable days (!otherMonth || showOtherMonths ? ' ' + customSettings[1] : '') + // highlight custom dates (printDate.getTime() == currentDate.getTime() ? ' calendar_currentDay' : // highlight current day (printDate.getTime() == today.getTime() ? ' calendar_today' : '')) + '"' + // highlight today (if different) (unselectable ? '' : ' onmouseover="$(this).addClass(\'calendar_daysCellOver\');"' + ' onmouseout="$(this).removeClass(\'calendar_daysCellOver\');"' + ' onclick="popUpCal._selectDay(' + this._id + ', this);"') + '>' + // actions (otherMonth ? (showOtherMonths ? printDate.getDate() : ' ') : // display for other months (unselectable ? printDate.getDate() : '<a>' + printDate.getDate() + '</a>')) + '</td>'; // display for this month printDate.setDate(printDate.getDate() + 1); } html += '</tr>'; } html += '</tbody></table>' + (!closeAtTop && !this._inline ? controls : '') + '<div style="clear: both;"></div>' + (!$.browser.msie ? '' : '<!--[if lte IE 6.5]><iframe src="javascript:false;" class="calendar_cover"></iframe><![endif]-->'); return html; }, /* Adjust one of the date sub-fields. */ _adjustDate: function(offset, period) { var date = new Date(this._selectedYear + (period == 'Y' ? offset : 0), this._selectedMonth + (period == 'M' ? offset : 0), this._selectedDay + (period == 'D' ? offset : 0)); // ensure it is within the bounds set var minDate = this._get('minDate'); var maxDate = this._get('maxDate'); date = (minDate && date < minDate ? minDate : date); date = (maxDate && date > maxDate ? maxDate : date); this._selectedDay = date.getDate(); this._selectedMonth = date.getMonth(); this._selectedYear = date.getFullYear(); }, /* Find the number of days in a given month. */ _getDaysInMonth: function(year, month) { return 32 - new Date(year, month, 32).getDate(); }, /* Find the day of the week of the first of a month. */ _getFirstDayOfMonth: function(year, month) { return new Date(year, month, 1).getDay(); }, /* Determines if we should allow a "next/prev" month display change. */ _canAdjustMonth: function(offset) { var date = new Date(this._selectedYear, this._selectedMonth + offset, 1); if (offset < 0) { date.setDate(this._getDaysInMonth(date.getFullYear(), date.getMonth())); } return this._isInRange(date); }, /* Is the given date in the accepted range? */ _isInRange: function(date) { var minDate = this._get('minDate'); var maxDate = this._get('maxDate'); return ((!minDate || date >= minDate) && (!maxDate || date <= maxDate)); }, /* Format the given date for display. */ _formatDate: function() { var day = this._currentDay = this._selectedDay; var month = this._currentMonth = this._selectedMonth; var year = this._currentYear = this._selectedYear; month++; // adjust javascript month var dateFormat = this._get('dateFormat'); var dateString = ''; for (var i = 0; i < 3; i++) { dateString += dateFormat.charAt(3) + (dateFormat.charAt(i) == 'D' ? (day < 10 ? '0' : '') + day : (dateFormat.charAt(i) == 'M' ? (month < 10 ? '0' : '') + month : (dateFormat.charAt(i) == 'Y' ? year : '?'))); } return dateString.substring(dateFormat.charAt(3) ? 1 : 0); }});/* Attach the calendar to a jQuery selection. @param settings object - the new settings to use for this calendar instance (anonymous) @return jQuery object - for chaining further calls */$.fn.calendar = function(settings, defaultDate) { return this.each(function() { // check for settings on the control itself - in namespace 'cal:' var inlineSettings = null; for (attrName in popUpCal._defaults) { var attrValue = this.getAttribute('cal:' + attrName); if (attrValue) { inlineSettings = inlineSettings || {}; try { inlineSettings[attrName] = eval(attrValue); } catch (err) { inlineSettings[attrName] = attrValue; } } } var nodeName = this.nodeName.toLowerCase(); if (nodeName == 'input') { var instSettings = (inlineSettings ? $.extend($.extend({}, settings || {}), inlineSettings || {}) : settings); // clone and customise var inst = (inst && !inlineSettings ? inst : new PopUpCalInstance(instSettings, false, defaultDate)); popUpCal._connectCalendar(this, inst); } else if (nodeName == 'div' || nodeName == 'span') { var instSettings = $.extend($.extend({}, settings || {}), inlineSettings || {}); // clone and customise var inst = new PopUpCalInstance(instSettings, true, defaultDate); popUpCal._inlineCalendar(this, inst, defaultDate); } });};/* Initialise the calendar. */$(document).ready(function() { popUpCal = new PopUpCal(); // singleton instance});
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -