具体要求就是:
1、日期表格横向占满页面。
2、每个月的日期列表横向显示在一排,而不是像网上的很多日期控件显示一个方块。
3、要求只有年月日可选,选择年或月后自动更新对应日期(这个每个日期控件都有的)。
4、默认显示当前年月,高亮当前日期,并显示当前的周次(本年第几周)和星期几。
5、选择某个日期后高亮显示当前日期,并自动更新周次和星期显示。
6、提供接口,可以设定特定日期的显示样式。
6、其他就是一些界面展示的问题了。
想着就是一个日期控件,做着也比较简单,不过比较特别是横向的,第一次听说这种需求的!
偶还是第一次写日历类的东西,不过这次的麻烦还是在于周次的计算上和最后提供的设定特定日期的接口实现上,但经过一番分析也很好的解决了。
主要几个总结:
1、使用了闭包,隐藏内部函数及变量,防止变量污染。最后只提供一个对外接口:setDateStyle
2、计算每年二月的天数不是通过判断闰年的办法,而是通过判断是否2月29日存在,如果不存在则为28天。
3、计算周次要先计算当前日期是本年的第几天,同时要考虑本年1月1日是星期几,然后计算即可得出。
4、setDateStyle支持单个日期样式的传入,也支持多个日期样式的设定。对于样式的更新主要采用数组合并字符窜,并采用字符串的indexOf方法匹配并执行样式的设定。
5、CSS/JS/HTML相分离,便于维护。函数模块化便于重用。
var logDateControl=(function(){
var curSelEl; //当前选中的日期
var styleData=[],dataStyle={};
//获取指定id的元素
var $=function(id){return document.getElementById(id)}
//计算指定日期是第几周(默认为当前日期),该计算方法比较严密准确
var calWeek=function(dt){
var calDay=dt||new Date(); //当前要计算的时间
var firstDay=new Date(calDay.getFullYear(),0,1); //本年第一天
//计算当前是本年的第几天,00:00为当天开始
var daysAll=Math.floor((calDay-firstDay)/1000/60/60/24)+1;
//本年第一天星期几
var firstDayWeekday=firstDay.getDay();
//该结果加到第一周的周一,便于后面计算
var diffDay=firstDayWeekday==0?6:firstDayWeekday-1;
daysAll=daysAll+diffDay;
return Math.ceil(daysAll/7); //返回计算结果
}
//计算一个月多少天,年份4位数字,月份1-2位数字(应该是js日期格式如1月传入0),数据非法返回-1
var getDaysLen=function(year,month){
if(!(/^\d{4}$/.test(year)&&/^\d{1,2}$/.test(month))){return -1}
var monthDays=[31,28,31,30,31,30,31,31,30,31,30,31]
//存在2月29日
if(month==1&&new Date(year,1,29).getMonth()==1){monthDays[1]=29}
return monthDays[month]
}
//显示日期列表,传入年、月(按日常月份传入。如二月传入2)、及显示位置
var displayDayList=function(year,month,pos){
var daysList=[];
var cells1=$(pos).rows[0].cells;
var cells2=$(pos).rows[1].cells;
var daysArr=['日','一','二','三','四','五','六'];
//下面的month-1转换为js月份表示
for(var i=1,l=getDaysLen(year,--month)+1;i
cells1[i-1].className="";
if(wd==0||wd==6){cells1[i-1].className="weekEnd";} //为周末添加特殊样式
//_oldCls保存当前日期的默认样式
cells1[i-1].innerText=daysArr[wd];
cells2[i-1].className="unSelectDay";
cells2[i-1].setAttribute("_oldCls","unSelectDay");
cells2[i-1].innerText=i>9?i:"0"+i;
//匹配用户自定义样式
var dtStr=year+"|"+(month+1)+"|"+i;
if((","+styleData.join(',')+",").indexOf(","+dtStr+",")>-1){
cells2[i-1].className="unSelectDay "+dataStyle[dtStr];
cells2[i-1].setAttribute("_oldCls","unSelectDay "+dataStyle[dtStr]);
}
}
//如果是当前月则选中当日
if(new Date().getMonth()==month){
curSelEl=cells2[new Date().getDate()-1];
curSelEl.className="selectDay";
}
for(var j=i-1;j cells1[j].className=cells2[j].className="";
cells1[j].innerHTML=cells2[j].innerHTML=" ";
}
$(pos).onclick=function(){changeInfo()}
}
//根据选择的值进行处理周次和周几的调整,可以直接传入保存日期内容的dom元素,或者函数根据点击位置判断
var changeInfo=function(e){
e=e||event;
var el=e.target||e.srcElement||e; //最后一个e:可能是传入的对象
var day=el.innerText;
if(!/^\d{1,2}$/.test(day)) return; //如果不是日期什么都不做
//恢复之前选中日期的样式
if(curSelEl){curSelEl.className=curSelEl.getAttribute("_oldCls")}
curSelEl=el; //保存当前处理的元素
//更新选中日期的样式
el.className="selectDay";
var dt=new Date($("year").value,$("month").value-1,day);
//更新信息
$("day").value=day; //日期
$("weekday").value=['日','一','二','三','四','五','六'][dt.getDay()]; //星期几
$("week").value=calWeek(dt); //第几周
}
//初始化
window.attachEvent("onload",function(){
var curDate=new Date(),curYear=curDate.getFullYear();
//显示上下十年
for(var i=-10;i $("year").selectedIndex=10; //默认选中当前年份
$("month").selectedIndex=curDate.getMonth(); //当前月份
$("day").value=curDate.getDate(); //当前日期
$("weekday").value=['日','一','二','三','四','五','六'][curDate.getDay()]; //当前星期几
$("week").value=calWeek(); //当前第几周
//改变日期或年份更新日期列表
$("year").onchange=$("month").onchange=function(){displayDayList($("year").value,$("month").value,"daysList")};
//显示当月日期列表,并高亮当天的日期
displayDayList(curDate.getFullYear(),curDate.getMonth()+1,"daysList");
});
//对外设定样式的接口。
//格式:([2007,10,12],"color:#f00") ([[2007,10,20],[2007,11,25]],"color:#00f")
//如果月份小于10不要带0
var setDateStyle=function(dateArr,style){
if(typeof dateArr!="object")return;
if(dateArr instanceof Array){
if(dateArr[0] instanceof Array){
for(var i=0;i
var dataStr=dateArr.join('|');
styleData.push(dataStr);
dataStyle[dataStr]=style;
return;
}
}
//对外接口
return {setDateStyle:setDateStyle}
})();
//测试样式设定
logDateControl.setDateStyle([[2007,12,15],[2007,11,12]],"test");
[Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]

引言我知道你可能会觉得奇怪,JavaScript、C 和浏览器之间到底有什么关系?它们之间看似毫无关联,但实际上,它们在现代网络开发中扮演着非常重要的角色。今天我们就来深入探讨一下这三者之间的紧密联系。通过这篇文章,你将了解到JavaScript如何在浏览器中运行,C 在浏览器引擎中的作用,以及它们如何共同推动网页的渲染和交互。JavaScript与浏览器的关系我们都知道,JavaScript是前端开发的核心语言,它直接在浏览器中运行,让网页变得生动有趣。你是否曾经想过,为什么JavaScr

Node.js擅长于高效I/O,这在很大程度上要归功于流。 流媒体汇总处理数据,避免内存过载 - 大型文件,网络任务和实时应用程序的理想。将流与打字稿的类型安全结合起来创建POWE

Python和JavaScript在性能和效率方面的差异主要体现在:1)Python作为解释型语言,运行速度较慢,但开发效率高,适合快速原型开发;2)JavaScript在浏览器中受限于单线程,但在Node.js中可利用多线程和异步I/O提升性能,两者在实际项目中各有优势。

JavaScript起源于1995年,由布兰登·艾克创造,实现语言为C语言。1.C语言为JavaScript提供了高性能和系统级编程能力。2.JavaScript的内存管理和性能优化依赖于C语言。3.C语言的跨平台特性帮助JavaScript在不同操作系统上高效运行。

JavaScript在浏览器和Node.js环境中运行,依赖JavaScript引擎解析和执行代码。1)解析阶段生成抽象语法树(AST);2)编译阶段将AST转换为字节码或机器码;3)执行阶段执行编译后的代码。

Python和JavaScript的未来趋势包括:1.Python将巩固在科学计算和AI领域的地位,2.JavaScript将推动Web技术发展,3.跨平台开发将成为热门,4.性能优化将是重点。两者都将继续在各自领域扩展应用场景,并在性能上有更多突破。

Python和JavaScript在开发环境上的选择都很重要。1)Python的开发环境包括PyCharm、JupyterNotebook和Anaconda,适合数据科学和快速原型开发。2)JavaScript的开发环境包括Node.js、VSCode和Webpack,适用于前端和后端开发。根据项目需求选择合适的工具可以提高开发效率和项目成功率。

是的,JavaScript的引擎核心是用C语言编写的。1)C语言提供了高效性能和底层控制,适合JavaScript引擎的开发。2)以V8引擎为例,其核心用C 编写,结合了C的效率和面向对象特性。3)JavaScript引擎的工作原理包括解析、编译和执行,C语言在这些过程中发挥关键作用。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

WebStorm Mac版
好用的JavaScript开发工具

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。

mPDF
mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

安全考试浏览器
Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。