Javascript 调用XML制作连动下拉框

传统的HTML页面中连动下拉框采用了两种方法:
1)直接将下拉框中的内容hardcode于html的javascript中,调用javascript函数循环写入下拉框中。这种方法不适用于下拉框内容经常改变的情况。因为数据源和javascript程序写死在同一页面。

 1<html>
 2<head>
 3<title>List</title>
 4<meta c="" content='\"text/html;' harset='gb2312\"' http-equiv='\"Content-Type\"'/>
 5<script language='\"javascript\"'>   
 6<!--   
 7var onecount;   
 8onecount=0; 
 9
10subcat = new Array();   
11subcat[0] = new Array(\"徐汇区\",\"01\",\"001\");   
12subcat[1] = new Array(\"嘉定区\",\"01\",\"002\");   
13subcat[2] = new Array(\"黄浦区\",\"01\",\"003\");   
14subcat[3] = new Array(\"南昌市\",\"02\",\"004\");   
15subcat[4] = new Array(\"九江市\",\"02\",\"005\");   
16subcat[5] = new Array(\"上饶市\",\"02\",\"006\"); 
17
18onecount=6; 
19
20function changelocation(locationid)   
21{   
22document.myform.smalllocation.length = 0; 
23
24var locationid=locationid;   
25var i;   
26document.myform.smalllocation.options[0] = new Option(\'====所有地区====\',\'\');   
27for (i=0;i <onecount; i++)   
28{   
29if (subcat[i][1] == locationid)   
30{   
31document.myform.smalllocation.options[document.myform.smalllocation.length]   
32= new Option(subcat[i][0], subcat[i][2]);   
33}   
34} 
35
36} 
37
38//-->   
39</script>
40</head>
41<body>
42<form method='\"post\"' name='\"myform\"'>
43<select name='\"biglocation\"' onchange='\"changelocation(document.myform.biglocation.options[document.myform.biglocation.selectedIndex].value)\"'>
44<option selected="" value='\"01\"'>上海</option>
45<option value='\"02\"'>江西</option>
46</select>
47<select name='\"smalllocation\"'>
48<option selected="" value='\"\"'>==所有地区==</option>
49</select>
50</form>
51<script language='\"javascript\"'>   
52<!--   
53changelocation(document.myform.biglocation.options[document.myform.biglocation.selectedIndex].value);   
54//-->   
55</script>
56</body>
57</html>

2)javascript 直接读取数据库,取数据库中的记录写入javascript中,然后和第一种方法一样,调用javascript函数循环写入下拉框中。此方法将数据源与javascript分开,但,公开数据库的连接,从安全角度说,没有多少实用价值。

我的方法是将下拉框中的数据放在XML文件中,用javascript读XML文件,取得下拉框中的内容。

HTML 文件如下:

 1<html>
 2<head>
 3<script event='\"onload\"' for='\"window\"' language='\"JavaScript\"'>   
 4var xmlDoc = new ActiveXObject(\"Microsoft.XMLDOM\");   
 5var i=0;   
 6var j=0;   
 7var subclass_name=\"\";   
 8loadXML();   
 9function loadXML(){   
10xmlDoc.async=\"false\";   
11xmlDoc.load(\"account.xml\");   
12xmlObj=xmlDoc.documentElement;   
13nodes = xmlDoc.documentElement.childNodes;   
14document.frm.mainclass.options.length = 0;   
15document.frm.subclass.options.length = 0; 
16
17for (i=0;i<xmlObj.childNodes.length;i++){   
18labels=xmlObj.childNodes(i).getAttribute(\"display_name\");   
19values=xmlObj.childNodes(i).text;   
20document.frm.mainclass.add(document.createElement(\"OPTION\"));   
21document.frm.mainclass.options[i].text=labels;   
22document.frm.mainclass.options[i].value=values; 
23
24} 
25
26} 
27
28  
29</script>
30<script language='\"JavaScript\"'>   
31var xmlDoc = new ActiveXObject(\"Microsoft.XMLDOM\");   
32var i=0;   
33var j=0; 
34
35function deleteOption() {   
36  
37} 
38
39function setsubclass(main){   
40var is_selected=\"N\";   
41if (document.frm.subclass.options.length!=0) {   
42for (i=0;i<=document.frm.subclass.options.length;i++)   
43document.frm.subclass.options[i]=null ;   
44}   
45//重复才有效   
46if (document.frm.subclass.options.length!=0) {   
47for (i=0;i<=document.frm.subclass.options.length;i++){   
48document.frm.subclass.options[i]=null ;   
49document.frm.subclass.options.remove(i);   
50}   
51} 
52
53  
54for (i=0;i<xmlObj.childNodes.length;i++){ 
55
56var values=\"\";   
57var lables=\"\"; 
58
59if (is_selected==\"Y\") return;   
60labels=xmlObj.childNodes(i).getAttribute(\"display_name\");   
61values=xmlObj.childNodes(i).text;   
62//alert(labels+ \" | \"+main);   
63if (labels==main){ 
64
65is_selected=\"Y\"; 
66
67for (j=0;j<xmlObj.childNodes(i).childNodes.length;j++){   
68//subclass_name=\"document.frm.subclass\";   
69labels=xmlObj.childNodes(i).childNodes(j).getAttribute(\"display_name\");   
70values=xmlObj.childNodes(i).childNodes(j).text;   
71//alert(values);   
72document.frm.subclass.add(document.createElement(\"OPTION\"));   
73document.frm.subclass.options[j].text=labels;   
74document.frm.subclass.options[j].value=values; 
75
76} 
77
78} 
79
80}   
81}   
82</script>
83<title>在HTML中调用XML数据</title>
84</head>
85<body bgcolor='\"#FFFFFF\"'>
86<form name='\"frm\"'>   
87类型<select name='\"mainclass\"' onchange="\'setsubclass(this[selectedIndex].text)\'"></select>
88<option selected="" value='\"\"'></option>   
89子类<select name='\"subclass\"'></select>
90</form>
91</body>
92</html>

account.xml 如下:

 1<item>
 2<class display_name='\"未选定\"'>
 3<subclass display_name='\"\"'>Not Available</subclass>
 4</class>
 5<class display_name='\"95788主叫卡\"'>
 6<subclass display_name='\"1152069589-1152069638\"'>dangdang1</subclass>
 7<subclass display_name='\"1152081031-1152081080\"'>dangdang2</subclass>
 8<subclass display_name='\"1152547201-1105254750\"'>dangdang3</subclass>
 9<subclass display_name='\"1152548401-1152548700\"'>dangdang4</subclass>
10<subclass display_name='\"1152548701-1152549000\"'>dangdang5</subclass>
11<subclass display_name='\"1156000001-1156010000\"'>dangdang6</subclass>
12</class>
13<class display_name='\"网上注册\"'>
14<subclass display_name='\"1152000001-1152001000\"'>zhuce_user1</subclass>
15<subclass display_name='\"1151001000-1151005000\"'>zhuce_user2</subclass>
16</class>
17<class display_name='\"通讯\"'>
18<subclass display_name='\"1156030001-1156080000\"'>tongxun</subclass>
19</class>
20</item>

此方法将数据源与javascript程序分开,适合经常变化的数据源。xmlDoc.load中可以直接调用URL参数,读取远程XML,实现松耦合。以上应用在IE6.0中通过。不足之处是在去除下拉框列表内容时需要
重复执行删除操作,否则会有明显的bug.希望有读者能给指正。

Published At
Categories with Web编程
Tagged with
comments powered by Disqus