当前位置:   article > 正文

将Date Range Picker扩展选择月份范围功能_daterangepicker 选到月份

daterangepicker 选到月份

Date Range Picker是一个基于JQuery的时间选择器插件,提供了丰富的功能和优秀的界面,它的官网地址http://www.daterangepicker.com

但是这个插件有一个比较坑比的是没有月选择器,只有日期和时间选择器,项目中用到了日期选择器的功能,但是在这个项目的另外一个业务又要需要月选择器,如果重新引入一个日期选择器又多了引入文件,如果重写一个功能又不划算,于是决定直接在daterangepicker这个插件上增加月范围选择器,也要保证不影响它原来功能,也不需要引入其他的框架。

因此,使用该扩展出的月份选择器前提是会使用daterangepicker本身的功能。

一.直接使用

首先要引入datarangepicker的需要的文件

  1. <script type="text/javascript" src="https://cdn.jsdelivr.net/jquery/latest/jquery.min.js"></script>
  2. <script type="text/javascript" src="https://cdn.jsdelivr.net/momentjs/latest/moment.min.js"></script>
  3. <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/daterangepicker/daterangepicker.min.js"></script>
  4. <link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/daterangepicker/daterangepicker.css" />

css文件:

  1. *{
  2. margin: 0;
  3. padding: 0;
  4. }
  5. .daterangepicker .drp-buttons {
  6. text-align: left;
  7. }
  8. .daterangepicker .drp-selected {
  9. display: none;
  10. }
  11. div.drp-calendar.left {
  12. margin-right: 20px!important;
  13. }
  14. li{
  15. list-style: none;
  16. }
  17. .s-cal {
  18. width: 150px;
  19. margin-top: 8px;
  20. }
  21. div.calendar.left {
  22. margin-right: 20px!important;
  23. }
  24. .s-calTitle>span {
  25. padding-left: 5px;
  26. padding-right: 5px;
  27. color: #08c;
  28. cursor: pointer;
  29. line-height: 25px;
  30. border-radius: 3px;
  31. }
  32. .s-calTitle>span:hover {
  33. background-color: #08c;
  34. color: #fff;
  35. }
  36. .s-calTitle>p {
  37. line-height: 25px;
  38. margin-bottom: 2px;
  39. }
  40. .s-calTitle,
  41. .s-calMonth {
  42. display: flex;
  43. justify-content: space-between;
  44. margin-bottom: 10px;
  45. }
  46. ul.s-calMonth>li {
  47. cursor: pointer;
  48. padding: 5px;
  49. border-radius: 3px;
  50. }
  51. ul.s-calMonth>li:hover{
  52. background-color: #EBF4FB;
  53. }
  54. ul.s-calMonth>li.onFocus {
  55. background-color: #08c;
  56. color: #fff;
  57. }
  58. ul.s-calMonth>li.disabled {
  59. cursor: not-allowed;
  60. pointer-events: none;
  61. opacity: 0.6;
  62. }
  63. .s-calViewTitle {
  64. text-align: center;
  65. padding-top: 3px;
  66. padding-bottom: 3px;
  67. background-color: #f5f5f5;
  68. border-radius: 3px;
  69. font-weight: bold;
  70. color: #08c;
  71. }

注:css文件的.daterangepicker .drp-buttons,.daterangepicker .drp-selected,div.drp-calendar.left是直接覆盖daterangepicker的css样式,由于引入的框架版本不同可能会产生不同的效果,可能需要对这三个样式酌情修改,但是不影响使用。

扩展代码:

  1. /**
  2. * 基于Date Range Picker的月份选择器扩展
  3. * github:https://github.com/RidingACodeToStray/daterangepicker-monthrangepicker
  4. * @param {起始时间} s
  5. * @param {终止时间} e
  6. * @param {最外层的div对象} classDom
  7. * @param {内层的span对象} idDom
  8. * @param {显示时间格式} sformat
  9. * @param {是否显示日历} showCalendars
  10. * @param {配置默认可选的时间范围} ranges
  11. * @param {是否展示自定义范围} scrl
  12. * @param {是否使用月份选择器} monthRange
  13. */
  14. var datePicker = function(s, e, classDom, idDom, sformat = 'YYYY-MM-DD', showCalendars = true, ranges, scrl = true,monthRange) {
  15. if (!ranges) {
  16. ranges = {
  17. 'Today': [moment(), moment()],
  18. 'Yesterday': [moment().subtract(1, 'days'), moment().subtract(1, 'days')],
  19. 'Last 7 Days': [moment().subtract(6, 'days'), moment()],
  20. 'Last 30 Days': [moment().subtract(29, 'days'), moment()],
  21. 'This Month': [moment().startOf('month'), moment().endOf('month')],
  22. 'Last Month': [moment().subtract(1, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')]
  23. }
  24. }
  25. var start = s || moment();
  26. var end = e || moment();
  27. function cb(start, end) {
  28. classDom.html(start.format(sformat) + " - " + end.format(sformat));
  29. }
  30. idDom.daterangepicker({
  31. locale: {
  32. format: sformat
  33. },
  34. alwaysShowCalendars: showCalendars,
  35. showDropdowns: true,
  36. startDate: start,
  37. showCustomRangeLabel: scrl,
  38. endDate: end,
  39. opens: "right",
  40. ranges: ranges
  41. },
  42. cb
  43. );
  44. cb(start, end);
  45. if(monthRange){
  46. //修改日期选择器
  47. $('div.drp-calendar').empty().html('<div class="s-cal"><div class="s-calTitle"><span class="glyphicon glyphicon-arrow-left s-calLastYear"aria-hidden="true"></span><p>2018</p><span class="glyphicon glyphicon-arrow-right s-calNextYear"aria-hidden="true"></span></div><ul class="s-calMonth"><li data-month="01">Jan</li><li data-month="02">Feb</li><li data-month="03">Mar</li><li data-month="04">Apr</li></ul><ul class="s-calMonth"><li data-month="05">May</li><li data-month="06">Jun</li><li data-month="07">Jul</li><li data-month="08">Aug</li></ul><ul class="s-calMonth"><li data-month="09">Sep</li><li data-month="10">Oct</li><li data-month="11">Nov</li><li data-month="12">Dec</li></ul></div>');
  48. $('div.drp-calendar.left > .s-cal').before('<div class="s-calViewTitle">Start Date</div>');
  49. $('div.drp-calendar.right > .s-cal').before('<div class="s-calViewTitle">End Date</div>');
  50. var timePickerDom = $('.s-timePicker'),
  51. sYearView = $($('.s-calTitle > p')[0]),
  52. eYearView = $($('.s-calTitle > p')[1]),
  53. monthViewLis = $('.s-calMonth > li'),
  54. sMonthViewLis = $($('.s-cal')[0]).find('.s-calMonth > li'),
  55. eMonthViewLis = $($('.s-cal')[1]).find('.s-calMonth > li'),
  56. tabs = $('div.daterangepicker > div.ranges > ul > li'),
  57. lastTab = $('div.daterangepicker > div.ranges > ul > li:last-child');
  58. //缓存日期
  59. var tempSYear,
  60. tempEyear,
  61. tempSMonth,
  62. tempEMonth;
  63. //变换日历视图修改样式
  64. function changeView(isAngle = false){
  65. var currentSYear = sYearView.text();
  66. var currentEYear = eYearView.text();
  67. eMonthViewLis.removeClass('disabled');
  68. if(isAngle){
  69. //年份不一致判断
  70. if(currentSYear > currentEYear){
  71. eMonthViewLis.addClass('disabled');
  72. }
  73. if(currentSYear < currentEYear){
  74. eMonthViewLis.removeClass('disabled');
  75. }
  76. if(currentSYear == tempSYear){
  77. sMonthViewLis.eq(tempSMonth).addClass('onFocus');
  78. }
  79. if(currentEYear == tempEyear){
  80. eMonthViewLis.eq(tempEMonth).addClass('onFocus');
  81. }
  82. }else{
  83. if(tempSMonth > tempEMonth){
  84. //如果选中起始月份较大,则将日期赋值为起始月份
  85. eMonthViewLis.removeClass('onFocus');
  86. eMonthViewLis.eq(tempSMonth).addClass('onFocus');
  87. putRangeDate();
  88. }
  89. eMonthViewLis.each(function(index){
  90. if((index) == Number(tempSMonth)){
  91. return false;
  92. }
  93. $(this).addClass('disabled');
  94. })
  95. }
  96. }
  97. //生成日期
  98. function putRangeDate(){
  99. var sYearDate = $($('.s-cal')[0]).find('.s-calTitle > p').text();
  100. var sMonthDate = $($('.s-cal')[0]).find('.s-calMonth > li.onFocus').data('month');
  101. var eYearDate = $($('.s-cal')[1]).find('.s-calTitle > p').text();
  102. var eMonthDate = $($('.s-cal')[1]).find('.s-calMonth > li.onFocus').data('month');
  103. tempSYear = sYearDate;
  104. tempEyear = eYearDate;
  105. tempSMonth = Number(sMonthDate) - 1;
  106. tempEMonth = Number(eMonthDate) - 1;
  107. timePickerDom.text(sYearDate+'-'+sMonthDate+' - '+eYearDate+'-'+eMonthDate);
  108. changeView();
  109. }
  110. //给View赋值样式
  111. function putDateView(sy,ey,sm,em){
  112. sy && sYearView.text(sy);//赋值起始年份
  113. ey && eYearView.text(ey);//赋值终止年份
  114. sm && sMonthViewLis.eq(sm).addClass('onFocus');//高亮起始月份
  115. em && eMonthViewLis.eq(em).addClass('onFocus'); //高亮终止月份
  116. }
  117. //取日期给View赋值样式
  118. function getRangeDate(){
  119. var datePeriod = timePickerDom.text().split(' - ');
  120. var sDate = datePeriod[0].split('-'); //起始年月
  121. var eDate = datePeriod[1].split('-'); //终止年月
  122. tempSYear = sDate[0];
  123. tempEyear = eDate[0];
  124. tempSMonth = Number(sDate[1]) - 1;
  125. tempEMonth = Number(eDate[1]) - 1;
  126. putDateView(tempSYear,tempEyear,tempSMonth,tempEMonth);
  127. }
  128. getRangeDate();
  129. changeView();
  130. //前一年
  131. $('.s-calLastYear').click(function(e){
  132. var startDateDom = $(e.target).next('p');
  133. startDateDom.text(Number(startDateDom.text()) - 1);
  134. $(this).parents('.s-cal').find('.s-calMonth > li').removeClass('onFocus');
  135. changeView(true);
  136. })
  137. //后一年
  138. $('.s-calNextYear').click(function(e){
  139. var startDateDom = $(e.target).prev('p');
  140. startDateDom.text(Number(startDateDom.text()) + 1);
  141. $(this).parents('.s-cal').find('.s-calMonth > li').removeClass('onFocus');
  142. changeView(true);
  143. })
  144. //选中月份
  145. monthViewLis.click(function(){
  146. tabs.removeClass('active');
  147. lastTab.addClass('active');
  148. //两个if处理使用箭头移动导致都没有选中月份的情况
  149. if(!sMonthViewLis.hasClass('onFocus')){
  150. sMonthViewLis.eq(0).addClass('onFocus');
  151. }
  152. if(!eMonthViewLis.hasClass('onFocus')){
  153. eMonthViewLis.eq(0).addClass('onFocus');
  154. }
  155. $(this).parents('.s-cal').find('.s-calMonth > li').removeClass('onFocus');
  156. $(this).addClass('onFocus');
  157. putRangeDate();
  158. })
  159. }
  160. };

如何使用:

  1. <div id="s-timeRange" class="pull-right s-timeRange">
  2. <i class="glyphicon glyphicon-calendar fa fa-calendar"></i> 
  3. <span class="s-timePicker"></span> <b class="caret"></b>
  4. </div>
  5. <script>
  6. $(function() {
  7. var timeRangeDom = $('#s-timeRange'),
  8. timePickerDom = $('.s-timePicker');
  9. datePickers(
  10. moment().subtract(1, 'month').startOf('month'),
  11. moment().subtract(1, 'month').endOf('month'),
  12. timePickerDom,
  13. timeRangeDom,
  14. 'YYYY-MM',
  15. true,
  16. {
  17. 'This Month': [moment().startOf('month'), moment().endOf('month')],
  18. 'Last Month': [moment().subtract(1, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')],
  19. 'Last Three Months':[moment().subtract(3, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')],
  20. 'Last Year':[moment().subtract(12, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')]
  21. },
  22. true,
  23. true
  24. );
  25. });
  26. </script>

展现出的效果(结合bootstrap使用的项目截图):


从以上代码可以看出,这种扩展实际上是将调用daterangepicker插件功能的方法封装在一个自定义方法datePickers中,其他方法提供了各种自定义选择器模块的方法,另外该方法也提供了一个参数monthRange,若传入为false,则默认调用为时间日期选择器,如何选择参数可以根据daterangepicker官方提供的文档来配置,如果传入monthRange为true,则将当前选择器设置为月范围选择器。

二.参数说明

参数说明:

s:默认展示起始时间,静态可以自定义字符串格式,动态的可以调用moment()方法生成;

e:默认展示结束时间,静态可以自定义字符串格式,动态的可以调用moment()方法生成;

classDom:选择最外层div的jquery对象;

idDom:选择的内层的span的jquery对象;

sformat:展示时间格式,请参见Date Range Picker文档;

showCalendars:是否默认显示日历,即点击日期下拉就展开日历,默认true;

ranges:自定义下拉的日期选项,对象格式,键名为展示内容,键值为数组两个元素,分别表示起始和结束时间,详情参见参见Date Range Picker文档;

scrl:是否展示自定义日期按钮,若需要自定义日期或者使用月份范围选择器功能则需要设置为true;

monthRange:是否使用月份范围选择器功能

三.引入js文件使用

另外也可以将datePicker写到一个js文件中结合相关的css文件单独引入,在调用如何使用部分的js代码引用

  1. <link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/daterangepicker/daterangepicker.css" />
  2. <link rel="stylesheet" href="./daterangepicker.monthpicker.css">
  3. <script type="text/javascript" src="https://cdn.jsdelivr.net/jquery/latest/jquery.min.js"></script>
  4. <script type="text/javascript" src="https://cdn.jsdelivr.net/momentjs/latest/moment.min.js"></script>
  5. <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/daterangepicker/daterangepicker.min.js"></script>
  6. <script src="./daterangepicker.monthpicker.js"></script>

github地址:https://github.com/RidingACodeToStray/daterangepicker-monthrangepicker




声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/306570
推荐阅读
相关标签
  

闽ICP备14008679号