老师,用删除实现日期联动的条件判断太多了,有什么更好的办法吗?

来源:7-9 JS对表单元素进行设置5

weixin_慕虎5578550

2019-05-06 18:39:08

function ymd(){
 var yyyy=document.getElementById("yyyy");
 var mm=document.getElementById("mm");
 var dd=document.getElementById("dd");

 var date=new Date();
 var yy=date.getFullYear();

 initSelect(yyyy,1999,yy);
 initSelect(mm,1,12);
 initSelect(dd,1,31);

 var n=yyyy.length;
 yyyy.selectedIndex=Math.round(n/2);
}
function initSelect(obj,start,end){//删除(可以用下标删除最后一项)必然就涉及到增加,增加又只能在末尾,所以不能反序排列。
                                //如果用dd.options.length=29;改变,dd.options.length=31;后最后几天是空元素占位。
 for(var i=start;i<=end;i++){
  obj.options.add(new Option(i,i));
 }
}
//根据年份/月份变化,删除多余天数
function changeDd(){
    var yyyy=document.getElementById("yyyy");
 var mm=document.getElementById("mm");
 var dd=document.getElementById("dd");
 var y=parseInt(yyyy.value);
 var m=parseInt(mm.value);
 if(m==4||m==6||m==9||m==11){//小月
  if(dd.options.length==31){//判断目前天数,是增加几天,还是删除几天。一、不能用initSelect函数,因为一次会增加很多。
                         //二、必须有条件判断,防止改变事件导致的重复删除日期元素。
   dd.options.remove(30);
  }else if(dd.options.length==29){
   dd.options.add(new Option(30,30));
  }else if(dd.options.length==28){
   dd.options.add(new Option(29,29));//由小到大增加
   dd.options.add(new Option(30,30));
  }
 }else if(m==2){//2月
  if((y % 4==0 && y % 100 !==0)||y % 400 ==0){
   if(dd.options.length==31){
    dd.options.remove(30);//由大到小删除,如果由小到大,则后面元素会顶上,删除下表就不用增加了
    dd.options.remove(29);
   }else  if(dd.options.length==30){
    dd.options.remove(29);
   }else if(dd.options.length==28){
    dd.options.add(new Option(29,29));
   }
  }else{
   if(dd.options.length==31){
    dd.options.remove(30);
    dd.options.remove(29);
    dd.options.remove(28);
   }else  if(dd.options.length==30){
    dd.options.remove(29);
    dd.options.remove(28);
   }else if(dd.options.length==29){
    dd.options.remove(28);
   }
  }
 }else{//大月
  if(dd.options.length==30){
   dd.options.add(new Option(31,31));
  }else if(dd.options.length==29){
   dd.options.add(new Option(30,30));
   dd.options.add(new Option(31,31));
  }else if(dd.options.length==28){
   dd.options.add(new Option(29,29));
   dd.options.add(new Option(30,30));
   dd.options.add(new Option(31,31));
  }
 }
}


写回答

1回答

好帮手慕柯南

2019-05-06

同学你好!如果同学不想添加这么多判断的话,同学可以再写一个方法,里面是删除28,29,30,31,每次无论是什么月份先调用该方法将这4个日期删除,然后判断是大月还是下月,添加相应的日期,如果我的回答解决了你的疑惑,请采纳,祝学习愉快~

0
heixin_慕虎5578550
h 十分感谢!
h019-05-06
共1条回复

0 学习 · 9666 问题

查看课程