用dom解析xml的方法实现省市县三级级联菜单

 

 

用dom解析xml的方法实现省市县三级级联菜单

city.html

city.html
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">   
  2. <html>   
  3.   <head>   
  4.     <title>city.html</title>   
  5.        
  6.     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">   
  7.     <meta http-equiv="description" content="this is my page">   
  8.     <meta http-equiv="content-type" content="text/html; charset=UTF-8">   
  9.        
  10.     <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->   
  11.   
  12.   </head>   
  13.      
  14.   <body>   
  15.     <div>   
  16.             <span> <select id="sheng" style="width: 100px;">   
  17.   
  18.                 </select> </span>   
  19.             <span> <select id="shi" style="width: 100px;">   
  20.                 </select> </span>   
  21.   
  22.             <span> <select id="xian" style="width: 100px;">   
  23.   
  24.                 </select> </span>   
  25.         </div>   
  26.   </body>   
  27. </html>   
  28. <script type="text/javascript">   
  29. <!--   
  30. //获取xmldom对象   
  31. function getXmlDom(){   
  32.     var xmlDom;   
  33.     try{   
  34.         //IE浏览器   
  35.         xmlDom=new ActiveXObject("Microsoft.XMLDOM");   
  36.     }catch(err){   
  37.         try{   
  38.             //firefox其他浏览器   
  39.             xmlDom=document.implementation.createDocument("","",null);   
  40.         }catch(e){   
  41.             alert("您的浏览器不支持xmlHTTPrequest......")   
  42.         }   
  43.     }   
  44.     //关闭异步加载,确保在文档完全加载之前解析器不会继续脚本的执行   
  45.     xmlDom.async=false;   
  46.     //转载xml文件   
  47.     xmlDom.load("city.xml");   
  48.     return xmlDom;   
  49. }   
  50. window.οnlοad=function(){   
  51.     //通过方法获取对象   
  52.     var xmlDom=getXmlDom();   
  53.     //获取xml文件的根节点   
  54.     var root=xmlDom.documentElement;   
  55.     //获取所有的省节点   
  56.     var provinces=root.childNodes;   
  57.     //获取页面中要显示的省的控件都dom对象   
  58.     var sheng=document.getElementById("sheng");   
  59.     //获取页面中要显示的市的控件都dom对象   
  60.     var shi=document.getElementById("shi");   
  61.     //获取页面中要显示的县的控件都dom对象   
  62.     var xian=document.getElementById("xian");   
  63.     //遍历所有的省   
  64.     for(var i=0;i<provinces.length;i++){   
  65.         // 查看该节点是否是元素节点   
  66.         if(provinces[i].nodeType==1){   
  67.             //创建option节点对象   
  68.             var shengopt=document.createElement("option");   
  69.             //为省节点添加文本节点   
  70.             shengopt.appendChild(document.createTextNode(provinces[i].getAttribute("name")));   
  71.             //为省节点添加属性   
  72.             shengopt.setAttribute("value",provinces[i].getAttribute("postcode"));   
  73.             //添加省到页面dom中   
  74.             sheng.appendChild(shengopt);   
  75.         }   
  76.     }   
  77.     //当省节点发生改变时,触发事件   
  78.     sheng.οnchange=function(){   
  79.     //获取省节点中所有的option对象集合   
  80.     var shengs=sheng.options;   
  81.     //获取选中的option对象的节点下标(selectedIndex)   
  82.     var num=shengs.selectedIndex;   
  83.     /*//清空市区  
  84.     shi.length=0;  
  85.     xian.length=0; */  
  86.     //根据选中的省的下标获取它的value值的内容,即xml文件中的postcode对应的值   
  87.     var  ppostcode=shengs[num].getAttribute("value");   
  88.     //遍历所有的省   
  89.     for(var i=0;i<provinces.length;i++){   
  90.         //查看该节点是否是元素节点   
  91.         if(provinces[i].nodeType==1){   
  92.             //获取provinces的postcode属性值   
  93.             var postcode=provinces[i].getAttribute("postcode");   
  94.             alert(postcode);   
  95.                 //如果相同   
  96.                 if(postcode==ppostcode){   
  97.                     //获取选中省下的所有市的节点   
  98.                     var cities=provinces[i].childNodes;   
  99.                     //清空市   
  100.                     shi.length=0;   
  101.                     //遍历省下的所有市   
  102.                     for(var i=0;i<cities.length;i++){   
  103.                         //查看该节点是否是元素节点   
  104.                         if(cities[i].nodeType==1){   
  105.                             //创建option节点对象   
  106.                             var shiopt=document.createElement("option");   
  107.                              //为其添加文本节点   
  108.                             shiopt.appendChild(document.createTextNode(cities[i].getAttribute("name")));   
  109.                             //为其设置value属性   
  110.                             shiopt.setAttribute("value",cities[i].getAttribute("postcode"));   
  111.                             //将option节点添加到市节点上   
  112.                             shi.appendChild(shiopt);   
  113.                         }   
  114.                     }   
  115.                     break;   
  116.                 }   
  117.             }   
  118.         }   
  119.     }   
  120.     //当市节点发生改变时,触发的事件   
  121.     shi.onchange = function(){   
  122.     //获取市节点的所有option对象   
  123.     var shis = shi.options;   
  124.     //获取选中市的下标值   
  125.     var num = shis.selectedIndex;      
  126.     //获取选中市的value值       
  127.     var spostcode = shis[num].getAttribute("value");     
  128.    //遍历所有的省   
  129.      for(var i=0;i<provinces.length;i++){   
  130.         //查看该节点是否是元素节点   
  131.          if(provinces[i].nodeType==1){   
  132.             //获取选中的省下的所有的市的集合   
  133.              var cities = provinces[i].childNodes;   
  134.              //遍历选中的省下的所有的市   
  135.              for(var j=0;j<cities.length;j++){   
  136.                 //查看该节点是否是元素节点   
  137.                  if(cities[j].nodeType==1){   
  138.                     //获取cities的postcode属性值   
  139.                      var postcode = cities[j].getAttribute("postcode");   
  140.                      //如果相同   
  141.                      if(postcode == spostcode){   
  142.                         清空县   
  143.                          xian.length=0;   
  144.                          //获取选中市下的所有县的集合   
  145.                          var areas = cities[j].childNodes;   
  146.                          //遍历这些县   
  147.                          for(var k=0;k<areas.length;k++){   
  148.                             //查看该节点是否是元素节点   
  149.                              if(areas[k].nodeType == 1){   
  150.                                 //创建option节点对象   
  151.                                var xianopt = document.createElement("option");   
  152.                                //为其添加文本节点   
  153.                                xianopt.appendChild(document.createTextNode(areas[k].getAttribute("name")));   
  154.                                //为其设置value属性   
  155.                                xianopt.setAttribute("value",areas[k].getAttribute("postcode"));   
  156.                                //将option节点添加到县节点上   
  157.                                xian.appendChild(xianopt);   
  158.                              }   
  159.                          }   
  160.                           break;   
  161.                      }   
  162.                  }   
  163.              }   
  164.          }   
  165.       }             
  166.   }   
  167.        
  168. }   
  169. //-->   
  170. /*  
  171.   备注说明:不能把 getXmlDoc()方法中的代码放入到window.onload事件函数中  
  172.   因为在opera11.01版本中会出现xmlDoc.async<window.onload的异常信息  
  173.    XMLHttpRequest to files is disabled for security reasons.  
  174. ==> Set "Allow File XMLHttpRequest" with opera:config#UserPrefs|AllowFileXMLHttpRequest to disable this security check.  
  175.  //为了支持opera11.01必须在服务器页面中访问.  
  176.  
  177. 注意:要想在opera浏览器中本地访问,要配置你的opera浏览器:  
  178.  
  179.        首先,打开opera浏览器,在地址栏输入about:config  
  180.  
  181.       然后进入:首选项编辑器===》User Prefs===》Allow File XMLHttpRequest选中保存,重启opera浏览器即可  
  182.   */  
  183.   
  184. </script>   
  185.     
  186.    

city.xml

Code:
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <root name="中国">  
  3.  <province name="请选择省" postcode="100000" >  
  4.     <city name="请选择市" postcode="100100" >  
  5.       <area name="请选择区" postcode="100101" />  
  6.     </city>  
  7.   </province>  
  8.   <province name="北京市" postcode="110000" >  
  9.     <city name="市辖区" postcode="110100" >  
  10.         <area name="东城区" postcode="110101" />  
  11.         <area name="西城区" postcode="110102" />  
  12.         <area name="崇文区" postcode="110103" />  
  13.         <area name="宣武区" postcode="110104" />  
  14.         <area name="朝阳区" postcode="110105" />  
  15.         <area name="丰台区" postcode="110106" />  
  16.         <area name="石景山区" postcode="110107" />  
  17.         <area name="海淀区" postcode="110108" />  
  18.         <area name="门头沟区" postcode="110109" />  
  19.         <area name="房山区" postcode="110111" />  
  20.         <area name="通州区" postcode="110112" />  
  21.         <area name="顺义区" postcode="110113" />  
  22.         <area name="昌平区" postcode="110114" />  
  23.         <area name="大兴区" postcode="110115" />  
  24.         <area name="怀柔区" postcode="110116" />  
  25.         <area name="平谷区" postcode="110117" />  
  26.     </city>  
  27.     <city name="县" postcode="110200" >  
  28.         <area name="密云县" postcode="110228" />  
  29.         <area name="延庆县" postcode="110229" />  
  30.     </city>  
  31.   </province>  
  32.   <province name="天津市" postcode="120000" >  
  33.     <city name="市辖区" postcode="120100" >  
  34.         <area name="和平区" postcode="120101" />  
  35.         <area name="河东区" postcode="120102" />  
  36.         <area name="河西区" postcode="120103" />  
  37.         <area name="南开区" postcode="120104" />  
  38.         <area name="河北区" postcode="120105" />  
  39.         <area name="红桥区" postcode="120106" />  
  40.         <area name="塘沽区" postcode="120107" />  
  41.         <area name="汉沽区" postcode="120108" />  
  42.         <area name="大港区" postcode="120109" />  
  43.         <area name="东丽区" postcode="120110" />  
  44.         <area name="西青区" postcode="120111" />  
  45.         <area name="津南区" postcode="120112" />  
  46.         <area name="北辰区" postcode="120113" />  
  47.         <area name="武清区" postcode="120114" />  
  48.         <area name="宝坻区" postcode="120115" />  
  49.     </city>  
  50.     <city name="县" postcode="120200" >  
  51.         <area name="宁河县" postcode="120221" />  
  52.         <area name="静海县" postcode="120223" />  
  53.         <area name="蓟县" postcode="120225" />  
  54.     </city>  
  55.   </province>  
  56. ......   
  57. </root>  

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值