电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

js實現日歷

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

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

首先,我們看看 windows 的日歷。發現總共有這么幾個元素。先實現試試。

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

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

我們最多需要 6 行來顯示我們的日期,因為要第一排如果只包含本月的一天 6(上個月的) + (1 + 4*7),這樣就五行了,當月天數若大于 29,就顯示不下了 確定了 6 行之后,我們發現我們可能需要獲取上個月,和下個月多出來的幾天的擺放位置。 不同年份的不同月的 2月份,我們知道它的日期是不同的,所以我們還需要判斷 平年還是閏年。

3.顯示上個月,下個月的切換。我們發現需要有個函數來幫我們更新日歷。

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

<!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.獲得上個月的天數 const getPreMonthCount = (year, month) => { if (month === 0) { return getMonthCount(year - 1, 11); } else { return getMonthCount(year, month - 1); } }; // 5.獲得下個月的天數 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); // 這里獲得我們第一次的 數據 數組 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; // 生成日歷數據,上個月剩下的的 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 } // 感謝網友 luoyiming 的測試(哈哈!謝謝!):這里當 whereMonday 為 0 的時候會截取上月的所有數據 let preArr = preMonth.slice(-1 * whereMonday) let nextArr = nextMonth.slice(0, 42 - currentMonth.length - whereMonday); res = [].concat(preArr, currentMonth, nextArr); // 上面經過我本人的測試是沒有什么問題,接下來就是更新 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 { // 如果之前沒有結構的話 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>

發現用 dom 直接操作而不是通過 mvvm 框架實現確實還是比較蛋疼的,以下是這次實現的效果。

實現一個功能的時候,從數據的層面分析,有時候會比較容易理解

以上就是js實現日歷的詳細內容,更多關于js 日歷的資料請關注好吧啦網其它相關文章!

標簽: JavaScript
相關文章:
主站蜘蛛池模板: 长沙中央空调维修,中央空调清洗维保,空气能热水工程,价格,公司就找维小保-湖南维小保环保科技有限公司 | 台湾阳明固态继电器-奥托尼克斯光电传感器-接近开关-温控器-光纤传感器-编码器一级代理商江苏用之宜电气 | 圆形振动筛_圆筛_旋振筛_三次元振动筛-河南新乡德诚生产厂家 | 东莞ERP软件_广州云ERP_中山ERP_台湾工厂erp系统-广东顺景软件科技有限公司 | 低气压试验箱_高低温低气压试验箱_低气压实验箱 |林频试验设备品牌 | 合肥防火门窗/隔断_合肥防火卷帘门厂家_安徽耐火窗_良万消防设备有限公司 | 【孔氏陶粒】建筑回填陶粒-南京/合肥/武汉/郑州/重庆/成都/杭州陶粒厂家 | ISO9001认证咨询_iso9001企业认证代理机构_14001|18001|16949|50430认证-艾世欧认证网 | 断桥铝破碎机_铝合金破碎机_废铁金属破碎机-河南鑫世昌机械制造有限公司 | 光栅尺厂家_数显表维修-苏州泽升精密机械 | 无锡装修装潢公司,口碑好的装饰装修公司-无锡索美装饰设计工程有限公司 | 台式恒温摇床价格_大容量恒温摇床厂家-上海量壹科学仪器有限公司 | 焊接烟尘净化器__焊烟除尘设备_打磨工作台_喷漆废气治理设备 -催化燃烧设备 _天津路博蓝天环保科技有限公司 | 回转炉,外热式回转窑,回转窑炉-淄博圣元窑炉工程有限公司 | 真空乳化机-灌装封尾机-首页-温州精灌 | 刚性-柔性防水套管-橡胶伸缩接头-波纹管补偿器-启腾供水材料有限公司 | 手机存放柜,超市储物柜,电子储物柜,自动寄存柜,行李寄存柜,自动存包柜,条码存包柜-上海天琪实业有限公司 | 宁波普瑞思邻苯二甲酸盐检测仪,ROHS2.0检测设备,ROHS2.0测试仪厂家 | 土壤墒情监测站_土壤墒情监测仪_土壤墒情监测系统_管式土壤墒情站-山东风途物联网 | 厚壁钢管-厚壁无缝钢管-小口径厚壁钢管-大口径厚壁钢管 - 聊城宽达钢管有限公司 | 塑料异型材_PVC异型材_封边条生产厂家_PC灯罩_防撞扶手_医院扶手价格_东莞市怡美塑胶制品有限公司 | 超声波破碎仪-均质乳化机(供应杭州,上海,北京,广州,深圳,成都等地)-上海沪析实业有限公司 | 无硅导热垫片-碳纤维导热垫片-导热相变材料厂家-东莞市盛元新材料科技有限公司 | 伺服电机维修、驱动器维修「安川|三菱|松下」伺服维修公司-深圳华创益 | 上海冠顶工业设备有限公司-隧道炉,烘箱,UV固化机,涂装设备,高温炉,工业机器人生产厂家 | 桥架-槽式电缆桥架-镀锌桥架-托盘式桥架 - 上海亮族电缆桥架制造有限公司 | 北京亦庄厂房出租_经开区产业园招商信息平台 | 济南品牌包装设计公司_济南VI标志设计公司_山东锐尚文化传播 | 耐酸碱泵-自吸耐酸碱泵型号「品牌厂家」立式耐酸碱泵价格-昆山国宝过滤机有限公司首页 | 防爆型气象站_农业气象站_校园气象站_农业四情监测系统「山东万象环境科技有限公司」 | 南京和瑞包装有限公司| 注塑机-压铸机-塑料注塑机-卧式注塑机-高速注塑机-单缸注塑机厂家-广东联升精密智能装备科技有限公司 | 刘秘书_你身边专业的工作范文写作小秘书| 宁夏档案密集柜,智能密集柜,电动手摇密集柜-盛隆柜业宁夏档案密集柜厂家 | 超细|超微气流粉碎机|气流磨|气流分级机|粉体改性机|磨粉机|粉碎设备-山东埃尔派粉体科技 | 三板富 | 专注于新三板的第一垂直服务平台| 昆山PCB加工_SMT贴片_PCB抄板_线路板焊接加工-昆山腾宸电子科技有限公司 | PC构件-PC预制构件-构件设计-建筑预制构件-PC构件厂-锦萧新材料科技(浙江)股份有限公司 | 衬四氟_衬氟储罐_四氟储罐-无锡市氟瑞特防腐科技有限公司 | 海鲜池-专注海鲜鱼缸、移动海鲜缸、饭店鱼缸设计定做-日晟水族厂家 | 专业生产动态配料系统_饲料配料系统_化肥配料系统等配料系统-郑州鑫晟重工机械有限公司 |