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

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

js實現(xiàn)日歷

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

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

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

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

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

我們最多需要 6 行來顯示我們的日期,因為要第一排如果只包含本月的一天 6(上個月的) + (1 + 4*7),這樣就五行了,當月天數(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 天 + 當月的 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 的測試(哈哈!謝謝!):這里當 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 框架實現(xiàn)確實還是比較蛋疼的,以下是這次實現(xiàn)的效果。

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

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

標簽: JavaScript
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产精品中文字幕亚洲欧美| 亚洲一区二区小说| 国产欧美日韩在线观看视频| 国产精品久久久久久久久妇女| 精品一区91| 成人一二三区| 成人日韩在线观看| 国产99久久久国产精品成人免费| 久久精品亚洲欧美日韩精品中文字幕| 99久久夜色精品国产亚洲狼 | 欧美日韩黄网站| 欧美国产日本| 国产精品不卡| 亚洲一级影院| 免费成人在线观看| 国产欧美日韩精品一区二区免费 | 91精品久久久久久久久久不卡| 今天的高清视频免费播放成人| 亚洲欧美日本国产专区一区| 日本综合视频| 精品国产不卡| 欧美丝袜一区| 最新亚洲国产| 精品久久免费| 亚洲欧美伊人| 日韩精品五月天| 久久精品xxxxx| 免费福利视频一区二区三区| 亚洲精品一区二区妖精| 午夜久久黄色| 日本不卡一区二区| 国产色播av在线| 六月天综合网| 麻豆91小视频| 不卡av一区二区| 欧美日韩一区二区高清| 日韩成人亚洲| 日韩精彩视频在线观看| 韩国一区二区三区视频| 欧美理论视频| 国产精品一区二区精品 | 亚洲经典在线| 国产精品一区二区三区av麻| 欧美日韩尤物久久| 日韩av网站在线观看| 日韩大片在线播放| 色综合视频一区二区三区日韩 | 秋霞影院一区二区三区 | 亚洲综合福利| 韩国女主播一区二区三区| 99久久久久| 日本午夜精品一区二区三区电影 | 免费在线视频一区| 久久一区视频| 视频一区欧美日韩| 日韩成人a**站| 亚洲精品欧洲| 欧美精品日日操| 日韩欧美激情| 久久亚洲在线| 老牛国内精品亚洲成av人片 | 国产欧美一区二区三区米奇| 欧美一区二区三区高清视频| 国产精品国码视频| 欧美专区18| 日韩欧美综合| **爰片久久毛片| 亚洲自啪免费| 中文另类视频| 精品丝袜久久| 日韩高清在线不卡| 99在线|亚洲一区二区| 精品久久免费| 日本精品另类| 悠悠资源网久久精品| 国产成人精品免费视| 日韩在线观看一区二区| 亚洲午夜天堂| 老色鬼精品视频在线观看播放| 深夜福利一区| 激情综合网站| 在线人成日本视频| 国产精品亚洲四区在线观看| 热久久国产精品| 久久精品动漫| 激情国产在线| 麻豆中文一区二区| 日本特黄久久久高潮| 美女日韩在线中文字幕| 美女少妇全过程你懂的久久| 天堂√中文最新版在线| 国产香蕉精品| 免费美女久久99| 好吊一区二区三区| 成人精品亚洲| 天堂√8在线中文| 久久99偷拍| 国产一精品一av一免费爽爽| 中文字幕乱码亚洲无线精品一区| 亚洲欧洲一区二区天堂久久| 99精品视频在线| 欧美三级精品| 日韩中文在线电影| 国产精品原创| 成人午夜在线| 激情中国色综合| 国产精品天天看天天狠| 日韩欧美美女在线观看| 最新亚洲国产| 亚洲精品四区| 亚洲免费毛片| 日韩欧美美女在线观看| 婷婷综合福利| 日韩av成人高清| 青青国产精品| 欧美日韩中文| 国产精品草草| 精品中文在线| 欧美xxxx中国| 欧美gv在线| 久久高清精品| 99久久婷婷这里只有精品| 久久国产直播| 蜜臀91精品国产高清在线观看 | 在线视频观看日韩| 激情久久婷婷| 国产农村妇女精品一二区| 亚洲一区中文| 伊人久久大香伊蕉在人线观看热v| 蜜桃91丨九色丨蝌蚪91桃色| 亚洲18在线| 欧美一级网址| 美女国产精品久久久| 国产精品精品| 欧美成人久久| 国产婷婷精品| 中文字幕日韩高清在线| 欧美另类中文字幕| 国产一区二区视频在线看| 日韩视频网站在线观看| 欧美日韩视频一区二区三区| 一区二区91| 国产激情久久| 秋霞影视一区二区三区| 日韩视频免费| 日韩中出av| 久久午夜影院| 国产一区视频在线观看免费| 亚洲色图综合| 国产精品一区二区精品| 风间由美中文字幕在线看视频国产欧美| 成人精品动漫一区二区三区| 久久国产亚洲| 综合激情视频| 美日韩一区二区三区| 视频小说一区二区| 蜜桃久久久久久| 久久99蜜桃| 韩日一区二区三区| 日本91福利区| 日韩在线免费| 综合精品一区| 精品国产欧美日韩一区二区三区| 欧美日韩中文字幕一区二区三区| 亚洲视频国产精品| 美腿丝袜亚洲三区| 欧美jjzz| 国产欧美日韩综合一区在线播放| 首页国产精品| 免费久久精品视频| 久久精品国产免费| 日韩视频一区| 免费在线播放第一区高清av| 亚洲二区三区不卡| 国产精品hd| 99国产精品| 激情久久99| 免费日本视频一区| 高清一区二区三区| 亚洲日产av中文字幕| 久久一区视频| 日韩亚洲国产欧美| 久久精品国产久精国产| 亚洲视频播放| 精品国产一区二| 亚洲综合激情在线| 色爱av综合网| 国产精品视频3p| 亚洲欧美日韩综合国产aⅴ| 电影91久久久| 日本中文字幕一区二区| 视频福利一区| 国产精品天天看天天狠| 日韩午夜黄色| 国产999精品在线观看| 蜜桃传媒麻豆第一区在线观看| 国产91在线播放精品| 日韩精品中文字幕吗一区二区| 久久三级视频| 欧美黄色精品|