双向二级联动的实现

 Suppose we will implement the following two select:

Primary <select>     {A,B,C}

Secondary<select>  { 1,2,3,4,5,6,7,8,9}

 

Primary->Secondary rule:

A->{1,2,3}

B->{4,5,6}

C->{7,8,9}

 

Secondary->Primary rule:

1->A

2->A

3->A

4->B

5->B

6->B

7->C

8->C

9->C

 

The following definitions:

你正在操作的<select> ::= working select

被动的,即将基于你的操作所产生的<select> ::= desired select

 

 In fact, the implementation is according the following considerations: (实现思路)

 

1.       Let both <select> can accept DOM event ,and bind the related event handle function.

2.       Configure the mapping rule in the event handle function.

3.       In the event function ,create an Array to store the values of the  <options> of desired select based on the index you have chosen from the working select

4.       Please Note: in event function ,you must set the other <select> ‘s event handle method to be empty in order to prevent it to process its event recursively.

5.       Clear all the <options> of desired select.

6.       Create the desired select and filling the <options> by the Array created in Step 3.

    (Details please see the comments in the javascript file)

 

Screen Shots:

Primary->Secondary

 

Initial State:


 

Step 1: (Choose one from the left, for example B, then the right can only have three choice {4,5,6})


Step 2 (Choose one from the right ,for example “5” and it shows the result)


 

 

Secondary->Primary

 

Initial State:


 

Step1: (Choose one from the right ,for example “7”)


 

Step 2: (then the left <select> will display “C” because of the rule “7->C”)


 

Implementation:

js:

 

 
  
  1. /** 
  2.  * This function will render the secondary select according to the primart select 
  3.  */ 
  4. function createNumbers(){ 
  5.     //create an alphabetIndex which stands for the selected index from the primary <select> 
  6.     var alphabetIndex =document.testform.alphabets.selectedIndex; 
  7.      
  8.     //if the first index (the prompt is selected) then ignore it 
  9.     if ((alphabetIndex == null) || (alphabetIndex == 0)) return
  10.  
  11.   //binding the <options> based on the index you have chosen from the primary <select> 
  12.    
  13.   if (alphabetIndex == 1) { 
  14.   
  15.   //create an array which can hold all the <options> of the secondary select 
  16.   var Numbers = new Array(); 
  17.   Numbers[0] = new Option("1"); 
  18.   Numbers[1] = new Option("2"); 
  19.   Numbers[2] = new Option("3"); 
  20.    
  21.  
  22.   } 
  23.    
  24.   if (alphabetIndex ==2) { 
  25.      
  26.     var Numbers = new Array(); 
  27.     Numbers[0] = new Option("4"); 
  28.     Numbers[1] = new Option("5"); 
  29.     Numbers[2] = new Option("6"); 
  30.      
  31.      
  32.   } 
  33.    
  34.   if (alphabetIndex ==3) { 
  35.      
  36.     var Numbers = new Array(); 
  37.     Numbers[0] = new Option("7"); 
  38.     Numbers[1] = new Option("8"); 
  39.     Numbers[2] = new Option("9"); 
  40.      
  41.  
  42.   } 
  43.    
  44.   //empty all the existing options from the secondary <select> 
  45.   for (i=document.testform.numbers.options.length; i>0; i--) {  
  46.   document.testform.numbers.options[i] = null
  47.   } 
  48.  
  49.   //set all the <options> of the secondary <select> to be from the created Array  
  50.   for(i=0; i<Numbers.length; i++) { 
  51.   document.testform.numbers.options[i] = Numbers[i]; 
  52.   } 
  53.  
  54.   //set the first <option> of the secondary <select> to be "selected" status 
  55.   document.testform.numbers.options[0].selected = true
  56.    
  57.   //This line is very important 
  58.   //to prevent the event from the secondary<select> that may cause the primary<select> to execute createAlphabets() 
  59.   document.testform.numbers.οnchange=function(){}; 
  60.  
  61.  
  62.  
  63. /** 
  64.  * This function will render the primary <select> according to the <secondary> select 
  65.  */ 
  66. function createAlphabets(){ 
  67.     var numberIndex =document.testform.numbers.selectedIndex; 
  68.     if ((numberIndex == null) || (numberIndex == 0)) return
  69.  
  70.   if (numberIndex == 1) { 
  71.  
  72.   var Alphabets = new Array(); 
  73.   Alphabets[0] = new Option("A");  
  74.   } 
  75.    
  76.   if (numberIndex == 2) { 
  77.  
  78.   var Alphabets = new Array(); 
  79.   Alphabets[0] = new Option("A");  
  80.   } 
  81.    
  82.   if (numberIndex == 3) { 
  83.  
  84.   var Alphabets = new Array(); 
  85.   Alphabets[0] = new Option("A");  
  86.   } 
  87.    
  88.   if (numberIndex == 4) { 
  89.  
  90.   var Alphabets = new Array(); 
  91.   Alphabets[0] = new Option("B");  
  92.   } 
  93.    
  94.   if (numberIndex == 5) { 
  95.  
  96.   var Alphabets = new Array(); 
  97.   Alphabets[0] = new Option("B");  
  98.   } 
  99.    
  100.   if (numberIndex == 6) { 
  101.  
  102.   var Alphabets = new Array(); 
  103.   Alphabets[0] = new Option("B");  
  104.   } 
  105.    
  106.   if (numberIndex == 7) { 
  107.  
  108.   var Alphabets = new Array(); 
  109.   Alphabets[0] = new Option("C");  
  110.   } 
  111.    
  112.   if (numberIndex == 8) { 
  113.  
  114.   var Alphabets = new Array(); 
  115.   Alphabets[0] = new Option("C");  
  116.   } 
  117.    
  118.   if (numberIndex == 9) { 
  119.  
  120.   var Alphabets = new Array(); 
  121.   Alphabets[0] = new Option("C");  
  122.   } 
  123.    
  124.   
  125.    
  126.   for (i=document.testform.alphabets.options.length; i>0; i--) {  
  127.   document.testform.alphabets.options[i] = null
  128.   } 
  129.  
  130.   for(i=0; i<Alphabets.length; i++) { 
  131.   document.testform.alphabets.options[i] = Alphabets[i]; 
  132.   } 
  133.  
  134.   document.testform.alphabets.options[0].selected = true
  135.   

The html to render the selection:

 

 
  
  1. <html> 
  2. <head> 
  3. <title>Test Bi-Directional Linked Select</title> 
  4.  
  5. <script  
  6.     type="text/javascript"  
  7.     src="js/linkedcombobox.js"  
  8.     > 
  9. </script> 
  10. </head> 
  11.  
  12.  
  13. <!--  
  14. Suppose A ->{1,2,3} 
  15.         B ->{4,5,6} 
  16.         C ->{7,8,9} 
  17.          
  18.         1->
  19.         2->
  20.         3->
  21.         4->
  22.         5->
  23.         6->
  24.         7->
  25.         8->
  26.         9->
  27.  --> 
  28.   
  29. <form name="testform"> 
  30.  
  31. Test Bi-Directional Select : 
  32.  
  33. <select name="alphabets" onchange="createNumbers()"> 
  34.  
  35.   <option value=" ">Choose an Alphabet</option> 
  36.   <option value="A">A</option> 
  37.   <option value="B">B</option> 
  38.   <option value="C">C</option> 
  39.  
  40. </select> 
  41.  
  42. <select name="numbers" onchange="createAlphabets()"> 
  43.  
  44.   <option value="">Choose a Number</option> 
  45.   <option value="1">1</option> 
  46.   <option value="2">2</option> 
  47.   <option value="3">3</option> 
  48.   <option value="4">4</option> 
  49.   <option value="5">5</option> 
  50.   <option value="6">6</option> 
  51.   <option value="7">7</option> 
  52.   <option value="8">8</option> 
  53.   <option value="9">9</option> 
  54.  
  55. </select> 
  56.  
  57. </form> 
  58. </body> 
  59. </html> 




本文转自 charles_wang888 51CTO博客,原文链接:http://blog.51cto.com/supercharles888/840268,如需转载请自行联系原作者

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值