JSDom加载解析XML文件——下拉列表二级联动篇

以前在项目中实现二级联动是通过单纯的JS方法,在对JS的深度了解中发现通过JSDom加载写好的XML文件也可以实现二级联动,这也不失为一种好的方法,下面就跟大家分享一下。

首先,我们来看下要呈现的效果:

 

JSDom加载解析XML文件——下拉列表二级联动篇_第1张图片

JSDom加载解析XML文件——下拉列表二级联动篇_第2张图片

好,我们来看下需要的一个简单的XML文件:

 JSDom加载解析XML文件——下拉列表二级联动篇_第3张图片

我们可以看到该XML文档有三层:

根节点:cities

子节点:province

子节点:city

Province节点拥有一个Name属性

      下面我们来看下JS的源码:

  
   
   
   
   
1 window.onload = function (){
2
3 // 创建微软XML解析控件对象
4  
5 var xmlDoc = new ActiveXObject( " Microsoft.XMLDOM " );
6
7 // 获得省的选择框对象节点
8  
9 var province = document.getElementById( " province " );
10
11 // 获得市的选择框对象节点
12  
13 var city = document.getElementById( " city " );
14
15 // 设置异步关闭
16  
17 xmlDoc.async = " false " ;
18
19 // 加载XML文件
20
21 xmlDoc.load( " cities.xml " );
22
23 // 获得XML文件标签名为province的对象节点
24
25 var txt = xmlDoc.getElementsByTagName( " province " );
26
27 // 使用循环将获得的省的名称加入province的选择框中
28
29 for ( var i = 0 ;i < txt.length;i ++ ){
30
31 // 获得province标签属性名
32
33 var name = txt[i].getAttribute( " name " );
34
35 // 创建option节点对象
36
37 var p = document.createElement( " option " );
38
39 // 将文本节点添加到option对象中
40
41 p.appendChild(document.createTextNode(name));
42
43 // 将对象添加到省选择框的对象节点中
44
45 province.appendChild(p);
46
47 }
48
49 // 当province文本框中的值发生改变时触发以下事件
50
51 province.onchange = function (){
52
53 // 获得省的所有选项
54
55 var prces = province.options;
56
57 // 获得选中选项
58
59 var selected = prces[prces.selectedIndex];
60
61 // 获得选中项的文本值
62
63 var sedname = selected.innerHTML;
64
65
66
67
68
69 /* 循环添加省的子城市到city选择框 */
70
71 for ( var i = 0 ;i < txt.length;i ++ ){
72
73 // 获得XML文档中省的name
74
75 var name = txt[i].getAttribute( " name " );
76
77 // 判断选中选项的省是否与XML文档中提取到得省的name是否相同
78
79 if (sedname == name){
80
81 // 在联动之前设置其中选项长度,为了使请选择选项始终显示所以长度设置为1
82
83 /* 注意:这里只是设置了下拉选择框的长度,等同于把其中的固定下标的元素隐藏,并不等同于删除其中的元素 */
84
85 city.length = 1 ;
86
87 // 获得其中省的节点
88
89 var cities = txt[i];
90
91 // 获得省的节点的子节点、也就是省内的城市
92
93 var cy = cities.childNodes;
94
95 /* 循环添加城市节点 */
96
97 for ( var j = 0 ;j < cy.length;j ++ ){
98
99 // 创建option元素节点
100
101 var nopt = document.createElement( " option " );
102
103 // 将获得的城市节点的文本添加到该元素节点中
104
105 nopt.appendChild(document.createTextNode(cy[j].childNodes[ 0 ].nodeValue));
106
107 // 添加到下拉框节点中
108
109 city.appendChild(nopt);
110
111 }
112
113 }
114
115 }
116
117 }
118
119 }

HTML源码:

  
   
   
   
   
1 <! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
2 < html xmlns ="http://www.w3.org/1999/xhtml" >
3 < head >
4 < meta http-equiv ="Content-Type" content ="text/html; charset=utf-8" />
5 < title > 省市联动 </ title >
6 </ head >
7
8 < body >
9 < select id ="province" style ="width:100px; background:#CCC;" >
10 < option > --请选择省-- </ option >
11 </ select >
12 < select id ="city" style ="width:100px; background:#CCC;" >
13 < option > --请选择市-- </ option >
14 </ select >
15 </ body >
16 < script type ="text/javascript" src ="city.js" >
17
18 </ script >
19 </ html >

注意:这段js脚本代码仅支持IE浏览器(本人使用IE9测试),还有其中的XML加载路径,我的是默认在本站也就是同一个文件夹内;

      此外,当再次点击“请选择省“这个选项时,右侧市的选择框会停留在你上一次点击的省的下属市上不会做改变,这也算一个小小的bug吧,大家见谅,有解决的请回复我。

本文版权所有,转载请注明出处。

你可能感兴趣的:(JSDom加载解析XML文件——下拉列表二级联动篇)