亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

利用原生JavaScript實現造日歷輪子實例代碼

2024-05-06 16:50:37
字體:
來源:轉載
供稿:網友

前言

在日常開發中,大多數都是在和框架打交道,久而久之便遺忘了原生JS的感覺,個人感覺中原生JS基礎還是很重要的,所以最近就利用了空余時間造一個輪子出來,雖然以我的水平造出來的輪子質量還是不太可靠的,但是我覺得用來練練手還是不錯的,哈哈?。?/p>

So, Let's begin!

github:github.com/Zero-jian/p

以下是日歷的樣子,是有點難看,講究講究,重點在于JS部分,嘻嘻?。。?/p>

JavaScript,日歷,代碼

關于日歷組件的實現思路

  • 設置默認參數
  • 檢查節點參數是否傳入,否則拋出錯誤
  • 動態創建顯示本日星期幾的橫軸
  • 動態創建日歷的日子
  • 最后添加一點dom動作就好

先來看看構造函數內容

constructor(options) {    let defaluteOptions = {      element: null, //這是節點      startOfWeek: 1,      strings: {        week: n => {          let map = {            0: '周日',            1: '周一',            2: '周二',            3: '周三',            4: '周四',            5: '周五',            6: '周六',          }          return map[n];        },        templateDay: `<li class="currentMonth">          <span class="dayLabel">            <span class="day"></span>            <span class="unit">日</span>          </span>        </li>`      },      days: {},    }    //賦值默認參數    this.options = Object.assign({}, defaluteOptions, options);    //輪番就調用函數動態創建dom    this.checkOptions()._generateTime()._generateWeekDay()._generateCurrentDay();

初始化創建Calendar類對象的時候設置數值,賦值默認參數以及調用方法來動態創建dom,相信小伙伴們看懂這段代碼沒壓力。

該輪子我全程都是用ES6寫的,畢竟程序員還是要跟上潮流的?。?/p>

賦值參數后開始輪番調用函數,首先調用的是**this.checkOptions()**方法,檢查節點是否存在

checkOptions() {    //如果節點不存在直接拋出錯誤    if (!this.options.element) {      throw new Error('element is request');    }    return this;  }

接下來就是獲取當天的年月日

畢竟是日歷,獲取當前的年月日當參考還是很重要的

_generateTime() {    let data = new Date(); //時間    let year = this.options.days.year = data.getFullYear(); //年份    let month = this.options.days.month = data.getMonth() + 1; //月份    let day = this.options.days.day = data.getDate(); //日子    this.options.days.countDay = 0; //日歷總日子數為7*6=42    this.options.days.noMonth = data.getMonth() + 1; //不變的月份    this.options.days.noYear = data.getFullYear(); //不變的年份    return this;  }

創建星期橫軸

  _generateWeekDay() {    let {      startOfWeek,      strings    } = this.options;    let calendar = document.querySelector('.calendar');    let ol = dom.create(`<ol class="weekdays"></ol>`);    calendar.appendChild(ol);    let weekIndex = this.createArray(7, startOfWeek).map((day, i) => {      let li = dom.create(`<li>${strings.week(i)}</li>`);      //判斷是否為今天      ol.appendChild(li);    });    return this;  }

dom.create是封裝好的方法,傳入模板即可創建并返回回來

this.createArray()也是封裝好的方法,本函數是創建一個長度為7的數組,為什么長度為7?因為周一到周日的長度為7啊,然后開始使用map映射和遍歷來創建節點并添加document.body里面?。?!

唔唔唔,去到這里,星期橫軸就創建好了,接下來是重點部分了,就是創建對于的星期的日子日歷,其實只要掌握邏輯就好了,不過因為我是菜雞,寫的時候也有點掉坑,所以,哈哈,你們對我寫的代碼參考參考就好了??!

接下來是重點了,就是創建日子

創建日歷日子分為三個部分,第一部分是上個月的日子,第二是本月的日子,第三部分是下個月的日子,三個部分所以把它們分別封裝起來,嫑相互影響??!

話不多說,貼上代碼

  //創建當前月份日子  _generateCurrentDay() {    let date = this.options.days;    let calendar = document.querySelector('.calendar');    let ol = dom.create(`<ol class="days"></ol>`);    let getWeek = this._getWeekWeek(date.year, date.month-1, date.day); //星期幾    let getMonth = this._getMonth(date.year, date.month) //月份天數    let getMonthDay = this._getWeekDay(); //幾號    date.countDay = 0;    date.countDay += getMonth;    calendar.appendChild(ol);    //創建當月日子模塊    let dayIndex = this.createArray(42, this.options.startOfWeek).map((day, i) => {      let li = dom.create(this.options.strings.templateDay);      let span = li.querySelector('.dayLabel>.day');      //判斷日歷起止,對本月日子進行賦值      if (i >= getWeek && i <= (getMonth + getWeek)) {        span.textContent = i - getWeek;      }      //判斷是否為今天      if (i == (getMonthDay + getWeek) && date.noMonth == date.month && date.noYear == date.year) {        li.classList.add('today');      }      ol.appendChild(li);    });    document.querySelector('h1.date').appendChild(dom.create(`<p data-role="time">${date.year}-${date.month}-${date.day}</p>`));    this._generatePrevMonth()._generateNextMonth();  }

創建當前月份日子的邏輯就是首先就是創建一個長度為42的數組,因為6*7=42,數組下標為0至42,然后獲取當月的天數以及當月一號時候是星期幾,通過計算獲取本月天數的下標范圍,然后通過循環進行賦值,這樣就創建了日歷本月的天數

然后是創建上個月的天數

按照慣例,貼上代碼

_generatePrevMonth() {    let date = this.options.days;    let year = date.year;    let month = date.month;    let beginWeek = this._getWeekWeek(year,month-1,1);//本月開始星期    let countMonth = this._getMonth(year,month-1);//上月月份天數    let li = document.querySelectorAll('.dayLabel>.day');    beginWeek == 0 ? beginWeek+= 7 : ''; //如果月份開頭為星期日,會出bug,這是防止    date.countDay += beginWeek;    this.createArray(beginWeek,this.options.startOfWeek).map((day,i)=>{      if(i<beginWeek) {        //上月總天數-本月開始星期幾+1+i        li[i].textContent = countMonth - beginWeek + 1 + i;      }    });     return this;  }

創建上月的日子,首先獲取本月一號是星期幾,比如是星期三就可以知道前面空的數字分別為星期日、星期一和星期二,上月的天數能占三個位置,所以就創建一個長度為3的數組,然后計算上月的天數,然后通過邏輯判斷進行賦值,就是如此~~~

最后就是下一個月的天數

代碼 代碼 代碼

//創建下個月日子_generateNextMonth() {    let date = this.options.days;    let year = date.year;    let month = date.month;    let beginWeek = this._getWeekWeek(year,month,1);//開始星期    let countMonth = this._getMonth(year,month+1);//下月月份天數    let li = document.querySelectorAll('.dayLabel>.day');    //data.countDay統計了上月和本月的日子數總量,直接減去即可    this.createArray(42-date.countDay , this.options.startOfWeek).map((day,i)=>{      li[date.countDay+i].textContent = i+1;    });  }

這個邏輯比較簡單,就是用(6*7=42)42減去上月天數和本月天數,剩下的位置為顯示下個月的天數,所以就是這樣子!??!

把封裝好的代碼也弄出來吧~~

//dom.create()調用let dom = {  create(html) {    let template = document.createElement('template');    template.innerHTML = html;    return template.content.firstChild;  }}
  //this.createArray()調用  //創建數組節點  createArray(length, fill) {    let array = Array.apply(null, {      length: length    }).map(() => fill);    return array;  }

動作切換部分

切換日子這里相對來說就是比較簡單,我直接貼代碼,你們一看就懂了

   //上一個月  previousMonth() {    // this.options.days.month -= 1;    this.changeMonth('prev');  }  //下一個月  nextMonth() {    // this.options.days.month += 1;    this.changeMonth('next');  }  //回到今天  resetMonth() {    // this._generateTime();    this.changeMonth('defalut');  }  //封裝月份dom  changeMonth(status) {    let date = this.options.days;    switch(status) {      case 'prev': {        --date.month < 1 ? date.year-- ? date.month = 12 : '' : '';        break;      }      case 'next': {        ++date.month > 12 ? date.year++ ? date.month = 1 : '' : '';        break;      }      case 'defalut': {        this._generateTime();        break;      }    }    //移除節點    this._generateCalendar();    //重新添加節點    this._generateCurrentDay();  }

唔唔唔,整個日歷組件下來大概就是這樣子,整個流程寫下來感覺自己的思維還是有所進步的,但是其實我覺得這個輪子代碼還是可以再封裝封裝和完善的,嘻嘻~~

輪子功能比較簡單,所以剩下的功能就等待小伙伴們自由發揮了~~

好了,第一次寫文章,熬夜寫的,突然就有靈感了,不肯睡覺,呵呵,,明天上班肯定是要打瞌睡了,呵呵~~~

本人是小白,從業將近一年,所以代碼上有什么錯誤,請各位大神能夠指出指出,嗯嗯,完~~

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩中文字幕视频在线观看| 亚洲加勒比久久88色综合| 在线观看视频亚洲| 国产精品高精视频免费| 精品久久久久久久大神国产| 97av在线视频| 亚洲色图15p| 国产精品视频一区二区三区四| 欧美视频在线观看免费| 亚洲精品久久久久国产| 欧美黄色成人网| 亚洲自拍另类欧美丝袜| 亚洲视频在线观看| 日韩av片电影专区| 久久久国产精品亚洲一区| 色综合久综合久久综合久鬼88| 久久精品中文字幕一区| 亚洲男人的天堂在线| 国产日韩精品电影| 在线观看精品国产视频| 欧美国产亚洲精品久久久8v| 欧美激情一区二区三区成人| 91av免费观看91av精品在线| 日韩av一区在线观看| 亚洲新声在线观看| 成人中文字幕+乱码+中文字幕| 欧美成人激情视频免费观看| 欧美国产日韩一区二区在线观看| 日韩一区二区精品视频| 久久国产精品影视| 亚洲精品720p| 中文字幕日韩av电影| 奇米成人av国产一区二区三区| 亚洲欧美国产日韩天堂区| 亚洲精品国产综合区久久久久久久| 亚洲精品视频免费在线观看| 久久69精品久久久久久久电影好| 欧美精品激情blacked18| 国产精品成人一区二区三区吃奶| 国产精品免费福利| 亚洲一区二区国产| 91久久精品国产91久久| 日韩电影中文字幕在线观看| 日韩中文字幕在线视频播放| 欧美国产日韩一区二区三区| 欧美成人免费视频| 久久露脸国产精品| 久久精品视频免费播放| 久久av在线播放| 中文字幕欧美日韩精品| 国产午夜精品久久久| 亚洲国产精品成人一区二区| 91成人性视频| 91免费国产视频| 日韩欧美国产网站| 国内精品国产三级国产在线专| 亚洲精品视频网上网址在线观看| 国产丝袜高跟一区| 国产亚洲一区二区精品| 国产91成人在在线播放| 麻豆国产va免费精品高清在线| 国产精品麻豆va在线播放| 亚洲国产欧美日韩精品| 欧美一级黑人aaaaaaa做受| 久久久久久久av| 亚洲风情亚aⅴ在线发布| www.日韩不卡电影av| 欧美黑人一级爽快片淫片高清| 日韩免费观看视频| 欧美与黑人午夜性猛交久久久| 国产精品www网站| 国产欧美日韩亚洲精品| 欧美精品aaa| 国产欧美精品久久久| 久久精品一区中文字幕| 欧美孕妇毛茸茸xxxx| 亚洲人成五月天| 2019最新中文字幕| 成人a视频在线观看| 亚洲综合色av| 欧美夫妻性生活视频| 色噜噜狠狠狠综合曰曰曰| 日日骚久久av| 亚洲人成毛片在线播放| 亚洲人午夜精品免费| 亚洲最大福利视频| 亚洲精品电影在线| 久久99精品视频一区97| 中日韩美女免费视频网址在线观看| 亚洲а∨天堂久久精品9966| 亚洲最大激情中文字幕| 国产精品福利片| 成人国产精品一区| 日韩欧美在线视频免费观看| 亚洲wwwav| 国产精品成人av在线| 欧美激情a在线| 久久91精品国产91久久久| 成人有码视频在线播放| 精品日韩美女的视频高清| 欧美亚洲成人免费| 日韩精品在线第一页| 国产亚洲精品91在线| 亚洲系列中文字幕| 欧洲美女7788成人免费视频| 中文字幕九色91在线| 日韩**中文字幕毛片| 亚洲免费av片| 久久五月天综合| 国产精品27p| 久久久久女教师免费一区| 视频一区视频二区国产精品| 成人性教育视频在线观看| 久久久精品影院| 欧美另类99xxxxx| 俺去了亚洲欧美日韩| 国产在线不卡精品| 精品视频—区二区三区免费| 91麻豆国产语对白在线观看| 久久91精品国产91久久久| 欧美成年人视频| 国产成人精品视频| 97久久精品视频| 国产精品久久久久久久av大片| 欧美成人午夜激情在线| 欧美一区二三区| 亚洲国产精品一区二区久| 久久久久久12| 深夜福利亚洲导航| 91成人性视频| 欧美中文字幕在线播放| 国产精品扒开腿做爽爽爽男男| 日韩中文字幕国产精品| 91亚洲va在线va天堂va国| 日韩欧美一区二区在线| 国产欧美日韩专区发布| 91香蕉国产在线观看| 欧美成人在线免费| 日韩欧美国产骚| 亚洲第一福利网站| 久久中文字幕国产| 亚洲欧洲在线观看| 精品日韩美女的视频高清| 久久久天堂国产精品女人| 日韩成人免费视频| 欧美午夜视频一区二区| 亚洲欧洲av一区二区| 久久久久久久国产| 国产亚洲精品91在线| 欧洲成人免费aa| 欧美亚洲国产精品| 欧美日韩国产中文精品字幕自在自线| 国产精品一区二区在线| 亚洲精品久久7777777| 高跟丝袜欧美一区| 欧美性资源免费| 色天天综合狠狠色| 国产精品稀缺呦系列在线| 2018中文字幕一区二区三区| 久久成人18免费网站| 精品综合久久久久久97| 国产欧美在线播放| 亚洲精品v欧美精品v日韩精品| 亚洲欧美成人一区二区在线电影|