[JS][ASP]下拉連動程式設計

  • 2813
  • 0
  • ASP
  • 2010-09-15

摘要:[JS][ASP]下拉連動程式設計

關於連動下拉之議題早就是個很古老的議題,

解決辦法有些是完全使用SERVER端程式來處理,例:ASP,

這樣會讓整個畫面更新一次 ,如此的作法早就不太被人採用,

由其JQUERY出現之後,就更少人會採用如此的作法,

而我原本也是想試看看使用JQUERY+ASP來解決這問題,

但,我並沒有找到太多的資源來協助我(因為我對JQUERY一點也不熟),

所以我決定採用JS+ASP,來開發。

第一,先準備連動下拉的資料,並把它存入 JS變數中,

把APS的資料存成 CODE1:TEXT1,……,CODEn:TEXTn,

再將整串的字串存放入strOrgType_<%=上一層CODE%>,

其中 『strOrgType_』為自定的前置字串,

(如何從資料庫取得資料與如何將資料轉換成上述格式不另外說明)

   1:  ''''由『第一階』 分別『取得 第二階』,並寫入JS字串中
   2:  set dicMuOrgValDown1 = Server.CreateObject("Scripting.Dictionary")
   3:  aryKeys = dicMuDeptCode.Keys
   4:  intCount = dicMuDeptCode.Count
   5:  for i =0 to intCount-1 
   6:  strMuOrgCode = aryKeys(i)
   7:  strValue = dicMuDeptCode.item(aryKeys(i))
   8:  if (strMuOrgCode<>"") then
   9:  Call getMuOrgValDown("01","02",strMuOrgCode, dicMuOrgValDown1)
  10:  end if
  11:   
  12:  ''''將資料由dic格式轉換成字串
  13:  strMuOrgValDown1 = getDicToString(dicMuOrgValDown1)
  14:   
  15:  %>
  16:  <script >
  17:  strOrgType_<%=strMuOrgCode%>='<%=strMuOrgValDown1%>'
  18:  //alert(strOrgType_<%=strMuOrgCode%>)
  19:  </script>
  20:  <%
  21:  next
  22:   
  23:   
  24:  ''''由『 第二階』 分別取得『第三階』,並寫入JS字串中
  25:  set dicMuOrgValDown2 = Server.CreateObject("Scripting.Dictionary")
  26:  aryKeys = dicMuAreaCode.Keys
  27:  intCount = dicMuAreaCode.Count
  28:  strMuOrgCode =""
  29:  for i =0 to intCount-1 
  30:  strMuOrgCode = aryKeys(i)
  31:  strValue = dicMuAreaCode.item(aryKeys(i))
  32:  if (strMuOrgCode<>"") then
  33:  Call getMuOrgValDown("02","03",strMuOrgCode, dicMuOrgValDown2)
  34:  end if
  35:   
  36:  ''''將資料由dic格式轉換成字串
  37:  strMuOrgValDown2 = getDicToString(dicMuOrgValDown2)
  38:  %>
  39:  <script >
  40:  strOrgType_<%=strMuOrgCode%>='<%=strMuOrgValDown2%>'
  41:  //alert(strOrgType_<%=strMuOrgCode%>)
  42:  </script>
  43:  <%

 

 

第二,已從資料庫取得連動下拉所需的資料並存入JS變數中,

接下來,完成執行下列JS function 就可以達到此目的,

當點選第一階選單時,會先處理會利用strOrgType_上一層CODE,

取得下一層LIST的字串,並以『,』分離成陣列,

再以『:』分離第二個陣列,

然後再重新產生前先將原本的LIST清空,並新增一個預設選項,

之後逐一新增選項。

   1:  //////////////////////////////////////////////////////////////////////////
   2:  // 功能 連動 選單                                                        //
   3:  // 使用前:把連動關係用
   4:  // strKeyWord +上階值 = 下階值1:下階說明1,下階值2:下階說明2,...........,
   5:  //下階值n:下階說明n      來表達//
   6:  /////////////////////////////////////////////////////////////////////////////
   7:   
   8:  //取得『選單物件1』連動『選單物件2』
   9:  //objLevel1  :『選單物件1』
  10:  //objlevel2   :『選單物件2』
  11:  //strKeyWord  前置關鍵字  :用來取得來自asp的選單參數
  12:   
  13:  function chgSelectItem(strSelect1,strSelect2,strKeyWord){
  14:   
  15:        //alert('111')
  16:        //alert(objSelect1.selectedIndex)
  17:        var strSelect1Value = document.all[strSelect1].options[document.all[strSelect1].selectedIndex].value;
  18:        if (strSelect1Value=="undefined") return false;
  19:        if (strSelect1Value=="") return false;
  20:        //var strSelect1Value = objSelect1[1].value;
  21:        //alert("strSelect1Value == >"+strSelect1Value)
  22:        var strNewOptions = eval(strKeyWord+strSelect1Value);
  23:        //alert("strNewOptions == > "+strNewOptions)
  24:        //清除原來選項
  25:        var g = DeleteItemToSelectAll(strSelect2);
  26:   
  27:        //將更新連動選項
  28:        var arrNewOptions = strNewOptions.split(',');//按照『,』分割
  29:        var tmp
  30:   
  31:        //alert("arrNewOptions.length ===>"+arrNewOptions.length)
  32:        var arrNewValues;
  33:        for( var i  =0 ; i < arrNewOptions.length-1 ; i++){
  34:               //alert("~~~~arrNewOptions["+i+"] ==> "+arrNewOptions[i])
  35:               tmp = arrNewOptions[i]
  36:               arrNewValues = tmp.split(':');//按照『:』分割
  37:               //alert(arrNewValues[0]+":"+arrNewValues[1])
  38:               var q = AddItemToSelect(strSelect2, arrNewValues[0]+'-'+arrNewValues[1], arrNewValues[0]);
  39:        }
  40:   
  41:  }
  42:   
  43:   
  44:   
  45:  // 1.判斷select選項中是否存在Value="paraValue"的Item
  46:  //strSelect : 欲被檢查的下拉選單
  47:  //strItemValue :欲被檢查的值
  48:   
  49:   
  50:  function SelectIsExitItem(strSelect, strItemValue) {
  51:   
  52:        //alert('SelectIsExitItem')
  53:        var objSelect = document.all[strSelect];
  54:        var isExit = false;
  55:        for (var i = 0; i < objSelect.options.length; i++) {
  56:               if (objSelect.options[i].value == strItemValue) {
  57:                     isExit = true;
  58:                     break;
  59:               }
  60:        }
  61:   
  62:        //alert('777777')
  63:        return isExit;
  64:  }
  65:   
  66:   
  67:  // 向select選項中加入一個Item
  68:  //strSelect      :增加 的下拉選單
  69:  //strItemText :增加 的下拉選單說明
  70:  //strItemValue:增加 的下拉選單值
  71:   
  72:  function AddItemToSelect(strSelect, strItemText, strItemValue) {
  73:        var objSelect = document.all[strSelect];
  74:        //alert('11')
  75:        //判斷是否存在
  76:   
  77:        if (SelectIsExitItem(strSelect, strItemValue)) {
  78:               //alert("該Item的Value值已經存在");
  79:        } 
  80:        else {
  81:   
  82:               //alert("add GO")
  83:               var varItem = new Option(strItemText, strItemValue);  
  84:               objSelect.options.add(varItem); 
  85:               //alert("成功加入"); 
  86:   
  87:        }
  88:        //alert('22')
  89:  }
  90:   
  91:   
  92:   
  93:  // 清空select的項全部
  94:   
  95:  function Delet
  96:        var objSelect = document.all[strSelect];
  97:        //alert('DeleteItemToSelectAll')
  98:        objSelect.options.length = 0;
  99:        g=AddItemToSelect(strSelect, '請選擇', '') //產生一個預設值
 100:        //alert('ddddddddddddddddd')
 101:  }
 102:   
 103:  /////////////////////////////////////////////////////////////////////////////

 

第三,完成上述程式後,基本上已經可以RUN,

只要把他加入SELECT標記後,如:

onChange="chgSelectItem

('cboMuAreaCode','cboMuGroupCode','strOrgType_'),

最後還有一個問題,就是初次載入資料時,並不會連動,

使用者會選到錯誤的資料,所以,當資料載入之後,記得先RUN一下function,

再指定原本已選定的值objSelect.value = '<%=strMuAreaCode%>';

如此,就已經很完善了。

   1:  <script>
   2:        //    載入時,先依設定值作連動,此時,
   3:        //     才不會在載入時變成可選擇到其它不在範圍內的資料
   4:        var objSelect
   5:        g=chgSelectItem('cboMuDeptCode','cboMuAreaCode','strOrgType_');
   6:        objSelect = document.all['cboMuAreaCode'];
   7:        objSelect.value = '<%=strMuAreaCode%>';
   8:        g=chgSelectItem('cboMuAreaCode','cboMuGroupCode','strOrgType_');
   9:        objSelect = document.all['cboMuGroupCode'];
  10:        objSelect.value = '<%=strMuGroupCode%>';
  11:  </script>