dateLay.js 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. layui.define(['jquery', 'layer', 'laydate'], function (exports) {
  2. var $ = jQuery = layui.jquery;
  3. var laydate = layui.laydate;
  4. var timeId = 0;
  5. var format = 'yyyy-MM-dd';
  6. $.fn.dateLay = function (o) {
  7. o = $.extend({}, {
  8. timeLabel: ['开始时间', '结束时间'],//时间节点名称
  9. dateSelect: true,//是否显示时间段
  10. dayLabel: ['过去','1', '7', '15', '30', '60'],//可自由选的时间段
  11. istime: true,//是否显示时间
  12. start: {//开始日期
  13. max: '2099-06-16 23:59:59'
  14. , istime: this.istime
  15. , format: format
  16. , istoday: true
  17. , choose: function (datas) {
  18. o.end.min = datas; //开始日选好后,重置结束日的最小日期
  19. o.end.start = datas //将结束日的初始值设定为开始日
  20. }
  21. },
  22. end: {//结束日期
  23. max: '2099-06-16 23:59:59'
  24. , istime: this.istime
  25. , format: format
  26. , istoday: true
  27. , choose: function (datas) {
  28. o.start.max = datas; //结束日选好后,重置开始日的最大日期
  29. }
  30. },
  31. dayDefault: '',
  32. zIndex: 210
  33. }, o);
  34. var global = {
  35. /*创建dom*/
  36. getOptions: function () {
  37. var html = [], listId = 'timeBox' + timeId++, defaultTime = [], pos = this.getPosition();
  38. defaultTime.push(this.inputWrapper.attr('kssj'));
  39. defaultTime.push(this.inputWrapper.attr('jssj'));
  40. html.push('<div class="ui-time-box" id="' + listId + '" style="top:' + pos.top + 'px; left:' + pos.left + 'px;z-index: 99999">');
  41. for (var i = 0; i < o.timeLabel.length; i++) {
  42. html.push('<div class="layui-form-item md7">');
  43. html.push('<label class="layui-form-label w-auto w-padding">' + o.timeLabel[i] + '</label>');
  44. html.push('<div class="layui-input-block mr0">');
  45. html.push('<input class="layui-input" placeholder="' + o.timeLabel[i] + '" id="dp' + i + '" value="' + defaultTime[i] + '">');
  46. html.push('</div>');
  47. html.push('</div>');
  48. }
  49. if (o.dateSelect) {
  50. html.push('<div class="layui-form-item md7">');
  51. html.push('<div class="ui-time-btn layui-clear mt5">');
  52. if (o.dayLabel) {
  53. html.push('<ul class="time-dot fl layui-clear">');
  54. html.push('<li>过去</li>')
  55. for (var i = 1; i < o.dayLabel.length; i++) {
  56. html.push('<li data=' + o.dayLabel[i] + '>' + o.dayLabel[i] + '天</li>')
  57. }
  58. html.push('</ul>');
  59. }
  60. html.push('</div>');
  61. html.push('</div>');
  62. }
  63. html.push('<div class="ui-time-btn clearfix">');
  64. html.push('<span class="layui-btn layui-btn-middle fr" id="timeOk"><label class="ui-button-text">确定</label></span>');
  65. html.push('<span class="layui-btn layui-btn-primary layui-btn-middle fr mr5" id="timeNo"><label class="ui-button-text">清空</label></span>');
  66. html.push('</div>');
  67. html.push('</div>');
  68. // 插入到文档流中
  69. $('body').append(html.join('')).css('zIndex', o.zIndex);
  70. this.timeDot();
  71. },
  72. /*时间点事件*/
  73. timeDot: function () {
  74. var $list = $('.ui-time-box'),
  75. $dp0 = $('#dp0'),
  76. $dp1 = $('#dp1');
  77. o.dayDefault == '' ? $list.find('li').eq(0).addClass('active') : $list.find('li').eq(o.dayDefault).addClass('active');
  78. $list.off().on('click', function (e) {
  79. e.stopPropagation();
  80. })
  81. .on('click.li', '.time-dot li', function (e) {
  82. $(this).addClass('active').siblings().removeClass('active');
  83. $list.find('input[id^=dp]').attr('disabled', 'disabled');
  84. var day = $(this).attr('data'),
  85. str = new Date(),
  86. strYear = str.getFullYear(),
  87. strDay = str.getDate(),
  88. strMonth = str.getMonth() + 1;
  89. strMonth = strMonth < 10 ? "0" + strMonth : strMonth;
  90. strDay = strDay < 10 ? "0" + strDay : strDay;
  91. var today = strYear + '-' + strMonth + '-' + strDay;
  92. if (!day) {
  93. $list.find('input:text').removeAttr('disabled');
  94. } else {
  95. $dp0.val(global.timeControl(day));
  96. $dp1.val(today);
  97. }
  98. e.stopPropagation();
  99. })
  100. .on('click.span', '.layui-btn', function (e) {
  101. if ($(this).is('#timeOk')) {
  102. var valTime = $dp0.val() + '~' + $dp1.val(),
  103. kssj = o.timeOr ? $dp0.val() + ' ' + beginTime : $dp0.val(),
  104. jssj = o.timeOr ? $dp1.val() + ' ' + endTime : $dp1.val();
  105. global.inputWrapper.val(valTime).attr('kssj', kssj).attr('jssj', jssj);
  106. $list.off().remove();
  107. global.inputWrapper.parent().css('zIndex', '');
  108. } else {
  109. global.inputWrapper.val('');
  110. global.inputWrapper.attr('kssj', '');
  111. global.inputWrapper.attr('jssj', '');
  112. global.inputWrapper.click();
  113. }
  114. e.stopPropagation();
  115. });
  116. $dp0.off('click').on('click', function () {
  117. o.start.elem = this;
  118. laydate.render({
  119. elem: '#dp0'
  120. });
  121. })
  122. $dp1.off('click').on('click', function () {
  123. o.end.elem = this;
  124. laydate.render({
  125. elem: '#dp1'
  126. });
  127. })
  128. },
  129. timeControl: function (day) {
  130. var today = new Date(),
  131. beforeMillSeconds = today.getTime() - 1000 * 3600 * 24 * day,
  132. beforeDay = new Date();
  133. beforeDay.setTime(beforeMillSeconds);
  134. var strYear = beforeDay.getFullYear(),
  135. strDay = beforeDay.getDate(),
  136. strMonth = beforeDay.getMonth() + 1;
  137. strMonth = strMonth < 10 ? "0" + strMonth : strMonth;
  138. strDay = strDay < 10 ? "0" + strDay : strDay;
  139. var strYesterDay = strYear + '-' + strMonth + '-' + strDay;
  140. return strYesterDay;
  141. },
  142. getPosition: function () {
  143. var pos = {top: 0, left: 0};
  144. var os = this.inputWrapper.offset(), iptTop = os.top, iptLeft = os.left, iptHeight = this.inputWrapper.height() + 5, w = $(window).width(), h = $(window).height();
  145. // top
  146. if ((iptTop + iptHeight + 206 + 42) < h) {
  147. pos.top = iptTop + iptHeight - 1;
  148. } else {
  149. pos.top = iptTop + 32;
  150. }
  151. // left
  152. if ((iptLeft + 310 + 15) < w) {
  153. pos.left = iptLeft;
  154. } else {
  155. pos.left = w - (310 + 15);
  156. }
  157. return pos;
  158. },
  159. };
  160. return this.each(function () {
  161. if ($(this).is('div.ui-time')) {
  162. global.inputWrapper = $(this).find('.ui-text-text').eq(0);
  163. } else if ($(this).is('.ui-time-text:text')) {
  164. global.inputWrapper = $(this);
  165. }
  166. global.inputWrapper.off('click').on('click', function (e) {
  167. e.stopPropagation();
  168. // 填充选项
  169. if ($('.ui-time-box') != null) {
  170. $('.ui-time-box').off().remove();
  171. global.inputWrapper.parent().css('zIndex', '');
  172. }
  173. global.getOptions();
  174. });
  175. $(document).click(function (e) {
  176. var id = $(e.target).attr('id')
  177. if (id != 'laydate_today' && id != 'laydate_clear' && id != 'laydate_ok') {
  178. $('.ui-time-box').off().remove();
  179. global.inputWrapper.parent().css('zIndex', '');
  180. }
  181. });
  182. });
  183. };
  184. exports('dateLay');
  185. });