【WeUI】日曆控件Calendar動態修改最小日期和最大日期

有這樣一種需求,選擇[開始時間]和[結束時間],接待時間自動設置起始時間和終止時間。 

使用的日曆控件是WeUI官方的Calendar。

<!--出差時間-->
<div class="weui-cell">
    <div class="weui-cell__hd"><label class="weui-label">出差時間</label></div>
    <div class="weui-cell__bd">
        <div class="weui-flex">
            <input id="start_datetime" name="start_datetime" class="weui-input" type="text"
                   placeholder="開始時間" readonly="readonly">
            <span><img src="res/img/right-arrow.png" style="width: 24px;height: 24px"></span>
            <input id="end_datetime" name="end_datetime" class="weui-input" type="text"
                   placeholder="結束時間" style="text-align: right;" readonly="readonly">
        </div>
    </div>
</div>

<!-- 接待時間 -->
<div class="weui-cell">
    <div class="weui-cell__hd"><label for="reception_datetime" class="weui-label">接待時間</label>
    </div>
    <div class="weui-cell__bd">
        <input id="reception_datetime" name="reception_datetime" class="weui-input" type="text"
               placeholder="請選擇接待時間" readonly="readonly">
    </div>
</div>

實現思路如下

點擊接待時間的時候觸發click事件,首先需要驗證開始時間和結束時間是否填寫正確。

如果正確,初始化接待時間的calendar。

當開始時間和結束時間發生變化的時候,需要先銷燬接待時間的calendar,再重新初始化

銷燬的時候需要注意,如果當前沒有calendar初始化的實例,直接銷燬是會報錯的,所以這裏設置了一個標誌來保存當前接待時間calendar的初始化狀態。

let isInitCalener = true; //未初始化

完整代碼

<head></head>

<head>
    <!--控制頁面自動適應屏幕大小-->
    <meta charset="UTF-8" name="viewport"
          content="width=device-width,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no">

    <title>BORN TO LOVE</title>
    <link rel="shortcut icon" href="#">

    <!--JQuery-->
    <script type="text/javascript" charset="UTF-8" src="res/scripts/jquery-3.3.1.min.js"></script>
    <!--JQuery WEUI-->
    <script type="text/javascript" charset="UTF-8" src="res/scripts/jquery-weui.min.js"></script>
    <script type="text/javascript" charset="UTF-8" src="res/scripts/fastclick.js"></script>

    <!--WeUI CSS-->
    <link rel="stylesheet" type="text/css" href="res/css/weui.css">
    <link rel="stylesheet" type="text/css" href="res/css/jquery-weui.css">
    <!--鏈接外部樣式表-->
<%--    <link rel="stylesheet" type="text/css" href="res/css/mystyle_registration.css">--%>

</head>

<body></body>

<!--出差時間-->
<div class="weui-cell">
    <div class="weui-cell__hd"><label class="weui-label">出差時間</label></div>
    <div class="weui-cell__bd">
        <div class="weui-flex">
            <input id="start_datetime" name="start_datetime" class="weui-input" type="text"
                   placeholder="開始時間" readonly="readonly">
            <span><img src="res/img/right-arrow.png" style="width: 24px;height: 24px"></span>
            <input id="end_datetime" name="end_datetime" class="weui-input" type="text"
                   placeholder="結束時間" style="text-align: right;" readonly="readonly">
        </div>
    </div>
</div>
<!-- 接待時間 -->
<div class="weui-cell">
    <div class="weui-cell__hd"><label for="reception_datetime" class="weui-label">接待時間</label>
    </div>
    <div class="weui-cell__bd">
        <input id="reception_datetime" name="reception_datetime" class="weui-input" type="text"
               placeholder="請選擇接待時間" readonly="readonly">
    </div>
</div>

<script></script>

<script type="text/javascript">


   // ---- 格式化日期 yyyy-mm-dd ----
   function formatDate(date) {
       const y = date.getFullYear();
       let m = date.getMonth() + 1;
       m = m < 10 ? '0' + m : m;
       let d = date.getDate();
       d = d < 10 ? ('0' + d) : d;
       return y + '-' + m + '-' + d;
   }

   // -初始化-[開始時間]+[結束時間]
   $("#start_datetime").calendar({
       minDate: ['2019-12-31'],  //設置最小可選日期
       maxDate: [formatDate(new Date())], //設置今天日期爲可選最大日期
       dateFormat: 'yyyy-mm-dd', //設置日期格式
       onChange: function (p, values, displayValues) {
           if (!isInitCalener) { // 已經初始化了 - false-> !-false=ture
               $("#reception_datetime").calendar("destroy");  //每次點擊先銷燬
               isInitCalener = true;  //需要初始化
               console.log("reception_datetime 被銷燬了! isInitCalener = true;");
           }
       }
   });
   $("#end_datetime").calendar({
       minDate: ['2019-12-31'],  //設置最小可選日期
       // maxDate: ['2021','01','01'],
       maxDate: [formatDate(new Date())], //設置今天日期爲可選最大日期
       dateFormat: 'yyyy-mm-dd', //設置日期格式
       onChange: function (p, values, displayValues) {
           if (!isInitCalener) { // 已經初始化了 - false-> !-false=ture
               $("#reception_datetime").calendar("destroy");  //每次點擊先銷燬
               isInitCalener = true;  //需要初始化
               console.log("reception_datetime 被銷燬了! isInitCalener = true;");
           }
       }
   });


   // - 3 - 接待詳情 ---------------------------------
   // 接待日期控件初始化
   let isInitCalener = true; //未初始化
   $("#reception_datetime").click(function () {

       const start = $("#start_datetime").val();
       const end = $("#end_datetime").val();
       if (start === "" || end === "") {
           $.toptip("請輸入開始時間和結束時間!", "warning");
       } else if (start > end) {
           $.toptip("開始時間必須小於結束時間!", "warning");
       }
       // 如果沒有初始化,就初始化一個calendar
       else if (isInitCalener) {
           console.log("------------初始化Calendar--------------")

           const startDate = new Date(start);
           // alert("startDate " + startDate);
           const preDate = new Date(startDate.getTime() - 24 * 60 * 60 * 1000); //前一天
           // alert("preDate: " + preDate);
           const preDate_format = formatDate(preDate);
           // alert("preDate_format: " + preDate_format);


           $("#reception_datetime").calendar({  //重新初始化
               minDate: [preDate_format],  //設置最小可選日期 注意是可選日期的【前一天】
               maxDate: [end],  //設置今天日期爲可選最大日期
               value: [start],  //設置默認選中日期
               dateFormat: 'yyyy-mm-dd' //設置日期格式
           });
           $("#reception_datetime").calendar("open");  //打開彈窗
           isInitCalener = false;
           console.log("reception_datetime 重新建立了! isInitCalener = true;");
       }

   });

</script>

日曆控件初始化的時候,設置minDate是可選日期的前一天。

const curDate = new Date();
const preDate = new Date(curDate.getTime() - 24*60*60*1000); //前一天
const nextDate = new Date(curDate.getTime() + 24*60*60*1000); //後一天

演示效果:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章