[实战之jQuery] flatpickr的年份输入(number input)无痛转换成下拉(select)

话说在使用falcon admin template时,里面有搭配到flatpickr v4做为日期/时间的选取器

虽然相较jQuery的datetimepicker或datepicker比较不好使用
但在外观上的确比较好一些,因此就加了一些共用函式来操作flatpickr

    function setFlatpickrOption(_this, option, value) {       $(_this).get(0)._flatpickr.set(option, value);   }   function getFlatpickrDates(_this) {       return $(_this).get(0)._flatpickr.selectedDates;       //return _.map($(_this).get(0)._flatpickr.selectedDates, (date) => date != '' ? new Date(date).toISOString() : '');   }   function setFlatpickrDates(_this, dateVal, withTime = false) {       if ( dateVal == null && $(_this).get(0)._flatpickr ) {           clearFlatpickrDates(_this);           return;       }       dateVal = moment(withTime ? _layout.formatDateTime(dateVal) : _layout.formatDate(dateVal)).valueOf();       if (moment(dateVal).isValid())           $(_this).get(0)._flatpickr.setDate(dateVal);   }   function clearFlatpickrDates(_this) {       // $(_this).get(0)._flatpickr.clear();       $(_this).get(0)._flatpickr.destroy();       flatpickr(_this, $(_this).data('options'));   }   function setFlatpickrYear(_this, year) {       let _d = new Date(year, $(_this).get(0)._flatpickr.currentMonth, 1);       // console.log($(_this).get(0)._flatpickr);       $(_this).get(0)._flatpickr.jumpToDate(_d, false);   }

保持使用jQuery的selector做为识别参数

setFlatpickrDates(`{selector}`, {dateValue});

这样初步就可以使用起来了
但凡事总有一个BUT
因为在flatpickr的日期选择是number input+内建会产生年份加减的按钮
但不够直接及明显,比如不晓得的人要设定出生年就要按超多下
或者还要点入input自行输入
考量到这类的使用者大多习惯下拉切换年份(如同datepicker)
因此就加了以下hack

首先把month select複製一份给year使用,并取一个识别的class name
    .flatpickr-current-month .flatpickr-yearDropdown-years {       appearance: menulist;       background: transparent;       border: none;       border-radius: 0;       box-sizing: border-box;       color: inherit;       cursor: pointer;       font-size: inherit;       font-family: inherit;       font-weight: 300;       height: auto;       line-height: inherit;       margin: -1px 0 0 0;       outline: none;       padding: 0 0 0 0.5ch;       position: relative;       vertical-align: initial;       -webkit-box-sizing: border-box;       -webkit-appearance: menulist;       -moz-appearance: menulist;       width: auto;   }
再来就把下面js加到document.ready里面
    $('.datetimepickerV1').each(function() {       let id = $(this).attr('id');       let dateOption = Object.assign({           onMonthChange: function(selectedDates, dateStr, instance) {               $(instance.calendarContainer).find('.flatpickr-yearDropdown-years').val(instance.currentYear);           },           onOpen: function(selectedDates, dateStr, instance){               let minYear = 1900, maxYear = new Date().getFullYear();               let years = Array.apply(null, Array(maxYear - minYear + 1))                   .map(function (y, i) { return minYear + i; });               let currentYear = selectedDates.length > 0 ? selectedDates[0].getFullYear() : instance.currentYear;               $(instance.calendarContainer).find('.numInputWrapper').replaceWith(`                   <div class="numInputWrapper">                       <select class="flatpickr-yearDropdown-years pe-1" onchange="setFlatpickrYear('#${id}', $(this).val());">                           ${years.map(x => `<option ${x == currentYear ? 'selected' : ''}>${x}</option>`)}                       </select>                       <input class="numInput cur-year d-none" type="number" tabindex="-1" aria-label="Year">                   </div>               `);           }       }, $(this).data('options') || {});       flatpickr($(this).get(0), dateOption);   });

除了里面的minYear, maxYear可以各自依需求调整之外
其它部份就可以如下跑动了:


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章