layui日期范围控件修改

需求:需要日期范围控件支持日周月季年,以及日期偏移,同时周类型具体应支持到选择周几(如周类型日期偏移为3,则只能选择周三)

解决:

/**
   * 初始化日期控件
   * @param id   日期控件id  #id
   * type  日期类型,date week month quarter year
   * offset  偏移量,周类型值为1-7,其它:0为当天,1为明天,-1昨天,以此类推
   */
function initDateInput(id,type,offset){
  layui.use('laydate', function () {
    var laydate = layui.laydate;
    laydate.render({
      elem: id,
      range: '到',
      format:getDateFormat(type),
      value: getDate(type,offset)+' 到 '+getDate(type,offset),
      calendar: true,
      type:type=="week"?"date":(type=="quarter"?"month":type),
      max: 0,
      ready:function(date){
        var dateEle = $(id);
        var laydateEle = $("#layui-laydate"+dateEle.attr("lay-key"));
        if(type == "quarter"){
          if(laydateEle.length>0){
            laydateEle.click(function(){
              renderQuarterDateObj($(this));
            });
          }
          renderQuarterDateObj(laydateEle);
        }else if(type == "week"){
          if(laydateEle.length>0){
            laydateEle.click(function(){
              renderWeekDateObj($(this),parseInt(offset));
            });
          }
          renderWeekDateObj(laydateEle,parseInt(offset));
        }
      },
      change: function(value, date, endDate){
      },
      done:function(value,date,endDate){//控件选择完毕
      },
      btns: ['confirm']
    });
  });
};

//获取type对应的日期格式
function getDateFormat(type){
  var dateFormat = "";
  switch(type){
    case "year":dateFormat = "yyyy年";break;
    case "quarter":dateFormat = "yyyy年第M季度";break;
    case "month":dateFormat = "yyyy年MM月";break;
    case "week":
    case "date":
    default:dateFormat = "yyyy年MM月dd日";break;
  }
  return dateFormat;
};
//获取初始化时当前type下的日期格式展现在日期控件上
function getDate(type,offset){
  var o = offset;
  var now = new Date();
  var date;
  if(type=="week"){
    var nowDay = now.getDay();
    if(offset<=nowDay){
      o = -1*(nowDay-offset);
    }else{
      o = -7+(offset-nowDay);
    }
  }
  date = new Date(now.getTime()+o*24*60*60*1000);
  var dateStr = dateFtt(getDateFormat(type),date);//formatDate(date,type);
  return dateStr;
}

//将日期转为相应日期格式
function dateFtt(fmt,date) {
  if(fmt.indexOf("季度")>-1){
    fmt = fmt.replace(/(第)[\s\S]+(季度)/g,"$1q$2");
  }
  var o = {
    "q+": Math.floor((date.getMonth()+3)/3), //季度//
    "M+" : date.getMonth()+1, //月份
    "d+" : date.getDate(), //日
    "h+" : date.getHours(), //小时
    "m+" : date.getMinutes(), //分
    "s+" : date.getSeconds(), //秒
    "S" : date.getMilliseconds() //毫秒
  };
  if(/(y+)/.test(fmt))
    fmt=fmt.replace(RegExp.$1, (date.getFullYear()+"").substr(4 - RegExp.$1.length));
  for(var k in o)
    if(new RegExp("("+ k +")").test(fmt))
      fmt = fmt.replace(RegExp.$1, (RegExp.$1.length==1) ? (o[k]) : (("00"+ o[k]).substr((""+ o[k]).length)));
  return fmt;
};
//处理日期为当前type下的对应的准确fmt格式日期
function handleDate(fmt,date,type,endFlag){
  var dateTmp = "";
  switch(type){
    case "year": dateTmp = dateFtt(fmt,new Date(date, (endFlag?11:0),(endFlag?31:01)));break;
    case "quarter":
      var month = parseInt(date.substr(4,2))*3-3;
      dateTmp = endFlag?(dateFtt(fmt,new Date(date.substr(0,4), month+3,0))):(dateFtt("yyyyMMdd",new Date(date.substr(0,4), month,1)));break;
    case "month":dateTmp = endFlag?(dateFtt(fmt,new Date(date.substr(0,4), parseInt(date.substr(4,2)),0))):(date+"01");break;
    case "date":
    case "week":dateTmp = dateFtt(fmt,new Date(date.substr(0,4), parseInt(date.substr(4,2))-1,date.substr(6,2)));break;
  }
  return dateTmp;
};
//生成季度的时间控件选择器
function renderQuarterDateObj(that){
  $(that).addClass('layui-quarter');
  var unvalidMonth = -1;//0-11
  var isQuarter = [];//判断当前日期控件是否是季度
  var qDateObj = that.find(".laydate-month-list");
  qDateObj.each(function(i,e){
    var length = $(this).find("li:visible").length;
    $(this).find("li:visible").each(function(index,ele){
      var isDisabled = $(ele).hasClass("laydate-disabled");
      if(isDisabled&&unvalidMonth===-1){
        unvalidMonth = index;
      }
      if((length!==4&&index%3===0)||length===4){
        isQuarter.push(isDisabled?"laydate-disabled":"");
      }
      if(index<4){
        var curVal = ele.innerHTML;
        ele.innerHTML = curVal.replace(/([\s\S]+)月/g,"第$1季度");//"第" + q + "季度";
      }else{
        ele.style.display = "none";
      }
    });
  });
  if(isQuarter&&unvalidMonth<10){
    qDateObj.each(function(i,e){
      $(this).find("li:visible").each(function(index,ele){
        // if(unvalidMonth/3<=index){
        $(ele).addClass(isQuarter[i?index+4:index]);
        // }
      });
    });
  }
}
//生成周度的时间控件选择器
function renderWeekDateObj(that,offset){
  offset = (offset == 7?0:offset);
  var qDateObj = that.find(".layui-laydate-content");
  var start = false;
  var selElem;
  qDateObj.each(function(contentIndex,contentElem){
    layui.each($(contentElem).find('tr'),function(trIndex,trElem){
      layui.each($(trElem).find('td'),function(tdIndex,tdElem){
        var tdTmp = $(tdElem);
        if(tdTmp.hasClass('laydate-day-next')||tdTmp.hasClass('laydate-day-prev')){
          return;
        }
        if(tdTmp.hasClass('layui-this')){
          selElem = tdTmp;
        }
        if(tdIndex != offset){
          tdTmp.addClass('laydate-disabled');
          if((++tdIndex>7?1:tdIndex)==offset){
            tdTmp.addClass('laydate-end');
          }
        }
      });
    });
    if($(contentElem).find('.layui-this').hasClass('laydate-disabled')){
      $(contentElem).find('.layui-this.laydate-disabled').removeClass('layui-this');
    }
  });
};
//获取日期控件当前日期,fmt为返回日期格式,默认为yyyyMMdd格式
var getHandleDate = function(id,type,offset,fmt){
  var fmt = fmt?fmt:"yyyyMMdd";
  var date=$(id).val();
  if(date!=""){
    sdate = date.split(' 到 ')[0];
    edate = date.split(' 到 ')[1];
  }else{
    sdate = getDate(type,offset);
    edate = getDate(type,offset);
  }
  sdate = sdate.replace(/(\d*)[\u4e00-\u9fa5]+/g,"$1");
  edate = edate.replace(/(\d*)[\u4e00-\u9fa5]+/g,"$1");
  sdate = handleDate(fmt,sdate,type);
  edate = handleDate(fmt,edate,type,true);
  return {"sdate":sdate,"edate":edate};
};

使用:

初始化日期控件:
initDateInput('#input','week','2');
获取日期:
var date = getHandleDate("#input",'week','2');
var sdate = date['sdate'];//开始日期
var edate = date['edate'];//结束日期

结果展示:

   

猜你喜欢

转载自blog.csdn.net/guishifoxin/article/details/81876155
今日推荐