You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

254 lines
8.7 KiB

  1. //蜘蛛日历:
  2. //使用:
  3. /*
  4. <div class="calendar">
  5. <div class="month clearfix fire aonelist"></div>
  6. </div>
  7. */
  8. //注意-startDate须小于chooseDate
  9. //回调共4个参数 年 月 日 以及年-月-日
  10. /*
  11. window.onload = function() {
  12. window.calendar.init({
  13. startDate:'2017-03-10',
  14. chooseDate:'2017-03-18',
  15. showType:window.calendar.init.showTypeEnum.show_price_day,
  16. showPriceDays:{"2017-04-01":"200","2017-04-03":"200"}, //价格日历
  17. showDays:['2017-04-01','2017-04-02'], //显示的日期 配合showType=show_customer
  18. }, function(year,month,day,ymdString) {
  19. console.log(year,month,day,ymdString);
  20. 2017 04 12 2017-04-12
  21. });
  22. }
  23. */
  24. (function($) {
  25. window.calendar = window.calendar || {};
  26. var initData = {}; //startDate:开始日期(必须小于chooseDate) chooseDate:选中日期 show_all_day show_weekday show_weekend
  27. window.calendar.init = function(initData, callBack) {
  28. var sType = initData['showType'] ? initData['showType'] : window.calendar.init.showTypeEnum.show_all;
  29. var show_price_days = initData['showPriceDays'] ? initData['showPriceDays'] : {}; //价格日历
  30. var show_days = initData['showDays'] ? initData['showDays'] : []; //自定义的显示日期
  31. var startDate = initData['startDate'] ? initData['startDate'] : ""; //日期开始的有效日期
  32. var chooseDate = initData['chooseDate'] ? initData['chooseDate'] : ""; //日期的选中日期
  33. var s_d1 = startDate.replace(/\-/g, '');
  34. var s_d2 = chooseDate.replace(/\-/g, '');
  35. if(parseInt(s_d1) > parseInt(s_d2)) {
  36. // initData['startDate'] = chooseDate;
  37. // initData['chooseDate'] = startDate;
  38. initData['chooseDate'] = [initData['startDate'],initData['startDate']=initData['chooseDate']][0];
  39. }
  40. //判断显示6-7 或1-5 - 节假日 的特殊情况
  41. var choose_d = chooseDate;
  42. var d_index = new Date(choose_d).getDay();
  43. if($.inArray(d_index, [0, 6]) && sType == window.calendar.init.showTypeEnum.show_weekend) {
  44. var cha = 6 - d_index;
  45. var c_d = getDatebyDayCount(cha, choose_d);
  46. chooseDate = c_d;
  47. } else if(sType == window.calendar.init.showTypeEnum.show_work_day) {
  48. var c_d = '';
  49. if(d_index == 6) {
  50. c_d = getDatebyDayCount(2, choose_d);
  51. } else if(d_index == 0) {
  52. c_d = getDatebyDayCount(1, choose_d);
  53. } else {
  54. c_d = choose_d;
  55. }
  56. chooseDate = c_d;
  57. }
  58. //end
  59. //当前时间
  60. var tmonth = new Date();
  61. var year = tmonth.getFullYear();
  62. var month = tmonth.getMonth();
  63. var dom = $('.month');
  64. //中间变量 记录
  65. var tttmonth = '';
  66. var tyear = '';
  67. !dom.hasClass("amonth") && dom.addClass("amonth");
  68. //当前日期
  69. var date1 = new Date(year, month);
  70. //当前月份
  71. var tomonth = new Date().getMonth();
  72. //
  73. var today = new Date().getDate();
  74. var dayhtml = [];
  75. var week = ["日", "一", "二", "三", "四", "五", "六"];
  76. for(var t = 0; t < 3; t++) {
  77. dayhtml.push('<div style="clear:both">');
  78. var date = date1;
  79. month = date.getMonth() + t;
  80. if(month >= 12) {
  81. tyear = year + Math.floor(month / 12);
  82. tttmonth = month % 12;
  83. } else {
  84. tyear = year;
  85. tttmonth = month;
  86. }
  87. if(tttmonth == -1) {
  88. tttmonth = 12;
  89. // tyear = year+ Math.floor(month/11)-1;
  90. tyear = year + Math.floor(month / 12);
  91. }
  92. dayhtml.push('<div class="month_title"><span class="current_month">' + (tttmonth + 1) + '月' + '</span><span class="current_year">' + tyear + '</span></div>')
  93. var str = '';
  94. $.each(week, function(i, v) {
  95. str += '<div class="aweek ub-f1 tx-c ui_p_t15 ui_p_b15">' + week[i] + '</div>';
  96. });
  97. dayhtml.push('<div class="ub" style="margin-left:0.2rem;margin-right:0.2rem;">' + str + '</div>')
  98. var nextdate = new Date(year, month)
  99. var firstweek = nextdate.getDay();
  100. var allday = new Date(parseInt(year), (parseInt(month) + 1), 0).getDate();
  101. var daystr = '<div style="margin-left:0.2rem;margin-right:0.2rem;">';
  102. for(var i = 0; i < firstweek; i++) {
  103. daystr += '<div class="aday"></div>'
  104. };
  105. for(i = 1; i <= allday; i++) {
  106. var t_m = (tttmonth + 1);
  107. var t_m_str = t_m;
  108. var t_d_str = i;
  109. if(t_m <= 9) {
  110. t_m_str = '0' + t_m;
  111. }
  112. if(i <= 9) {
  113. t_d_str = '0' + i;
  114. }
  115. if(i == today && month == tomonth) {
  116. daystr += '<div data-y=' + tyear + ' data-m=' + t_m_str + ' data-d=' + t_d_str + ' class="aday ableday disday today">今天</div>'
  117. } else if(i < today && month == tomonth) {
  118. daystr += '<div data-y=' + tyear + ' data-m=' + t_m_str + ' data-d=' + t_d_str + ' class="aday disday">' + i + '</div>'
  119. } else {
  120. daystr += '<div data-y=' + tyear + ' data-m=' + t_m_str + ' data-d=' + t_d_str + ' class="aday ableday disday">' + i + '</div>'
  121. }
  122. }
  123. daystr += "</div>";
  124. dayhtml.push(daystr);
  125. dayhtml.push('</div>');
  126. }
  127. dom.html(dayhtml.join(""))
  128. // ableday 的范围是以前的canday 不同之处是ableday是用业遍历的class 而canday是有css让日期有选
  129. //
  130. $('.aday').each(function(index, domE) {
  131. var current_ymd = getCurrentDate();
  132. var canday_ymd = $(this).attr('data-y') + '-' + $(this).attr('data-m') + '-' + $(this).attr('data-d');
  133. var canday_md = $(this).attr('data-m') + '-' + $(this).attr('data-d');
  134. var week_index = new Date(canday_ymd).getDay();
  135. var arr1 = [1, 2, 3, 4, 5];
  136. var arr2 = [0, 6];
  137. if(sType == window.calendar.init.showTypeEnum.show_all && canday_ymd >= current_ymd) { //全部
  138. $(this).removeClass('disday');
  139. $(this).addClass('canday');
  140. } else if(sType == window.calendar.init.showTypeEnum.show_work_day && $.inArray(week_index, arr1) > -1) { //工作日
  141. $(this).removeClass('disday');
  142. $(this).addClass('canday');
  143. } else if(sType == window.calendar.init.showTypeEnum.show_weekend && $.inArray(week_index, arr2) > -1) { //周末
  144. $(this).removeClass('disday');
  145. $(this).addClass('canday');
  146. } else if(sType == window.calendar.init.showTypeEnum.show_price_day) { // 价格日历
  147. if(show_price_days.hasOwnProperty(canday_ymd)){
  148. $(this).removeClass('disday');
  149. $(this).addClass('canday');
  150. // let cstr = `${$(this).html()}<div class="price">${show_price_days[canday_ymd]}起</div>`;
  151. var cstr = $(this).html()+'<div class="price">'+show_price_days[canday_ymd]+'起</div>';
  152. $(this).html(cstr);
  153. }else{
  154. $(this).html($(this).html()+'<div class="hide_price">0起</div>')
  155. }
  156. } else if(sType == window.calendar.init.showTypeEnum.show_customer && $.inArray(canday_ymd, show_days) > -1) { //自定义显示日期
  157. $(this).removeClass('disday');
  158. $(this).addClass('canday');
  159. } else {
  160. }
  161. //默认选择的日期
  162. if(canday_ymd == chooseDate) {
  163. $(this).removeClass('select_day');
  164. $(this).addClass('select_go_day');
  165. $(this).children().removeClass('price');
  166. $(this).children().addClass('select_go_price');
  167. } else {
  168. var d1 = new Date(canday_ymd.replace(/\-/g, "\/"));
  169. var d2 = new Date(startDate.replace(/\-/g, "\/"));
  170. if(d1 < d2) {
  171. $(this).addClass('disday');
  172. $(this).removeClass('canday');
  173. }
  174. }
  175. })
  176. $('.canday').on('click', function() {
  177. $(".canday").removeClass('select_day');
  178. $(this).addClass('select_day');
  179. $('.select_price').addClass('price');
  180. $('.select_price').removeClass('select_price');
  181. $(this).children().removeClass('price');
  182. $(this).children().addClass('select_price');
  183. if(typeof(callBack) == 'function') {
  184. var call_y = $(this).attr('data-y');
  185. var call_m = $(this).attr('data-m');
  186. var call_d = $(this).attr('data-d');
  187. var call_ymd = [call_y, call_m, call_d];
  188. callBack(call_y, call_m, call_d, call_ymd.join('-'));
  189. }
  190. });
  191. }
  192. window.calendar.init.showTypeEnum = {
  193. show_all: "all",
  194. show_work_day: "1-5工作日",
  195. show_weekend: "6-7周末",
  196. show_price_day: "价格日历",
  197. show_customer: "自定义显示日期"
  198. };
  199. //得到当前日期
  200. function getCurrentDate() {
  201. var tNowTime = new Date();
  202. var myYear = ';' + tNowTime.getFullYear() + ';';
  203. var myMonth = ';' + (tNowTime.getMonth() + 1 - 0) + ';';
  204. var myDay = ';' + tNowTime.getDate() + ';';
  205. if(myMonth.length < 4) myMonth = '0' + myMonth;
  206. if(myDay.length < 4) myDay = '0' + myDay;
  207. var cNewTimeStr = myYear + '-' + myMonth + '-' + myDay;
  208. cNewTimeStr = cNewTimeStr.replace(/;/g, "");
  209. return cNewTimeStr;
  210. }
  211. //得到与当前日期相差几天的日期 + -
  212. function getDatebyDayCount(addDayCount, curDate) {
  213. var d = new Date(curDate);
  214. d.setDate(d.getDate() + addDayCount); //获取AddDayCount天后的日期
  215. //格式化
  216. var year = ";" + d.getFullYear() + ";";
  217. var month = ";" + (d.getMonth() + 0 + 1) + ";";
  218. var day = ";" + d.getDate() + ";";
  219. if(year.length < 4) {
  220. year = "0" + year;
  221. }
  222. if(month.length < 4) {
  223. month = "0" + month;
  224. }
  225. if(day.length < 4) {
  226. day = "0" + day;
  227. }
  228. var datestr = year + "-" + month + "-" + day;
  229. datestr = datestr.replace(/;/g, "");
  230. return datestr;
  231. }
  232. })(jQuery)