日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

js實(shí)現(xiàn)日歷

瀏覽:201日期:2024-04-13 13:49:54

這周寫自己的項(xiàng)目發(fā)現(xiàn)又用到日歷了,加之自己畢業(yè)之后的第一個工作中遇到的任務(wù)也是需要寫個日歷(組員寫了,我就不用寫了)今天就來好好折騰一下日歷是怎么寫的。

首先,我們看看 windows 的日歷。發(fā)現(xiàn)總共有這么幾個元素。先實(shí)現(xiàn)試試。

1.年份的選擇、月份的選擇2.周一 ~ 周日(周日 ~ 周六)3.日歷格子 6*7 = 42

從數(shù)據(jù)的角度來分析日歷的實(shí)現(xiàn)是比較簡單的1.我們需要顯示一個當(dāng)前時間的結(jié)構(gòu) - new Date()2.我們需要顯示當(dāng)月的信息 - [星期(周一~周日),日期(1-[28,29,30,31])]其中我們只要知道了每個月的 1日 是星期幾,就能很容易地?cái)[放后面的日子(萬事開頭難)。

我們最多需要 6 行來顯示我們的日期,因?yàn)橐谝慌湃绻话驹碌囊惶?6(上個月的) + (1 + 4*7),這樣就五行了,當(dāng)月天數(shù)若大于 29,就顯示不下了 確定了 6 行之后,我們發(fā)現(xiàn)我們可能需要獲取上個月,和下個月多出來的幾天的擺放位置。 不同年份的不同月的 2月份,我們知道它的日期是不同的,所以我們還需要判斷 平年還是閏年。

3.顯示上個月,下個月的切換。我們發(fā)現(xiàn)需要有個函數(shù)來幫我們更新日歷。

分析完之后,讓我們跟著 新增/修改 一些代碼。

<!DOCTYPE html><html lang='en'><head> <meta charset='UTF-8'> <meta name='viewport' content='width=device-width, initial-scale=1.0'> <meta http-equiv='X-UA-Compatible' content='ie=edge'> <title>Document</title><style> .week-item { display: inline-block; width: 80px; height: 40px; line-height: 40px; border: 1px solid sandybrown; text-align: center; } .date-item { display: inline-block; width: 80px; height: 40px; line-height: 40px; border: 1px solid beige; text-align: center; }</style></head><body> <div class='wrapper'> <div class='year-line'> <button class='year-prev'>上一月</button> <button class='year-now'></button> <button id='nowMonth'></button> <button id='nowDate'></button> <button class='year-next'>下一月</button> </div> <div class='week-line'></div> <div class='date-wrap'></div> </div></body><script> // 工具方法 - start // 1.為了獲得每個月的日期有多少,我們需要判斷 平年閏年[四年一閏,百年不閏,四百年再閏] const isLeapYear = (year) => { return (year % 400 === 0) || (year % 100 !== 0 && year % 4 === 0); }; // 2.獲得每個月的日期有多少,注意 month - [0-11] const getMonthCount = (year, month) => { let arr = [ 31, null, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ]; let count = arr[month] || (isLeapYear(year) ? 29 : 28); return Array.from(new Array(count), (item, value) => value + 1); }; // 3.獲得某年某月的 1號 是星期幾,這里要注意的是 JS 的 API-getDay() 是從 [日-六](0-6),返回 number const getWeekday = (year, month) => { let date = new Date(year, month, 1); return date.getDay(); }; // 4.獲得上個月的天數(shù) const getPreMonthCount = (year, month) => { if (month === 0) { return getMonthCount(year - 1, 11); } else { return getMonthCount(year, month - 1); } }; // 5.獲得下個月的天數(shù) const getNextMonthCount = (year, month) => { if (month === 11) { return getMonthCount(year + 1, 0); } else { return getMonthCount(year, month + 1); } }; // 工具方法 - end let weekStr = ’日一二三四五六’; weekArr = weekStr.split(’’).map(item => ’星期’ + item); // 插入星期 dom let weekDomStr = ’’; let oFragWeek = document.createDocumentFragment(); weekArr.forEach(item => { let oSpan = document.createElement(’span’); let oText = document.createTextNode(item); oSpan.appendChild(oText); oSpan.classList.add(’week-item’); oFragWeek.appendChild(oSpan); }); let weekWrap = document.getElementById(’weekLine’); weekWrap.appendChild(oFragWeek); // 這里獲得我們第一次的 數(shù)據(jù) 數(shù)組 const updateCalendar = (year, month, day) => { if (typeof year === ’undefined’ && typeof month === ’undefined’ && typeof day === ’undefined’) { let nowDate = new Date(); year = nowDate.getFullYear(); month = nowDate.getMonth(); day = nowDate.getDate(); } // 更新一下頂部的年月顯示 document.getElementById(’nowYear’).innerHTML = year; document.getElementById(’nowMonth’).innerHTML = month + 1; document.getElementById(’nowDate’).innerHTML = day; // 生成日歷數(shù)據(jù),上個月剩下的的 x 天 + 當(dāng)月的 28(平年的2月)或者29(閏年的2月)或者30或者31天 + 下個月的 y 天 = 42 let res = []; let currentMonth = getMonthCount(year, month); let preMonth = getPreMonthCount(year, month); let nextMonth = getNextMonthCount(year, month); let whereMonday = getWeekday(year, month); if (whereMonday === 0) { whereMonday = 7 } // 感謝網(wǎng)友 luoyiming 的測試(哈哈!謝謝!):這里當(dāng) whereMonday 為 0 的時候會截取上月的所有數(shù)據(jù) let preArr = preMonth.slice(-1 * whereMonday) let nextArr = nextMonth.slice(0, 42 - currentMonth.length - whereMonday); res = [].concat(preArr, currentMonth, nextArr); // 上面經(jīng)過我本人的測試是沒有什么問題,接下來就是更新 dom 的信息的問題 let hadDom = document.getElementsByClassName(’date-item’); if (hadDom && hadDom.length) { let domArr = document.getElementsByClassName(’date-item’); for (let i = 0; i < domArr.length; i++) { domArr[i].innerHTML = res.shift(); } } else { // 如果之前沒有結(jié)構(gòu)的話 let str = ’’; for (let i = 0; i < 6; i++) { str += ’<div class='date-line'>’; for (let j = 0; j < 7; j++) { str += `<span class=’date-item’>${res.shift()}</span>`; if (j === 6) { str += ’</div>’; } } } document.getElementById(’dateWrap’).innerHTML = str; } }; updateCalendar(); // 添加上一月,下一月事件 let oPreButton = document.getElementById(’preMonth’); let oNextButton = document.getElementById(’nextMonth’); oPreButton.addEventListener(’click’, function () { let currentYear = +document.getElementById(’nowYear’).textContent; let currentMonth = +document.getElementById(’nowMonth’).textContent - 1; let currentDate = +document.getElementById(’nowDate’).textContent; if (currentMonth === 0) { updateCalendar(currentYear - 1, 11, currentDate); } else { updateCalendar(currentYear, currentMonth - 1, currentDate); } }); oNextButton.addEventListener(’click’, function () { let currentYear = +document.getElementById(’nowYear’).textContent; let currentMonth = +document.getElementById(’nowMonth’).textContent - 1; let currentDate = +document.getElementById(’nowDate’).textContent; if (currentMonth === 11) { updateCalendar(currentYear + 1, 0, currentDate); } else { updateCalendar(currentYear, currentMonth + 1, currentDate); } });</script></html>

發(fā)現(xiàn)用 dom 直接操作而不是通過 mvvm 框架實(shí)現(xiàn)確實(shí)還是比較蛋疼的,以下是這次實(shí)現(xiàn)的效果。

實(shí)現(xiàn)一個功能的時候,從數(shù)據(jù)的層面分析,有時候會比較容易理解

以上就是js實(shí)現(xiàn)日歷的詳細(xì)內(nèi)容,更多關(guān)于js 日歷的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: JavaScript
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
成人台湾亚洲精品一区二区| 国产日韩1区| 国产精品99一区二区三| 高清一区二区三区| 美女网站视频一区| 午夜国产欧美理论在线播放| 亚洲综合不卡| 欧美私人啪啪vps| 国产色噜噜噜91在线精品| 国产精品第十页| 伊人久久高清| 麻豆亚洲精品| 久久国产人妖系列| 亚洲人成在线网站| 日韩精品一二区| 欧美国产先锋| 免费视频亚洲| 欧美日韩亚洲一区在线观看| 久久久久亚洲精品中文字幕| 91精品啪在线观看国产18 | 国产日韩欧美一区在线| 免费亚洲一区| 国产精品久久久久av电视剧| 免费久久精品视频| 色爱综合网欧美| 综合一区二区三区| 国产一区二区三区国产精品| 狠狠爱成人网| 国产成人精品一区二区免费看京 | 亚洲欧美综合| 国产精品亚洲四区在线观看| 国产美女高潮在线| 亚洲理论在线| 欧美羞羞视频| 日本欧美大码aⅴ在线播放| 成年男女免费视频网站不卡| 日韩中文字幕区一区有砖一区| 久久久免费人体| 在线观看亚洲精品福利片| 精品高清久久| 亚洲精品伊人| 久久在线电影| 欧美aa在线视频| 免费人成精品欧美精品| 欧美国产美女| 日本成人在线不卡视频| 97精品国产| 日本特黄久久久高潮| 99久久精品网站| 国产伦精品一区二区三区视频 | 色一区二区三区| 91精品日本| 国产精品免费看| xxxxx性欧美特大| 国产精品日本一区二区三区在线 | 久久久久久久久久久妇女 | 日韩精品久久理论片| 91精品推荐| 精品国产欧美日韩| 91成人在线精品视频| 午夜在线一区| 亚洲va在线| 正在播放日韩精品| 国产精品九九| 青青草91久久久久久久久| 国产精品毛片| 日韩视频精品在线观看| 亚洲成av在线| 亚洲三级欧美| 久久久国产精品网站| 欧美一区激情| 亚洲精品乱码日韩| 亚洲在线成人| 欧美成人国产| 99精品美女| 99久久久久| 日韩不卡在线| 另类中文字幕国产精品| 亚洲国产欧美日本视频| 国产a亚洲精品| 黄色网一区二区| 欧美xxxx性| 欧美精品二区| 久久99免费视频| 欧美激情久久久久久久久久久| 91嫩草精品| 国产亚洲电影| 久久福利在线| 国产中文字幕一区二区三区| 麻豆成人91精品二区三区| 国产免费av一区二区三区| 日韩av不卡一区二区| 日本精品国产| 国产精品久久久久久av公交车 | 免费久久99精品国产| 丝袜国产日韩另类美女| 丝袜美腿一区二区三区| 久久亚洲精品伦理| 美国三级日本三级久久99| 久久亚洲二区| 日本麻豆一区二区三区视频| 欧美日韩调教| 精品入口麻豆88视频| 波多视频一区| 亚洲一级影院| 蜜臀久久99精品久久一区二区| 尹人成人综合网| 亚洲a级精品| 国产精品免费大片| 国产成人精品一区二区三区免费| 婷婷激情一区| 免费中文字幕日韩欧美| 亚洲深夜福利在线观看| 91欧美极品| 国产精品福利在线观看播放| 久久精品二区三区| 亚洲网址在线观看| 欧美韩一区二区| 999国产精品永久免费视频app| 国产模特精品视频久久久久| 日韩中文字幕视频网| 国产精品jk白丝蜜臀av小说| 动漫av一区| 9色精品在线| 久久国产尿小便嘘嘘| 麻豆理论在线观看| 国产精品社区| 91综合久久爱com| аⅴ资源天堂资源库在线| 99国产精品| 国产精品久久久久久久久久白浆 | 国产精品亚洲综合在线观看| av最新在线| 亚洲一区二区三区四区五区午夜 | 激情视频一区二区三区| 在线精品视频一区| 韩国女主播一区二区三区| 亚洲成人国产| 国产日本亚洲| 美女亚洲一区| 欧美激情三区| 日韩精品一二区| 日韩av有码| 日韩中文字幕视频网| 在线看片国产福利你懂的| 免费日韩av片| 国产精品久久久久久久免费观看| 中文一区二区| 精品少妇av| 亚洲精品看片| 国产传媒av在线| 日本99精品| 久久久久国产| 久久99久久人婷婷精品综合| 亚洲综合精品四区| 国产一区二区三区视频在线| 久久国产福利| 欧洲在线一区| 久久国产精品免费一区二区三区 | 国产亚洲精品美女久久久久久久久久| 91精品一区二区三区综合| 18国产精品| 久久午夜影视| 日本久久成人网| 牛牛精品成人免费视频| 亚洲精品乱码久久久久久蜜桃麻豆 | 色婷婷亚洲mv天堂mv在影片| 在线看片一区| 免费视频一区三区| 国产一区二区久久久久| 亚洲ab电影| 亚洲欧美日韩国产综合精品二区| jizzjizz中国精品麻豆| 国产精品午夜av| 日韩区一区二| 亚洲中字黄色| 欧美精品高清| 麻豆精品蜜桃视频网站| 日本va欧美va精品| 最近国产精品视频| 亚洲在线观看| 亚洲激情偷拍| 国产在线日韩| 亚洲天堂资源| 电影91久久久| 欧美极品中文字幕| 国产日韩欧美一区二区三区在线观看 | 成人台湾亚洲精品一区二区| 欧美日韩午夜| 日韩欧美高清一区二区三区| 蜜臀av在线播放一区二区三区| 久久精品国产大片免费观看| 国产成人精品亚洲线观看 | 伊人久久大香伊蕉在人线观看热v| 国产一区二区中文| 欧美在线观看视频一区| 国产91在线播放精品| 国产精品久久久久久久久免费高清| 日韩精品导航| 日韩精品一页|