基於Ajax的二級聯動下拉菜單

很多朋友在做多級聯動下拉菜單時都碰到了問題,Google上能找到的大部分也是基於javascript數組的實現,超多3級聯動時,就會很複雜,甚至出現4維、5維的數組。這裏介紹一個Ajax的方法,也是頁面無刷新的,但是是從數據庫實時查詢的,在數據量大時較js數組的方法性能要好很多,實現起來也方便。

廢話少說,直接看代碼:
由於大家用的數據庫五花八門,我就用幾個數組來代替rs,在實際應用中只要把實時查詢的結果集rs替換掉數據就可以了。

我這裏採用了一個ajax的框架:DWR,這個是把java代碼影射成js的一個工具。

index.htm
  1. <html>
  2.  
  3. <script src="/dwrajax/dwr/interface/ItemsBean.js"></script>
  4. <script src="/dwrajax/dwr/engine.js"></script>
  5. <script src="/dwrajax/dwr/util.js"></script>
  6.  
  7. <script language="javascript"> 
  8. function update1()
  9. {
  10.        ItemsBean.ClassList(createList1);
  11. }
  12. function createList1(data)
  13. {
  14.     DWRUtil.removeAllOptions("classid");
  15.     DWRUtil.addOptions("classid", data);
  16. }
  17.  
  18. function update2()
  19. {
  20.        ItemsBean.UserList(createList2,DWRUtil.getValue("classid"));
  21. }
  22. function createList2(data)
  23. {
  24.     DWRUtil.removeAllOptions("userid");
  25.     DWRUtil.addOptions("userid", data);
  26. }
  27. </script>
  28.  
  29. <head>
  30. <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
  31. <title>班級和學生Ajax級聯下拉菜單</title>
  32. </head>
  33.  
  34. <body οnlοad="update1()">
  35.  
  36. <form name="formform">
  37.     班級<select name="classid" id="classid" οnchange="javascript:update2();"></select> 
  38.     學生<select name="userid" id="userid"></select>
  39. </form>
  40.  
  41. </body>
  42.  
  43. </html>


ItemsBean.java
  1. package org.baiyun;
  2.  
  3. import java.util.*;
  4. /**
  5.  *
  6.  * @author baiyun
  7.  */
  8. public class ItemsBean {
  9.     private String[] class1 = {"同學1","同學2","同學3","同學4","同學5","同學6"};
  10.     private String[] class2 = {"同學7","同學8","同學9","同學10"};
  11.     private String[] class3 = {"同學11","同學12","同學13","同學14","同學15","同學16","同學17"};
  12.     private String[] class4 = {"同學18","同學19","同學20"};
  13.     private String[] class5 = {"同學21","同學22","同學23","同學24","同學25","同學26"};
  14.     /** Creates a new instance of ItemsBean */
  15.     public ItemsBean() {
  16.     }
  17.     
  18.     public Map ClassList() {
  19.         Map reply = new LinkedHashMap();
  20.         reply.put("0""所有");
  21.         reply.put("1""班級1");
  22.         reply.put("2""班級2");
  23.         reply.put("3""班級3");
  24.         reply.put("4""班級4");
  25.         reply.put("5""班級5");
  26.         return reply;
  27.     }
  28.     
  29.     public Map UserList(String CLASSID) {
  30.         Map reply = new LinkedHashMap();
  31.         reply.put("0""所有");
  32.         
  33.         // 這裏用數組模擬數據庫查詢結果。
  34.         // 真實環境中,你只要將數據庫查詢結果放入到reply裏面就可以了。
  35.         // reply的id就是返回後下拉框的option的value,reply的value就是返回後下拉框的option的text。
  36.         // 如: sql = "select * from users where classid=?";
  37.         if(CLASSID==null || CLASSID.equals("") || CLASSID.equals("0")){
  38.             //
  39.         }else if(CLASSID.equals("1")){
  40.             int id =1;
  41.             for(int i=0;i<class1.length;i++){
  42.                 reply.put(""+id, class1[i]);
  43.                 id++;
  44.             }
  45.         }else if(CLASSID.equals("2")){
  46.             int id =1;
  47.             for(int i=0;i<class2.length;i++){
  48.                 reply.put(""+id, class2[i]);
  49.                 id++;
  50.             }
  51.         }else if(CLASSID.equals("3")){
  52.             int id =1;
  53.             for(int i=0;i<class3.length;i++){
  54.                 reply.put(""+id, class3[i]);
  55.                 id++;
  56.             }
  57.         }else if(CLASSID.equals("4")){
  58.             int id =1;
  59.             for(int i=0;i<class4.length;i++){
  60.                 reply.put(""+id, class4[i]);
  61.                 id++;
  62.             }
  63.         }else if(CLASSID.equals("5")){
  64.             int id =1;
  65.             for(int i=0;i<class5.length;i++){
  66.                 reply.put(""+id, class5[i]);
  67.                 id++;
  68.             }
  69.         }
  70.         
  71.         return reply;
  72.     }
  73. }


web.xml
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
  3.  
  4. <web-app>
  5.   <servlet>
  6.     <servlet-name>dwr-invoker</servlet-name>
  7.     <display-name>DWR Servlet</display-name>
  8.     <servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
  9.     <init-param>
  10.       <param-name>debug</param-name>
  11.       <param-value>true</param-value>
  12.     </init-param>
  13.   </servlet>
  14.   <servlet-mapping>
  15.     <servlet-name>dwr-invoker</servlet-name>
  16.     <url-pattern>/dwr/*</url-pattern>
  17.   </servlet-mapping>
  18.  
  19.   <welcome-file-list>
  20.     <welcome-file>index.htm</welcome-file>
  21.   </welcome-file-list>
  22. </web-app>


dwr.xml: 是讓js和java直接通訊,很神奇吧~ 這就是dwr的貢獻。
  1. <?xml version="1.0" encoding="gbk"?>
  2. <!DOCTYPE dwr PUBLIC
  3.     "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN"
  4.     "http://www.getahead.ltd.uk/dwr/dwr10.dtd">
  5.  
  6. <dwr>
  7.   <allow>
  8.     <create creator="new" javascript="ItemsBean">
  9.       <param name="class" value="org.baiyun.ItemsBean"/>
  10.     </create>
  11.  
  12.   </allow>
  13. </dwr>


就這麼簡單,運行以下試試看吧~。
若要實現3級、4級、5級...的下拉菜單,只要以此類推一級級延下去就可以了,也很簡單的。

直接把附件解壓放到Tomcat/webapps下可以直接運行。附件:dwrajax.zip(295K) 
上面這個多級聯動下拉菜單只是Ajax的一個很小的應用,我現在的項目裏大量使用了Ajax,可以像Gmail一樣查詢、翻頁等等都不用刷新整個頁面,用戶操作感覺非常好。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章