you do not need to use history.go(0), unless you are using Netscape. Show your code, let's see what is wrong

解决方案 »

  1.   

    这个应该是你想要的。。
    可惜只兼容IE。<HTML>
    <META NAME="save" CONTENT="history"/><script>/*
    关联XML到1个到N个的Select
    */function AttachXMLForSelect(xd,arr,defaultText,defaultValue)//xd:xmldom,arr:array of select
    {
    function EnsureString(str)
    {
    if(typeof(str)=="string")return str;
    if(str==null)return "";
    try{return str+"";}catch(x){}
    return "";
    }
    function EnsureInt(i)
    {
    if(typeof(i)=="i")return i;
    try{i=parseInt(i);}catch(x){return 0};
    if(isNaN(i))return 0;
    return i;
    }
    defaultText=EnsureString(defaultText);
    defaultValue=EnsureString(defaultValue); //检查参数
    if(xd==null||xd.documentElement==null||arr==null||arr.length==0)
    throw(new Error(-1,"invalid arguments")); //转换成内部的xd
    (function(xmldom){
    xd=new ActiveXObject("Microsoft.XMLDOM");
    xd.loadXML(xmldom.xml);
    })(xd) //把Select释放掉,换成uniqueID来储存
    for(var i=0;i<arr.length;i++)
    arr[i]={
    uniqueID:arr[i].uniqueID
    ,
    node:null //当前关联的XML Node
    ,
    attach:false //当前是否关联到OnSelectChange
    }; //把第一个Select相关的XML node设置为XML的根元素
    arr[0].node=xd.documentElement; //关联第一个Select
    ReAttachNode(0); var Controller={ HandleChange:HandleChange }; return Controller; //响应用户操作
    function OnSelectChange(event)
    {
    HandleChange(event.srcElement);
    }
    //处理Select可能被修改的情况,确认后面的Select正常
    function HandleChange(s)
    {
    //取得Select在arr中的位置
    for(var index=0;index<arr.length;index++)
    {
    if(s.uniqueID==arr[index].uniqueID)
    break;
    } var node=arr[index].node; //记录状态
    if(index!=0)
    node.setAttribute("selectedIndex",s.selectedIndex); //如果不是最后一个Select
    if(index<arr.length-1)
    {
    //关联下一个Select相关的XML node
    if(node)
    {
    var xns=node.selectNodes("item");
    arr[index+1].node=xns.item(s.selectedIndex);
    }
    else arr[index+1].node=null; //关联下一个Select
    /*关联递归处*/
    ReAttachNode(index+1);
    }
    } //关联,重关联一个Select到指定的node
    function ReAttachNode(index)
    {
    //取当前关联的node
    var node=arr[index].node;
    var pnode=null;
    if(index>0)pnode=arr[index].node; //取当前Select
    var s=document.getElementById(arr[index].uniqueID);
    //清楚当前Select的内容
    s.innerHTML=""; //如果有defaultText,那么设置一项
    if((node==null||node.selectNodes("item").length==0)&&defaultText)
    {
    var o=document.createElement("OPTION");
    o.value=defaultValue;
    o.innerText=defaultText;
    s.appendChild(o);
    } //如果关联的node为空,那么取消事件关联
    if(node==null)
    {
    if(arr[index].attach)
    {
    s.detachEvent("onchange",OnSelectChange);
    arr[index].attach=false;
    } /*关联递归处*/
    HandleChange(s);
    return;
    } //如果node不为空 //重新关联事件
    if(arr[index].attach==false)
    {
    s.attachEvent("onchange",OnSelectChange);
    arr[index].attach=true;
    } //把子node的值倒入到Select中
    var xns=node.selectNodes("item");
    for(var i=0;i<xns.length;i++)
    {
    var o=document.createElement("OPTION");
    o.value=EnsureString(xns.item(i).getAttribute("value"));
    o.innerText=EnsureString(xns.item(i).getAttribute("text"));
    s.appendChild(o);
    }

    var si=0;
    if(index!=0)
    si=EnsureInt(node.getAttribute("selectedIndex"));
    if(si==0)si="0";
    if(s.options.length)
    s.selectedIndex=parseInt(si); /*关联递归处*/
    HandleChange(s);
    }
    }</script><BODY><XML id=oxml>
    <item>
    <item text="text1" value="value1">
    <item text="text11" value="value11">
    <item text="text111" value="value111"/>
    <item text="text112" value="value112"/>
    <item text="text113" value="value113"/>
    <item text="text114" value="value114"/>
    </item>
    <item text="text12" value="value12">
    <item text="text121" value="value121"/>
    <item text="text122" value="value122"/>
    <item text="text123" value="value123"/>
    <item text="text124" value="value124"/>
    </item>
    <item text="text13" value="value13">
    <item text="text131" value="value131"/>
    <item text="text132" value="value132"/>
    <item text="text133" value="value133"/>
    <item text="text134" value="value134"/>
    </item>
    <item text="text14" value="value14">
    <item text="text141" value="value141"/>
    <item text="text142" value="value142"/>
    <item text="text143" value="value143"/>
    <item text="text144" value="value144"/>
    </item>
    </item>
    <item text="text2" value="value2">
    <item text="text21" value="value21">
    <item text="text211" value="value211"/>
    <item text="text212" value="value212"/>
    <item text="text213" value="value213"/>
    <item text="text214" value="value214"/>
    </item>
    <item text="text22" value="value22">
    <item text="text221" value="value221"/>
    <item text="text222" value="value222"/>
    <item text="text223" value="value223"/>
    <item text="text224" value="value224"/>
    </item>
    <item text="text23" value="value23">
    <item text="text231" value="value231"/>
    <item text="text232" value="value232"/>
    <item text="text233" value="value233"/>
    <item text="text234" value="value234"/>
    </item>
    <item text="text24" value="value24">
    <item text="text241" value="value241"/>
    <item text="text242" value="value242"/>
    <item text="text243" value="value243"/>
    <item text="text244" value="value244"/>
    </item>
    </item>
    </item>
    </XML>
    <SCRIPT>
    function AlertForm(f)
    {
    alert(
    "s1:\t"+GetSelectOption(f("s1")).innerText + "\t:\t" + GetSelectOption(f("s1")).value + "\r\n"
    +
    "s2:\t"+GetSelectOption(f("s2")).innerText + "\t:\t" + GetSelectOption(f("s2")).value + "\r\n"
    +
    "s3:\t"+GetSelectOption(f("s3")).innerText + "\t:\t" + GetSelectOption(f("s3")).value + "\r\n"
    );
    return event.returnValue=false;
    }
    function GetSelectOption(s)
    {
    return s(s.selectedIndex);
    }
    </SCRIPT>
    <FORM id=f1 onsubmit="AlertForm(this)"
    ><SELECT name="s1" style="width:100px;"></SELECT
    ><SELECT name="s2" style="width:100px;"></SELECT
    ><SELECT name="s3" style="width:100px;"></SELECT
    ><INPUT type="submit">
    </FORM>
    <input type=hidden id=inpSave style="behavior:url(#default#savehistory)" value="0;0;0">
    </BODY><script>
    var C=AttachXMLForSelect(oxml.XMLDocument,[f1("s1"),f1("s2"),f1("s3")]);
    //暴露Controller是因为IE5.0没有提供fireEvent,,555555//下面的代码是储存状态的。
    function window.onload()
    {
    var sis=inpSave.value;
    var arr=sis.split(";");
    f1("s1").selectedIndex=parseInt(arr[0]);
    C.HandleChange(f1("s1"));
    f1("s2").selectedIndex=parseInt(arr[1]);
    C.HandleChange(f1("s2"));
    f1("s3").selectedIndex=parseInt(arr[2]);
    C.HandleChange(f1("s3"));
    }
    function window.onbeforeunload()
    {
    inpSave.value=""+f1("s1").selectedIndex+";"+f1("s2").selectedIndex+";"+f1("s3").selectedIndex;
    }
    </s
      

  2.   

    Lostinet,非常谢谢您提供了这么详细的代码!!
    我是个初学者,我想我需要一段时间来消化你的代码。我现在把我的代码贴出来。
    大家要是有时间的话,试一下就知道毛病在哪了。
    就是第二个和第三个下拉列表都是动态生成的。在选择第二个下拉列表的选项的时候,如果这时用history.go(0)刷新,出现的是页面刚生成的选项,而不是你已选好了的。不刷新好像还不行!唉!!!!!
    <html>
    <head>
    <title>无标题文档</title>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
    <script language="JavaScript">
    <!--
    var dormhigh=0;
    var roomlen=0;
    var dorm_info=new Array();
      var floor_info=new Array();
      var room_info=new Array();
    function add_options(object,temp){
    var i,j;
    var optionObj=new Array();
    //alert(temp);
    for (j=0,i=dormhigh;i<temp;i++,j++){
    optionObj[j] = new Option("", "", 0, 0);
    object.options[i]=optionObj[j];
    object.options[i].value=i+1;
            object.options[i].text=i+1;
    }//end for
    }
    function select_dorm(first_obj,second_obj){
    var i,id,j=0;
    var dorm,temp;
    id=first_obj.selectedIndex;
    dcurid=id;
    temp=floor_info[id];
    var optionObj=new Array();
    //alert(temp);
    if (temp>dormhigh){
    for (j=0,i=dormhigh;i<temp;i++,j++){
    optionObj[j]=new Option(i+1+"层",i+1);
    second_obj.add(optionObj[j]);
    //add_options(second_obj,temp);
    }
    dormhigh=temp;
    }//end if
    else if (temp<dormhigh){
    for (i=dormhigh-1;i>=temp;i--){
    second_obj.options[i]=null;
    }
    history.go(0);
    }//end if
    }
    function select_floor(obj_floor,obj_room)
    {
    var temp;
    var id,i,j;
    var fvalue;
    id=obj_floor.selectedIndex;
    curid=id;
    fvalue=obj_floor.options[id].value;
    temp=room_info[id];
    var optionObj=new Array();
    //alert(temp);
    for (i=1;i<=roomlen;i++)
    {
    if (i<10){
    obj_room.options[i-1].text=fvalue+0+i+"号";
    obj_room.options[i-1].value=fvalue+0+i;
    }
    else{
    obj_room.options[i-1].text=fvalue+0+i+"号";
    obj_room.options[i-1].value=fvalue+0+i;
    }
    }
    if (temp>roomlen){
    for (j=0,i=roomlen+1;i<=temp;i++,j++){

    if (i<10)
    optionObj[j]=new Option(fvalue+0+i+"号",i+1);
    else
    optionObj[j]=new Option(fvalue+i+"号",i+1);
    obj_room.add(optionObj[j]);
    }
    roomlen=temp;
    }//end if
    else if (temp<roomlen){
    for (i=roomlen-1;i>=temp;i--){
    obj_room.options[i]=null;
    }
    history.go(0);
    form1.sel_floor.options[fcurid].selected=true;
    }//end if
    }
    //-->
    </script>
    </head>
    <body bgcolor="#FFFFFF" text="#000000">
    <form name="form1" method="post" action="">
      <p>&nbsp; </p>
       
      <p> 楼号: 
        <select name="sel_dorm" onChange="select_dorm(form1.sel_dorm,form1.sel_floor)">
          <option value="1">1</option>
          <option value="2">2</option>
          <option value="3">3</option>
          <option value="4">4</option>
        </select>
        楼层: 
        <select name="sel_floor" onChange="select_floor(form1.sel_floor,form1.sel_room)">
        </select>
        房间号: 
        <select name="sel_room">
        </select>
      </p>
     <p>
        <input type="hidden" name="hiduser" value="0">
        <input type="submit" name="Submit" value="确定">
      </p>
      <script language="JavaScript">
      var total,i;
      total=4;
      for (i=0;i<total;i++){
      dorm_info[i]=i+1;
      floor_info[i]=i+2;
      room_info[i]=i+7;
      } 
      select_dorm(form1.sel_dorm,form1.sel_floor);
      select_floor(form1.sel_floor,form1.sel_room);
    </script>
    </form>
    </body>
    </html>
      

  3.   

    kuluoluo(库洛洛:optionObj[j] = new Option("", "", 0, 0);这一句为什么这么写Option构造参数是几个??
    optionObj[j] = new Option("", "");
    试试。。
      

  4.   

    不好意思。其实那个函数我没有用!让大家理解错了。其实我的代码应该如下所示:<html>
    <head>
    <title>无标题文档</title>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
    <script language="JavaScript">
    <!--
    var dormhigh=0;
    var roomlen=0;
    var dorm_info=new Array();
      var floor_info=new Array();
      var room_info=new Array();
    function select_dorm(first_obj,second_obj){
    var i,id,j=0;
    var dorm,temp;
    id=first_obj.selectedIndex;
    dcurid=id;
    temp=floor_info[id];
    var optionObj=new Array(); if (temp>dormhigh){
    for (j=0,i=dormhigh;i<temp;i++,j++){
    optionObj[j]=new Option(i+1+"层",i+1);
    second_obj.add(optionObj[j]);

    }
    dormhigh=temp;
    }//end if
    else if (temp<dormhigh){
    for (i=dormhigh-1;i>=temp;i--){
    second_obj.options[i]=null;
    }
    history.go(0);
    }//end if
    }
    function select_floor(obj_floor,obj_room)
    {
    var temp;
    var id,i,j;
    var fvalue;
    id=obj_floor.selectedIndex;
    curid=id;
    fvalue=obj_floor.options[id].value;
    temp=room_info[id];
    var optionObj=new Array();
    for (i=1;i<=roomlen;i++)
    {
       if (i<10){
    obj_room.options[i-1].text=fvalue+0+i+"号";
    obj_room.options[i-1].value=fvalue+0+i;
    }
      else{
    obj_room.options[i-1].text=fvalue+0+i+"号";
    obj_room.options[i-1].value=fvalue+0+i;
          }
      }
    if (temp>roomlen){
      for (j=0,i=roomlen+1;i<=temp;i++,j++){
          if (i<10)
    optionObj[j]=new Option(fvalue+0+i+"号",i+1);
       else
    optionObj[j]=new Option(fvalue+i+"号",i+1);
    obj_room.add(optionObj[j]);
    }
    roomlen=temp;
    }//end if
       else if (temp<roomlen){
       for (i=roomlen-1;i>=temp;i--){
    obj_room.options[i]=null;
    }
    history.go(0);
    form1.sel_floor.options[fcurid].selected=true;
    }//end if
    }
    //-->
    </script>
    </head>
    <body bgcolor="#FFFFFF" text="#000000">
    <form name="form1" method="post" action="">
      <p>&nbsp; </p>
       
      <p> 楼号: 
        <select name="sel_dorm" onChange="select_dorm(form1.sel_dorm,form1.sel_floor)">
          <option value="1">1</option>
          <option value="2">2</option>
          <option value="3">3</option>
          <option value="4">4</option>
        </select>
        楼层: 
        <select name="sel_floor" onChange="select_floor(form1.sel_floor,form1.sel_room)">
        </select>
        房间号: 
        <select name="sel_room">
        </select>
      </p>
     <p>
        <input type="hidden" name="hiduser" value="0">
        <input type="submit" name="Submit" value="确定">
      </p>
      <script language="JavaScript">
      var total,i;
      total=4;
      for (i=0;i<total;i++){
      dorm_info[i]=i+1;
      floor_info[i]=i+2;
      room_info[i]=i+7;
      } 
      select_dorm(form1.sel_dorm,form1.sel_floor);
      select_floor(form1.sel_floor,form1.sel_room);
    </script>
    </form>
    </body>
    </html>