在jquery datepicker插件中需要帮助

时间:2020-06-03 11:22:21

标签: jquery datepicker

我需要一些帮助,我在jquery中制作了一个简单的datepicker插件。一切正常。可以选择日期,更改日期等,但是如果调用插件进行多次输入并选择一个日期,则它将在每个字段中填写相同的日期。

请检查代码样式,我缺少什么或做错了什么,我还想在单击输入字段时调用初始化函数功能

when datepicker opened

after selected date

Js:

<script> 'use strict'; !(function($) { $.fn.calender = function(options) { var element = $(this); this.elementId = element.attr("id") let j_container = "jcalender-container"; let main_container = ''; var defaults = { color: "white", BackgroundColor: "#556b2f", date: new Date(), top_month: "short", format: "d/m/Y", getDate: function() {} }; defaults.day = defaults.date.getDay(); defaults.month = defaults.date.getMonth(); defaults.IMonth = defaults.date.getMonth(); defaults.year = defaults.date.getFullYear(); let a = 0; var utils = { dates: { days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], daysShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"], daysMin: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"], months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], monthsShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] }, isLeapYear: function(year) { return (((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0)) }, getDaysInMonth: function(year, month) { return [31, (utils.isLeapYear(year) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month] }, parseMonth: function(options) { let obj = { year: options.year }, lmonth = "", smonth = "", month = options.month; if (!isNaN(parseInt(month))) { obj.IMonth = month; if (settings.top_month == "short") { obj.month = utils.dates.monthsShort[month]; } else if (settings.top_month == "long") { obj.month = utils.dates.months[month]; } } else { smonth = utils.dates.monthsShort.indexOf(month); lmonth = utils.dates.months.indexOf(month); obj.month = month; if (smonth != -1) { obj.IMonth = smonth; } else if (lmonth != -1) { obj.IMonth = lmonth; } } return obj; }, parseFormat: function(format) { let separator = format.match(/[.\/\-\s].*?/), parts = format.split(/\W+/); if (!separator || !parts || parts.length === 0) { throw new Error("Invalid date format."); } return { separator: separator, parts: parts }; }, parseDate: function(date) { let dates = new Date(date) let format = settings.format; let parsed = utils.parseFormat(format); let Fdate = []; let parts = parsed.parts; let separator = parsed.separator; for (let i = 0; i < parts.length; i++) { switch (parts[i]) { case 'm': case 'mm': Fdate.push(dates.getMonth() + 1) break; case 'M': Fdate.push(utils.dates.monthsShort[dates.getMonth() + 1]) break; case 'MM': Fdate.push(utils.dates.months[dates.getMonth() + 1]) break; case 'd': Fdate.push(dates.getDate()) break; case 'dd': Fdate.push(utils.dates.daysMin[dates.getDay()]) break; case 'D': Fdate.push(utils.dates.daysShort[dates.getDay()]) break; case 'DD': Fdate.push(utils.dates.days[dates.getDay()]) break; case 'Y': case 'YY': Fdate.push(dates.getFullYear()) break; case 'y': case 'yy': Fdate.push(dates.getYear()) break; } } return Fdate.join(separator) } }; var settings = $.extend({}, defaults, options); if (this.length > 1) { this.each(function() { $(this).calender(options) }); return this; } var _this = this; switch (settings.top_month) { case "short": default: settings.month = utils.dates.monthsShort[settings.month]; break; case "long": settings.month = utils.dates.months[settings.month]; break; } let j_month_control = "jmonth-control"; let get_date = "get-date"; this.initialize = function() { // $("head").append(this.css); main_container = $("body").find("." + j_container); if (main_container.length == 0) { $("body").append(`<div class="${j_container}"></div>`) main_container = $("body").find("." + j_container); } this.render(settings); return this; }; this.populateDay = function(year, month) { var firstDay = new Date(year, month, 1); var lastDay = new Date(year, month + 1, 0); var offset = firstDay.getDay(); var total_days = utils.getDaysInMonth(year, month); total_days = total_days + offset; var html = ""; var td = ""; var td = new Array(); let b = 1; for (let a = 0; a < total_days; a++) { if (a < offset) { td.push("<td><div></div></td>") } else { td.push("<td><div data-month=" + month + " data-year=" + year + " class='" + get_date + "'>" + b + "</div></td>") b++; } } for (let a = 0; a < total_days; a = a + 7) { let tr = td.slice(a, a + 7) html += "<tr>" + tr.join("") + "<tr>"; } return html; }; /*hide/show calender*/ element.on("click", function() { let main_css = { "position": "absolute", "z-index": 1, "left": element.offset().left, "top": (element.offset().top + element.outerHeight() + 5) }; main_container.css(main_css) main_container.show(); }); /* change left right month */ $(document).on("click", "." + j_month_control, function() { let type = $(this).attr("type"); let year = $(this).parent().find(".jyear"); let get_year = parseInt(year.text()); let month = $(this).parent().find("label.jmonth"); let get_month = month.text(); let date = utils.parseMonth({ "year": get_year, "month": get_month }); let set_year = date.year; let set_month = ""; if (type == "prev") { if (date.IMonth == 0) { set_month = 11; set_year = date.year - 1; } else { set_month = date.IMonth - 1; } } else if (type == "next") { // set_month = date.IMonth + 1; if (date.IMonth == 11) { set_month = 0; set_year = date.year + 1; } else { set_month = date.IMonth + 1; } } _this.render({ "month": set_month, "year": set_year }) }); /* get current date */ $(document).on("click", "." + get_date, function() { let year = parseInt($(this).data("year")) let month = parseInt($(this).data("month")) let day = parseInt($(this).text()) let date = utils.parseDate(year + "-" + month + "-" + day); element.val(date) main_container.hide(); }) this.render = function(options) { options = utils.parseMonth(options) let content = `<div class="jheader-container"> <div class="j-left-arrow ${j_month_control}" type="prev"><</div> <div class="j-center-date"> <label class="jmonth">${options.month}</label> <label class="jyear">${options.year}</label> </div> <div class="j-right-arrow ${j_month_control}" type="next">></div> </div> <div class="j-table-container"> <div class="jweek-name"> <table> <tr> <th>Sun</th> <th>Mon</th> <th>Tue</th> <th>Wed</th> <th>Fri</th> <th>Sat</th> </tr> </table> </div> <div class="j-calender-days"><table class="jmonth-days">${_this.populateDay(options.year,options.IMonth)}</table> </div> </div>`; main_container.html(content) } return this.initialize(); } })(jQuery); <script> </pre>

0 个答案:

没有答案
相关问题