• AttachXMLForSelect:XML自动关联多级SELECT菜单代码和例子


    <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   "";  
      }  
      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;  
      }  
      //如果不是最后一个Select  
      if(index<arr.length-1)  
      {  
      var   node=arr[index].node;  
       
      //关联下一个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=xns.item(i).getAttribute("value");  
      o.innerText=xns.item(i).getAttribute("text");  
      s.appendChild(o);  
      }  
       
      //这个。。。可能不需要吧。。。  
      if(s.options.length)  
      s.selectedIndex=0;  
       
      /*关联递归处*/  
      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(  
      GetSelectOption(f("s1")).innerText   +   "\t:\t"   +   GetSelectOption(f("s1")).value   +   "\r\n"  
      +  
      GetSelectOption(f("s2")).innerText   +   "\t:\t"   +   GetSelectOption(f("s2")).value   +   "\r\n"  
      +  
      GetSelectOption(f("s3")).innerText   +   "\t:\t"   +   GetSelectOption(f("s3")).value   +   "\r\n"  
      );  
      return   event.returnValue=false;  
      }  
      function   GetSelectOption(s)  
      {  
      return   s.options(s.selectedIndex);  
      }  
      </SCRIPT>  
      <FORM   id=f1   onsubmit="AlertForm(this)"  
      ><SELECT   name="s1"   style="100px;"></SELECT  
      ><SELECT   name="s2"   style="100px;"></SELECT  
      ><SELECT   name="s3"   style="100px;"></SELECT  
      ><INPUT   type="submit">  
      </FORM>  
      <input   type=hidden   id=inpSave   style="behavior:url(#default#savehistory)"   value="000">  
      </BODY>  
       
      <script>  
      var   C=AttachXMLForSelect(oxml,[f1("s1"),f1("s2"),f1("s3")]);  
       
      //下面的代码是储存状态的。  
      function   window.onload()  
      {  
      var   sis=inpSave.value;  
      f1("s1").selectedIndex=parseInt(sis.charAt(0));  
      C.HandleChange(f1("s1"));  
      f1("s2").selectedIndex=parseInt(sis.charAt(1));  
      C.HandleChange(f1("s2"));  
      f1("s3").selectedIndex=parseInt(sis.charAt(2));  
      C.HandleChange(f1("s3"));  
      }  
      function   window.onbeforeunload()  
      {  
      inpSave.value=""+f1("s1").selectedIndex+f1("s2").selectedIndex+f1("s3").selectedIndex;  
      }  
      </script>  
      </HTML>
  • 相关阅读:
    GDB的Breakpoint, Watchpoint和Catchpoint
    sed初学
    比较两个文本不同的行/比较两个文本相同的行
    sprintf()函数基本用法
    vim不用鼠标复制粘贴
    SQL基础-语法
    SQL基础-简介
    XPath学习笔记
    jQuery选择器
    Ubuntu常用命令
  • 原文地址:https://www.cnblogs.com/winner/p/417257.html
Copyright © 2020-2023  润新知