使用原生js實現(xiàn)一個簡單的datePicker組件

javascript.png

這篇文章是我看了慕課網(wǎng)的datePicker組件開發(fā)課程寫的讹堤,其中加了一些自己的思考和總結(jié),具體源碼大家可以參考慕課網(wǎng)相關(guān)代碼宝泵。

1好啰,實現(xiàn)的效果

datepacker.gif

2,基礎(chǔ)知識點

JavaScript Date(日期)對象 實例

  • 返回當日的日期和時間

    var today = new Date();
    
  • 從 Date 對象返回一個月中的某一天 (1 ~ 31)

    today.getDate()
    
  • 從 Date 對象返回一周中的某一天 (0 ~ 6)儿奶;注意:星期天是0

    today.getDay()
    
  • 從 Date 對象以四位數(shù)字返回年份

    today.getFullYear()
    
  • 從 Date 對象返回月份 (0 ~ 11)

    today.getMonth()
    
  • 返回 Date 對象的小時 (0 ~ 23)

    today.getHours()
    
  • 返回 Date 對象的分鐘 (0 ~ 59)框往。

    today.getMinutes()
    
  • 返回 1970 年 1 月 1 日至今的毫秒數(shù)。

    today.getTime()
    
  • 返回某一個日期的Date對象

    // 比如我要拿到5月27號的Date對象
    
    var aDay = new Date('2018-05-27')
    或者
    var aDay = new Date(2018,4,27) // 月份是從0開始的
    

更多可以參考JavaScript Date 對象;
?

3闯捎,頁面結(jié)構(gòu)

這里我們就不細講了椰弊,我們會在第五節(jié)講動態(tài)渲染日歷數(shù)據(jù)。

4瓤鼻,獲取日歷每月顯示的數(shù)據(jù)

首先我們要實現(xiàn)一個函數(shù)秉版,這個函數(shù)的作用就是拿到我們這個 datePicker 需要渲染的數(shù)據(jù)。

我們實現(xiàn)的六行七列的數(shù)據(jù)茬祷,如下圖:

demo4.png

我們首先創(chuàng)建一個 data.js 清焕,同時在里面定義一個 getMonthDate 的方法,在 ret 存入我們所要渲染的天數(shù)祭犯。

(function(){
    var datepicker = {};
    
    datepicker.getMonthDate = function(year ,month){
        
        var ret = [];

        return {
            days:ret
        };

    }
    
    window.datepicker = datepicker;
})();

這個函數(shù)需要接受的參數(shù)是年份與月份秸妥,如果不傳的話,則默認傳入當前的月份與年份沃粗。

如下:

if(!year&&!month){
    var today =  new  Date(); // 獲取當天日期對象
    year = today.getFullYear(); // 獲取當前年份
    month = today.getMonth() + 1; // 獲取當前月份
}

這里面還有一個比較重要的點就是粥惧,就是我們怎么顯示上一個月的值,以及他們分別是幾號陪每。

demo3.png

這里我們只要獲取到這個月第一天是星期幾就可以了影晓,然后前面的就是相應顯示上個月的值镰吵。

var firstDay = new Date(year ,month-1, 1); // 這個月第一天的Date對象
var firstDayWeekDay = firstDay.getDay(); // 那個這個月第一天具體是星期幾

if(firstDayWeekDay === 0)firstDayWeekDay = 7; // 0的話就是星期天

year = firstDay.getFullYear(); // 拿到當前的年份
month = firstDay.getMonth() + 1; // 拿到當前的月份

我們還需要拿到上個月和這個月的最后一天,便于我們稍后組裝數(shù)據(jù)挂签。我們可以用這個月的第0天得到上個月的最后一天疤祭。

var lastDayofLastMonth = new Date(year,month-1,0); // 上個月的最后一天
var lastDateofLastMonth = lastDayofLastMonth.getDate(); 
// 上個月的具體日期
var preMonthDayCount = firstDayWeekDay-1;  // 上個月在第一行要顯示幾天

var lastDay = new Date(year,month,0); // 這個月的最后一天
var lastData = lastDay.getDate();   // 這個月的最后一天具體日期 

接下去我們就需要去拼裝數(shù)據(jù)了。

遍歷數(shù)據(jù):

數(shù)據(jù)結(jié)構(gòu)的圖我剛剛已經(jīng)發(fā)過了饵婆,我們這邊需要循環(huán)遍歷這六行七列的42個數(shù)據(jù)勺馆,而且每一個數(shù)據(jù)包括

{
    date : 代表我們時當月的第幾天,其實是一個中介侨核,為了計算showDate
    month : 代表我們是第幾個月
    showDate : 代表我們當前天數(shù)是確切的第幾天
}

遍歷的代碼如下:

for (var i = 0;i<6*7;i++){
    var date = i+1-preMonthDayCount; // 賦值date的值草穆,這里上個月的最后一天為0
    var showDate = date; // 賦值showDate,上下月份搓译,下面再做判斷
    var thisMonth = month; // 賦值月份
            
    if (date <= 0){             // 當date < 0時悲柱,則代表是上一個月
        thisMonth = month-1;    // 月份減一
        showDate = lastDateofLastMonth + date;  // 顯示上一個相應是幾號
    } else if (date > lastData){  // 當date大于了這個月最后一天,那么代表下個月
        thisMonth = month+1;    // 月份加一
        showDate = showDate - lastData;         // 顯示下一個月具體幾號
    }
                    
    if(thisMonth === 13) thisMonth = 1; 
    // 當我們月份是13的時候些己,代表下一年豌鸡,月份置為一
    if(thisMonth === 0)thisMonth = 12;
    // 當我們月份是0的時候,代表上一年段标,月份置為一
    ret.push({
        date:date,
        month:thisMonth,
        showDate:showDate
    });                 // 最后塞入到我們的ret中去
}

經(jīng)過以上代碼的處理涯冠,我們便能得到最初圖中所示的數(shù)據(jù)了。

5逼庞,開始動態(tài)渲染數(shù)據(jù)

我們在建一個 datePicker.js 蛇更,我們在這個 js 中做一些頁面渲染的工作。

首先我們要來思考一下我們要做一些什么工作赛糟,一般在下手開始敲代碼之前派任,我們先要想好思路,然后在開始工作璧南。

demo.png

最開始吨瞎,我們肯定要獲取到日歷數(shù)據(jù),然后將數(shù)據(jù)動態(tài)填充到我們準備好的模版里面去穆咐。

然后我們要實現(xiàn)一些事件颤诀,改變月份,然后進行相應的的月份數(shù)據(jù)对湃;點擊相應的天數(shù)崖叫,使日歷組件消失,input框中顯示選擇的天數(shù)拍柒。

這樣我們可以寫一個代碼的大致框架出來:

(function(){
    var datepicker = window.datepicker;

    datepicker.buildUI = function(year ,month){ // 日歷組件的函數(shù)
        var html = datepicker.buildUI(year,month);
        return html;
    };
    
    datepicker.render = function(direction){ // 頁面的render函數(shù)
        var year,month;
        
        var html = datepicker.buildUI(year,month);
        
        $wrapper = document.querySelector('.ui-datePicker-wrapper');

        $wrapper.innerHTML = html;
        
    }
    
    datepicker.init = function(input){ // 頁面的入口函數(shù)
        datepicker.render();        
    }
    
    function format(date){ // 一個工具函數(shù)心傀,將Date對象轉(zhuǎn)化成YYYY-MM-DD的格式
        var ret = '';
        var padding =  function(num){
            if(num <= 9){
                return  '0' + num;
            }else{
                return num;
            }
        }
        ret += date.getFullYear() + '-';
        ret += padding(date.getMonth() + 1) + '-';
        ret += padding(date.getDate()); 
        
        return  ret;
    }

})();

然后我們在 init 函數(shù)中添加一些事件函數(shù),如下圖:

demo4.png

接下來我們主要看看 buildUI 的函數(shù)實現(xiàn)拆讯,這里其實就是實現(xiàn)一個動態(tài)的html脂男,然后渲染到頁面中而已养叛,就跟我們平時從 Ajax 渲染數(shù)據(jù)一樣。

demo5.png

最后我們看看index.html的文件內(nèi)容怎么樣宰翅,如下圖:

index.png

頁面引入兩個js弃甥,并向外暴露一個變量對象 datepicker ,然后調(diào)用相應的 init 方法汁讼。

6淆攻,總結(jié)

至此我們便完成了一個簡單的用原生js完成的一個最最基礎(chǔ)的日歷組件,其中里面最主要的就是獲取日期數(shù)據(jù)的這個函數(shù)嘿架,實現(xiàn)的思路其實也很常規(guī)瓶珊,其他的關(guān)于渲染的流程,其實我們平時工作中也會經(jīng)常碰到耸彪。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末伞芹,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蝉娜,更是在濱河造成了極大的恐慌丑瞧,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蜀肘,死亡現(xiàn)場離奇詭異,居然都是意外死亡稽屏,警方通過查閱死者的電腦和手機扮宠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來狐榔,“玉大人坛增,你說我怎么就攤上這事”∧澹” “怎么了收捣?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長庵楷。 經(jīng)常有香客問我罢艾,道長,這世上最難降的妖魔是什么尽纽? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任咐蚯,我火速辦了婚禮,結(jié)果婚禮上弄贿,老公的妹妹穿的比我還像新娘春锋。我一直安慰自己,他們只是感情好差凹,可當我...
    茶點故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布期奔。 她就那樣靜靜地躺著侧馅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪呐萌。 梳的紋絲不亂的頭發(fā)上馁痴,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天,我揣著相機與錄音搁胆,去河邊找鬼弥搞。 笑死,一個胖子當著我的面吹牛渠旁,可吹牛的內(nèi)容都是我干的攀例。 我是一名探鬼主播,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼顾腊,長吁一口氣:“原來是場噩夢啊……” “哼粤铭!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起杂靶,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤梆惯,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后吗垮,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體垛吗,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年烁登,在試婚紗的時候發(fā)現(xiàn)自己被綠了怯屉。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡饵沧,死狀恐怖锨络,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情狼牺,我是刑警寧澤羡儿,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站是钥,受9級特大地震影響掠归,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜悄泥,卻給世界環(huán)境...
    茶點故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一拂到、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧码泞,春花似錦兄旬、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽悯森。三九已至,卻和暖如春绪撵,著一層夾襖步出監(jiān)牢的瞬間瓢姻,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工音诈, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留幻碱,地道東北人。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓细溅,卻偏偏與公主長得像褥傍,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子喇聊,可洞房花燭夜當晚...
    茶點故事閱讀 45,507評論 2 359

推薦閱讀更多精彩內(nèi)容