JS 读取XML设置级联菜单

来源:互联网 发布:中国传统价值观 知乎 编辑:程序博客网 时间:2024/06/05 06:17

cities.html

[html] view plaincopy
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">  
  2. <html>  
  3. <head>  
  4. <meta http-equiv="Content-Type" content="text/html; charset=gb2312">  
  5. <title>Untitled Document</title>  
  6. <script type="text/javascript" src="cities.js"></script>  
  7. </head>  
  8. <body>  
  9.   
  10. <select id="province">  
  11.     <option value=""> 请选择 ...</option>  
  12.     <option value="河北省"> 河北省 </option>  
  13.     <option value="辽宁省"> 辽宁省 </option>  
  14.     <option value="山东省"> 山东省 </option>  
  15. </select>  
  16. <select id="city"><option value="..."> 请选择 ...</option></select>  
  17.   
  18. </body>  
  19. </html>  

cities.js

[javascript] view plaincopy
  1. window.onload = function()  
  2. {  
  3.     // 解析 XML 文档 , 得到 xml 文档的 china 根节点  
  4.     var xmlDocument = parseXml("cities.xml");  
  5.     var chinaNode = xmlDocument.childNodes[1];  
  6.     // 为 id="province" 的 select 节点添加 onchange 事件 , 获取选择的省的 value  
  7.     var provinceNode = document.getElementById("province");  
  8.     provinceNode.onchange = function()  
  9.     {  
  10.         // ** 清空 provice 节点出 <option value="..."> 请选择 ...</option> 的所有子节点 **  
  11.         var cityNode = document.getElementById("city");  
        // cityNodeOptionNodes 数组时活动的 , 所以需要从后向前清  (此时是从后往前删除)
  1.         var cityNodeOptionNodes = cityNode.getElementsByTagName("option");  
  2.         var length = cityNodeOptionNodes.length;  
  3.         for(var i = length - 1; i > 0; i--)  
  4.         {  
  5.             cityNode.removeChild(cityNodeOptionNodes[i]);  
  6.         }  
  7. /*
  8.  //如果从前往后进行删除的话,因为methodNode是动态变的,所以每次都清理第二个值,也就是请选择后边的那个值就可以了
       for(var i=1;i<len;i++){
        cityNode.removeChild(cityNodeOptionNodes[i]);
       }
  9. */
  10.         var provinceValue = this.value;  
  11.         // 用 provinceValue 去 xml 文档中获取对应的 province 节点  
  12.         var provinceNodeInXmlFile = xmlDocument.selectSingleNode("china/province[@name='" + provinceValue + "']");  
  13.         // 获取 3 provinceNodeInXmlFile 的所有 city 子节点的文本值 : cityValue  
  14.         var cityNodesInXmlFile = provinceNodeInXmlFile.getElementsByTagName("city");  
  15.         for (var i = 0; i < cityNodesInXmlFile.length; i++)  
  16.         {  
  17.             var cityNodeInXmlFile = cityNodesInXmlFile[i];  
  18.             var cityValue = cityNodeInXmlFile.firstChild.nodeValue;  
  19.             // 利用 得到的文本值创建 option 节点 : <option value='cityValue'>cityValue</option>  
  20.             var optionNode = document.createElement("option");  
  21.             optionNode.setAttribute("value", cityValue);  
  22.             var optionNodeTextNode = document.createTextNode(cityValue);  
  23.             optionNode.appendChild(optionNodeTextNode);  
  24.             // 把创建好的 option 节点添加到 id="city" 的 select 节点中  
  25.             cityNode.appendChild(optionNode);  
  26.         }  
  27.     };  
  28.     // 解析 xml 文件的函数  
  29.     function parseXml(fileName)  
  30.     {  
  31.         //IE 内核的浏览器  
  32.         if (window.ActiveXObject)  
  33.         {  
  34.             // 创建 DOM 解析器  
  35.             var doc = new ActiveXObject("Microsoft.XMLDOM");  
  36.             doc.async = "false";  
  37.             // 加载 XML 文档 , 获取 XML 文档对象  
  38.             doc.load(fileName);  
  39.             return doc;  
  40.         }  
  41.         //Mozilla 浏览器  
  42.         else if (window.DOMParser)  
  43.         {  
  44.             // 创建 DOM 解析器  
  45.             var p = new DOMParser();  
  46.             // 创建 DOM 解析器  
  47.             return p.parseFromString(fileName, "text/xml");  
  48.         }  
  49.         else  
  50.         {  
  51.             return false;  
  52.         }  
  53.     }  
  54. }  

cities.xml

[html] view plaincopy
  1. <?xml version="1.0" encoding="GB2312"?>  
  2. <china>  
  3.     <province name="河北省">  
  4.         <city> 石家庄 </city>  
  5.         <city> 邯郸 </city>  
  6.         <city> 唐山 </city>  
  7.         <city> 张家口 </city>  
  8.         <city> 廊坊 </city>  
  9.     </province>  
  10.     <province name="辽宁省">  
  11.         <city> 沈阳 </city>  
  12.         <city> 大连 </city>  
  13.         <city> 鞍山 </city>  
  14.         <city> 抚顺 </city>  
  15.         <city> 铁岭 </city>  
  16.     </province>  
  17.     <province name="山东省">  
  18.         <city> 济南 </city>  
  19.         <city> 青岛 </city>  
  20.         <city> 威海 </city>  
  21.         <city> 烟台 </city>  
  22.         <city> 潍坊 </city>  
0 0