Day9 : 做個(gè)DatePicker (三) - 事件

點(diǎn)擊input 展開收起日曆的事件

css的部分將日曆設(shè)定為絕對定位、預(yù)設(shè)不顯示並增加一個(gè)class並設(shè)定顯示 (由js控制)。
將日曆設(shè)定為絕對定位、假設(shè)這是一個(gè)之後會被幾個(gè)頁面運(yùn)用的套件,頁面結(jié)構(gòu)有可能會變動,因此在點(diǎn)開日曆前計(jì)算位置。

.ync-datepicker-wrapper{
    width:240px;
    font-size:16px;
    box-shadow: 0px 1px 2px 2px rgba(0,0,0,.3);
    display:none;
    position: absolute; /* 跟著 input */
}
.ync-datepicker-wrapper-show{
    display:block;
}

js

var $input = document.querySelector(input);
        var isOpen = false;
        $input.addEventListener('click',function(){
            if(isOpen){
                $wrapper.classList.remove('ync-datepicker-wrapper-show');
                isOpen = false;
            }else{
                $wrapper.classList.add('ync-datepicker-wrapper-show');
                // 計(jì)算input與日曆的位置
                var left = $input.offsetLeft;
                var top = $input.offsetTop;
                var height =  $input.offsetHeight;
                $wrapper.style.top =  top + height + 2 + 'px';
                $wrapper.style.left = left + 'px';
                isOpen = true;
            }
        }, false);

月份切換

這邊不直接給左右箭頭建立綁定事件是因?yàn)閕nit只調(diào)用一次,左右箭頭被不斷銷毀和重建,綁定事件會無法生效。

$wrapper.addEventListener('click',function(e){
            var $target = e.target; //直接點(diǎn)擊元素
            if(!$target.classList.contains('ync-datepicker-btn'))
                return;
            if($target.classList.contains('ync-datepicker-prev-btn')){
                datepicker.render('prev');
            }else if($target.classList.contains('ync-datepicker-next-btn'))
                datepicker.render('next');
        },false);

選擇日期顯示到input

這邊在html結(jié)構(gòu)加入了 data-date

 html += '<td data-date=" ' + date.date +' ">' + date.showDate + '</td>';

js target拿到選擇的日期

$wrapper.addEventListener('click',function(e){
            var $target = e.target;
            if($target.tagName.toLowerCase() !== 'td') return;
            var date = new Date(monthData.year,monthData.month - 1,$target.dataset.date); //dataset可以取到data開頭的屬性
            $input.value = format(date);
            $wrapper.classList.remove('ync-datepicker-wrapper-show');
            isOpen = false;
        },false);
    };
    //日期格式化
    function format(date){
        ret = '';
        var padding = function(num){
            if(num <= 0){
            return '0' + num;
            }
            return num;
        }
        ret += date.getFullYear() + '/';
        ret += padding(date.getMonth() + 1) + '/';
        ret += padding(date.getDate());
        return ret;
    }

先這樣

一樣放在 這裡

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容