代码改变世界

AJAX-DorpDownList

2010-05-24 20:11  Doctor C  阅读(220)  评论(0)    收藏  举报

我也来发一个轻量级的AJAX 下拉菜单,通过AJAX动态加载数据

代码都很简单,有一些注释,简单测试了一下,没有什么问题,欢迎大家拍砖,这是我开博后的第一篇原创文章,当然了也查阅了一些资料!

希望对像我一样的菜鸟有所帮助。

 

服务端返回数据是JSON格式的数组对象:

 如果使用其他格式的数据结构,请修改js文件的第 94 和 95 行。

[{n:"名称",v:"值"}]

 

JS 文件的内容是:

 

1 ///autoDropDownList
2  
3  ///获取对象
4  $get = function(id,dom){
5 if(dom != undefined){
6 for(var i = 0; i < dom.childNodes.length;i++){
7 if(dom.childNodes[i].id == id)
8 return dom.childNodes[i];
9 }
10 }
11 return document.getElementById(id);
12 }
13  ///创建对象
14  $create = function(html){
15 return document.createElement(html);
16 }
17
18  ///多级无刷新联动下拉列表类
19 ///id:容器ID
20 ///src:取得数据的页面,返回数据为json,格式为[{n:"",v:""}]
21  function autoDropDownList(id,src){
22 this.Contain = $get(id);
23 this.Src = src;
24 this.ValInput = $create("INPUT");
25 this.ValInput.type = "hidden";
26 this.ValInput.name = "val_"+id;
27 this.Contain.appendChild(this.ValInput);
28 }
29
30  ///创建下单列表(如果传入下拉菜单则表示被创建的是其下级列表)
31  autoDropDownList.prototype.getDropDownList = function(ddl){
32 var addl = this;
33 var _s = $create("SELECT");
34 _s.id = ("addl_"+Math.random()).replace(".","");
35 _s.setAttribute("child","");
36
37 if(ddl != null) ddl.setAttribute("child",_s.id);
38
39 _s.onchange = function(){
40 var s = this;
41 var val = s.value;
42
43 if(val.length == 0){addl.removeChild(s);return;}//如果值为空则删除子菜单并返回
44  
45 addl.ValInput.value = val;
46
47 addl.loadDDL(val,s);
48 };
49 var _op = $create("OPTION");
50 _op.text = "Load......";
51 _s.appendChild(_op);
52
53 return _s;
54 }
55
56  ///取得传入下拉列表的下级下拉列表
57  autoDropDownList.prototype.getChildDDL = function(ddl){
58 if(ddl == null) return null;
59 var cldid = ddl.getAttribute("child");
60 if(cldid == null || cldid.length == 0) return null;
61 return $get(cldid,this.Contain);
62 }
63
64 ///加载列表项到列表
65 ///id:上级数据
66 ///ddl:上级下拉列表
67 autoDropDownList.prototype.loadDDL = function(id,ddl){
68 var addl = this;
69
70 var a = window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();
71 a.open("GET",addl.Src + "?id=" + id,true);
72 a.onreadystatechange = function(){
73 if(a.readyState == 4){
74 var data = eval(a.responseText);
75 if(data.length == 0) {addl.removeChild(ddl);return;}//如果值为空则删除子菜单并返回
76
77 var c = addl.getChildDDL(ddl);
78
79 var S = c == null ? addl.getDropDownList(ddl) : c;
80
81 if(S.options.length > 0){
82 while(S.options.length > 0) S.removeChild(S.options[0]);
83 }
84
85 addl.removeChild(S);
86
87 var _op = $create("OPTION");
88 _op.text = "SELECT";
89 _op.value = "";
90 S.options.add(_op);
91
92 for(var i=0;i<data.length;i++){
93 _op = $create("OPTION");
94 _op.text = data[i].n;
95 _op.value = data[i].v;
96 S.options.add(_op);
97 }
98
99 addl.Contain.appendChild(S);
100 }
101 };
102 a.send(null);
103 };
104
105 ///删除下级列表
106 autoDropDownList.prototype.removeChild = function(ddl){
107 if(ddl == null) return;
108 var cldid = ddl.getAttribute("child");
109 if(cldid == null || cldid.length == 0) return;
110
111 var cld = $get(cldid,this.Contain);
112
113 if(cld == null) return;
114
115 try{
116 this.removeChild(cld);
117 this.Contain.removeChild(cld);
118 ddl.setAttribute("child","");
119 }catch(e){
120 alert(e);
121 }
122 }

 

 

HTML 页面使用方式:

 

1 <script type="text/javascript" src="AutoDropDownList.js"></script>
2
3 <form id="form1" name="form1" method="post" action="getDataItem.aspx">
4 <div id="autoDropDownList"></div><!--列表容器-->
5 <script type="text/javascript">
6 var a = new autoDropDownList("autoDropDownList","getDataItem.aspx");//声明对象,第一个为容器ID,第二个为获取数据的url
7 a.loadDDL(0);//加载第一级菜单,传入参数0,此参加将传递给获取值的页面:getDataItem.aspx?id=0
8 </script>
9 <input type="submit" name="button" id="button" value="提交" />
10 </form>

 

 

 

取得数据及获取值的页面:

 

1 <%@ Page Language="C#" ContentType="text/html" ResponseEncoding="utf-8" %>
2 <script language="c#" runat="server">
3 void Page_Load()
4 {
5 if(Request.Form["val_autoDropDownList"] != null)
6 {
7
8 Response.Write("值:"+Request.Form["val_autoDropDownList"]);//获取值的表单名称是val_ + 容器id,也可以通过js文件第26行修改
9 return;
10 }
11 string[][] items = new string[][]{
12 new string[]{"0","1","OPTION-1"},
13 new string[]{"0","2","OPTION-2"},
14 new string[]{"0","3","OPTION-3"},
15 new string[]{"0","4","OPTION-4"},
16 new string[]{"1","5","OPTION-5"},
17 new string[]{"1","6","OPTION-6"},
18 new string[]{"1","7","OPTION-7"},
19 new string[]{"2","8","OPTION-8"},
20 new string[]{"2","9","OPTION-9"},
21 new string[]{"2","10","OPTION-10"},
22 new string[]{"3","11","OPTION-11"},
23 new string[]{"3","12","OPTION-12"},
24 new string[]{"3","13","OPTION-13"},
25 new string[]{"10","14","OPTION-14"},
26 new string[]{"10","15","OPTION-15"},
27 new string[]{"10","16","OPTION-16"},
28 new string[]{"10","17","OPTION-17"}
29 };
30
31 string pid = "0";
32
33 if(Request.QueryString["id"] != null && Request.QueryString["id"].ToString().Length > 0)
34 pid = Request.QueryString["id"].ToString();
35
36 Response.Write("[");
37 int i = 0;
38 foreach(string[] s in items)
39 {
40 if(s[0] == pid)
41 {
42 if(i > 0) Response.Write(",");
43 Response.Write("{v:'"+s[1]+"',n:'"+s[2]+"'}");
44 i++;
45 }
46 }
47 Response.Write("]");
48
49 Response.End();
50 }
51 </script>