问题1:如题,有一个下拉列表,我想在列表值中显示年份(2004-->今年的年份+10)如:2004,值(value)是:年份+年,如:2004年。现在能显示值了,就是不能显示文本,
问题2:我在使用for循环添加时,用:
var year = document.getElementById("Regedit_Year");
 for (var i=2004;i<(today.getFullYear()+10);i++)
    {
      year.options[i].selected = true; //报错,错误信息:'.options[...]'为空或不是对象。
      ......
这是为什么?<html>
<head>
<script type="text/javascript">
 var today = new Date();
function init_Year()
{
 var year = document.getElementById("Regedit_Year");
 for (var i=2004;i<(today.getFullYear()+10);i++)
    {
var varItem = document.createElement("option")
varItem.setAttribute("text",i);
        varItem.setAttribute("value",i+"年");
        year.options.appendChild(varItem);     
     }
     //year.options[today.getFullYear()].selected = true; //报错,错误信息:'.options[...]'为空或不是对象。
}
</script>
</head>
<body onload="init_Year()">
<form id="myform">
<select id="Regedit_Year" name="Year" onChange="eval(alert(this.value))"></select>年
<select id="Regedit_Month" name="Month"></select>月
<select id="Regedit_Day" name="Day"></select>日
</form>
</body>
</html>
需要转换数据类型吗?我将年份转换成int类型的还不对。

解决方案 »

  1.   

    问题1已经解决,解决办法:
    for (var i=2004;i<(today.getFullYear()+10);i++)
        {
         var varItem = document.createElement("option")
     varItem.appendChild(document.createTextNode(i))
             varItem.setAttribute("value",i+"年");
             year.options.appendChild(varItem);     
         }问题2:
    var year = document.getElementById("Regedit_Year"); 
    for (var i=2004;i <(today.getFullYear()+10);i++) 
        { 
          year.options[i].selected = true; //报错,错误信息:'.options[...]'为空或不是对象。 
          ...... 请问问题2该怎么解决,options[]中间的参数有没有要求?
      

  2.   

    options[i] i里面维持的是这个数组的索引,从0开始,楼主你看看你是从哪里开始的,
    一般为一个select添加下拉框,直接var opt = new Option(text,value);
    year.options[i] = opt;
    就可以了
      

  3.   


    <html>
    <head>
    <script type="text/javascript">
    var today = new Date();
    function init_Year(){
     var year = document.getElementById("Regedit_Year");
     for (var i=2004;i<(today.getFullYear()+10);i++)
            year.options.add(new Option(i+"年",i)); 
     year.value=today.getFullYear()
    }
    </script>
    </head>
    <body onload="init_Year()">
    <form id="myform">
    <select id="Regedit_Year" name="Year" onChange="eval(alert(this.value))"></select>年
    <select id="Regedit_Month" name="Month"></select>月
    <select id="Regedit_Day" name="Day"></select>日
    </form>
    </body>
    </html>
      

  4.   


    var today = new Date();
    function init_Year()
    {
     var year = document.getElementById("Regedit_Year");
     for (var i=2004;i<(today.getFullYear()+10);i++)
        {
            year.options.add(new Option(i,i+"年"));     
         }
     //year.options[today.getFullYear()].selected = true;  
    }
    现在还有最后一个问题,我想让页面打开,这个年月日的地方就显示当前的年月日,要是下面这三个能用就最好不过了,不知道怎样才能让他们生效。
    var today = new Date();
    year.options[today.getFullYear()].selected = true;  
    month.options[today.getMonth()+1].selected = true; 
    day.options[today.getDate()].selected = true; 
      

  5.   


    <html><head>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
    <title>动态创建日期下拉框</title>
    <script type="text/javascript">
    var today = new Date();
    function init_Year(){
     var Year = document.getElementById("Regedit_Year");
     for (var i=2004;i<(today.getFullYear()+10);i++)
        Year.options.add(new Option(i+"年",i)); 
     Year.value=today.getFullYear()
    }function init_Month(){
     var  Month= document.getElementById("Regedit_Month");
     for (var i=1;i<13;i++)
         Month.options.add(new Option(i+"月",i)); 
     Month.value=today.getMonth()+1
    }function init_Day(){
     var  Day= document.getElementById("Regedit_Day");
     var caiying2009=new Date(today.getFullYear(),today.getMonth()+1,0).getDate()
     for (var i=1;i<=caiying2009;i++)
         Day.options.add(new Option(i+"日",i)); 
     Day.value=today.getDate()
    }onload=function(){
    init_Year();
    init_Month();
    init_Day()
    }
    </script></head><body>
    <form id="myform">
    <select id="Regedit_Year" name="Year" onChange="eval(alert(this.value))"></select>年
    <select id="Regedit_Month" name="Month"></select>月
    <select id="Regedit_Day" name="Day"></select>日
    </form></body></html>
      

  6.   

    楼上的兄弟,为什么我稍微改了一下就不行了那?
    function init_Year(){
     var Year = document.getElementById("Regedit_Year");
     for (var i=2004;i<(today.getFullYear()+10);i++)
        Year.options.add(new Option(i,i+"年")); 
     Year.value=today.getFullYear()
    }
      

  7.   

    我也写了一个,不过有点麻烦,然后我再把它写成级联的,平年、闰年2月份天数不一样;一三五七八十腊,天数31;二四...<html>
    <head>
    <title>动态创建日期下拉框</title>
    <script type="text/javascript">
     
    var today = new Date();
    function  initer()
    {
     var Year = document.getElementById("thisyear");
     var Month = document.getElementById("thismonth");
     var Day = document.getElementById("thisday");
     Year.text = today.getFullYear();
     Year.value = today.getFullYear()+"年";
     Month.text = today.getMonth()+1;
     Month.value = today.getMonth()+1+"月";
     Day.text = today.getDate();
     Day.value = today.getDate()+"日";
    }
    function init_Year()
    {
     var year = document.getElementById("Regedit_Year");
          year.options.length = 0;
     for (var i=2004;i<(today.getFullYear()+10);i++)
        {
            year.options.add(new Option(i,i+"年"));     
         }
    }function init_Month()
    {
     var month = document.getElementById("Regedit_Month");
          month.options.length = 0;
     for (var i=1;i<=12;i++)
        {
            month.options.add(new Option(i,i+"月"));     
         }
    }function init_Day()
    {
     var day = document.getElementById("Regedit_Day");
         day.options.length = 0;
     for (var i=1;i<=31;i++)
        {
            day.options.add(new Option(i,i+"日"));  
         }

    </script>
    </head>
    <body onload="initer()">
    <form id="myform">
    <select id="Regedit_Year" name="Year"  onFocus="init_Year()"><option id = "thisyear" selected="selected"></option></select>年
    <select id="Regedit_Month" name="Month" onFocus="init_Month()"><option id = "thismonth" selected="selected"></option></select>月
    <select id="Regedit_Day" name="Day"  onFocus="init_Day()"><option id = "thisday" selected="selected"></option></select>日
    </form>
    </body>
    </html>
      

  8.   


    function init_Year(){ 
    var Year = document.getElementById("Regedit_Year"); 
    for (var i=2004;i <(today.getFullYear()+10);i++) 
        Year.options.add(new Option(i,i+"年")); 
    Year.value=today.getFullYear()+"年"

      

  9.   

    不用这么麻烦
    var caiying2009=new Date(today.getFullYear(),today.getMonth()+1,0).getDate()
    会自动计算出当前月份的天数
    你调整系统日期到:2009/2(28天)和2008/2(29天)试试就知道了
      

  10.   


    <html>
    <head>
    <title>动态创建日期下拉框</title>
    <script type="text/javascript">
    /* 定义几个全局变量today、year、month、day */
    var today = new Date();
    //var year = document.getElementById("Regedit_Year"); 
    //var month = document.getElementById("Regedit_Month");
    //var day = document.getElementById("Regedit_Day");
    function init_Year()

      var year = document.getElementById("Regedit_Year"); 
      for (var i=2004;i <(today.getFullYear()+10);i++) 
          year.options.add(new Option(i,i+"年")); 
          year.value = today.getFullYear()+"年" 
    } function init_Month()
    {
      var month = document.getElementById("Regedit_Month");
      for (var i=1;i<=12;i++)
         month.options.add(new Option(i,i+"月"));  
     month.value =  today.getMonth()+1+"月";  
    }function init_Day()
    {
      var year = document.getElementById("Regedit_Year"); 
      var month = document.getElementById("Regedit_Month");
      var day = document.getElementById("Regedit_Day");
      /* 计算你选择的这一年的这一月有多少天 */
      var theDays_of_thisMonth = new Date(parseInt(year.value),parseInt(month.value),0).getDate(); 
      //alert(theDays_of_thisMonths);
      for (var i=1;i<=theDays_of_thisMonth;i++)
          day.options.add(new Option(i,i+"日"));  
      day.value = today.getDate()+"日";
    }
    onload = function()
    {
      init_Year();
      init_Month();
      init_Day()
    }
    </script>
    </head>
    <body>
    <form id="myform">
    <select id="Regedit_Year" name="Year"></select>年
    <select id="Regedit_Month" name="Month" onChange="init_Day()"></select>月
    <select id="Regedit_Day" name="Day"></select>日
    </form>
    </body>
    </html>
    //这是我根据楼上这位大哥说的改的,功能都实现了,就是其中定义的有重复的局部变量,我想给他们3个定义成全局变量,写在最上边没有生效,变量today就生效了,请问这是为什么那?
      

  11.   

    JS是加载即运行的.要这么写.script那里要加defer<script type="text/javascript" defer>不然你document都没出来.你就想拿他的对象就会出错了.
      

  12.   


    <html>
    <head>
    <title>动态创建日期下拉框</title>
    <script type="text/javascript">
    /* 定义几个全局变量today、year、month、day */
    var today = new Date();
    function init_Year()

      for (var i=2004;i <(today.getFullYear()+10);i++) 
          year.options.add(new Option(i,i+"年")); 
          year.value = today.getFullYear()+"年" 
    } function init_Month()
    {
      for (var i=1;i<=12;i++)
         month.options.add(new Option(i,i+"月"));  
         month.value =  today.getMonth()+1+"月";  
    }function init_Day()
    {
      /* 计算你选择的这一年的这一月有多少天 */
      var theDays_of_thisMonth = new Date(parseInt(year.value),parseInt(month.value),0).getDate(); 
      //alert(theDays_of_thisMonths);
      for (var i=1;i<=theDays_of_thisMonth;i++)
          day.options.add(new Option(i,i+"日"));  
          day.value = today.getDate()+"日";
    }var year,month,day;
    onload = function()
    {
    year = document.getElementById("Regedit_Year"); 
    month = document.getElementById("Regedit_Month");
    day = document.getElementById("Regedit_Day");
      init_Year();
      init_Month();
      init_Day()
    }
    </script>
    </head>
    <body>
    <form id="myform">
    <select id="Regedit_Year" name="Year"></select>年
    <select id="Regedit_Month" name="Month" onChange="init_Day()"></select>月
    <select id="Regedit_Day" name="Day"></select>日
    </form>
    </body>
    </html>
      

  13.   

    回LS.
    你留意下他算法里有个重大的BUG.
    每次init_Day都不清就加的...
      

  14.   

    我又鼓捣了一下:<html>
    <head>
    <title>动态创建日期下拉框</title>
    <script type="text/javascript" defer="defer">
    /* 定义几个全局变量today、year、month、day, 先加上defer="defer",如果使用这里定义的全局变量,在IE下可以,在FF下就不行了*/
    //var today = new Date();
    //var year = document.getElementById("Regedit_Year"); 
    //var month = document.getElementById("Regedit_Month");
    //var day = document.getElementById("Regedit_Day");
    function init_Year()

      for (var i=2004;i <(today.getFullYear()+10);i++) 
          year.options.add(new Option(i,i+"年")); 
          year.value = today.getFullYear()+"年" 
    } function init_Month()
    {
      for (var i=1;i<=12;i++)
         month.options.add(new Option(i,i+"月"));  
     month.value =  today.getMonth()+1+"月";  
    }function init_Day()
    {
      /* 清除之前日(期)下拉列表的值 */
      day.options.length = 0;
      /* 计算你选择的这一年对应的这一月有多少天 */
      var theDays_of_thisMonth = new Date(parseInt(year.value),parseInt(month.value),0).getDate(); 
      //alert(theDays_of_thisMonths);
      for (var i=1;i<=theDays_of_thisMonth;i++)
          day.options.add(new Option(i,i+"日"));  
      day.value = today.getDate()+"日";
    }
    var today,year,month,day;
    onload = function()
    {
      today = new Date();
      /* 使用这里定义的全局变量,不用在上面加defer="defer"了。不过这里还有一个疑问,下面定义的这3个全局变量不能直接加var,上面那个today 就可以*/
      year = document.getElementById("Regedit_Year"); 
      month = document.getElementById("Regedit_Month");
      day = document.getElementById("Regedit_Day");
      
      init_Year();
      init_Month();
      init_Day()
    }
    </script>
    </head>
    <body>
    <form id="myform">
    <!-- 防止有些人先选择月,后选择年 -->
    <select id="Regedit_Year" name="Year" onChange="init_Day()"></select>年
    <select id="Regedit_Month" name="Month" onChange="init_Day()"></select>月
    <select id="Regedit_Day" name="Day" onChange="eval(alert(this.value))"></select>日
    </form>
    </body>
    </html>
    帖子到这里,问题基本上已经解决了,鱼已经拿到了,不过还是想学点"渔"技。
    还是那两个地方定义的全局变量,详情看我上面代码中的注释部分。
    谢谢诸位了,我再给帖子加点分,大家接着讨论,分数太少了!
      

  15.   

    var 的意思是在当前作用域定义变量
    所以你在onload var的话.就只能在onload函数域中用了.
    而today则是在文档域中定义的.所以可以说是文档中的全局变量.
    所以today那里可以.后面的不可以.
      

  16.   

    如果加上var 就成为onload = function(){}的私有(局部)变量了
      init_Year()、 init_Month()、  init_Day()中调用公共(全局)变量时,还是“未定义”的
      

  17.   

    (补)
    同样
    如果:
    onload = function()
    {
     var  today = new Date();.....
    也回报错的
      

  18.   

    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
    <title>动态创建日期下拉框_终结版</title>
    <script type="text/javascript">
    function init_Year(){
     for (var i=2004;i<(today.getFullYear()+10);i++)
        Year.options.add(new Option(i,i)); 
     Year.value=today.getFullYear()
    }function init_Month(){
     for (var i=1;i<13;i++)
         Month.options.add(new Option(i,i)); 
     Month.value=today.getMonth()+1
    }function init_Day(){
     Day.options.length = 0;//清除之前日(期)下拉列表的值
     var caiying2009= new Date(parseInt(Year.value),parseInt(Month.value),0).getDate();// 计算该年该月有多少天
     
     for (var i=1;i<=caiying2009;i++)
         Day.options.add(new Option(i,i)); 
     Day.value=today.getDate()
    }var today = new Date(),Year,Month,Day;
    onload=function(){
    //全局变量赋值
     Year = document.getElementById("Regedit_Year");
     Month= document.getElementById("Regedit_Month");
     Day= document.getElementById("Regedit_Day");//初始化三个下拉框(选项)
     init_Year();
     init_Month();
     init_Day()//初始化三个下拉框(事件)
     Year.onchange=init_Day
     Month.onchange=init_Day
     Day.onchange=function(){alert(this.value)}
    }
    </script></head><body>
    <form id="myform">
    <select id="Regedit_Year" name="Year"></select>年
    <select id="Regedit_Month" name="Month"></select>月
    <select id="Regedit_Day" name="Day"></select>日
    </form></body>
    </html>