六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 15|回复: 0

Select表单控件的多选级联技术

[复制链接]

升级  70%

7

主题

7

主题

7

主题

童生

Rank: 1

积分
35
 楼主| 发表于 2013-2-7 16:42:15 | 显示全部楼层 |阅读模式
Select表单控件的多选级联技术

需求提出这个需求非常普遍,一般的B/S系统上都会有此类型的需求。举一个很典型的例子:在目前的一些技术论坛系统中,你发表一封帖子,而帖子可能包含很多种分类。
如:按语言分,则是java类;按行业分,则属于bank,等等…….因此在设计界面时,需求就要求你能选择多个分类,而且已选的分类不能再选。
解决方案:实现这个功能其实并不难,在表单里面有这样的控件<select name=”select1” multiple="true" size=”10”>,用户就可以直接在上面选择自己要的分类就行。但是这个控件只能定义固定高度,而且当数据库中分类很多时,用户选择起来很费劲,而且多选时,必须按住Ctrl键。
基于这种方案的不足,同时针对这个应用需求,本人重新设计一个新的方案,则用两个select表单控件级联,则可以满足用户需求,且非常好操作。
新方案思想:上面方案之所以摒弃,因为不能满足易操作性,对于B/S系统来说,易操作性是一项非常重要的指标。
新方案实现这个功能采用三个表单控件:
1.      一个支持多选的下拉菜单select
2.      一个支持单选的下拉菜单select;
3.      一个删除按钮button
Jsp页面代码:
首先用javaScript定义一个二维数组;
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>select级联</title>
</head>
<script language="javascript">

var allTypes = new Array();
  for(var i =0;i<4;i++ ){
var mainType = new Array();
  mainType[0] = "大分"+i;
  mainType[1] = i; //大分ID
   var subType_list =  new  Array();
  mainType[2] =  subType_list;
  for(var j= 0;j<4;j++){  
   var subType = new Array();
    subType[0]  = "小分"+i+""+j;
subType[1] =i+""+j;
subType_list[j] = subType;
}
    allTypes = mainType;
}



function  addFileType(option){

var select1 = document.getElementById("select_types");
var  option_new = document.createElement("Option");  

for(var m = 0;m < allTypes.length; m++ ){
  var element = allTypes[m];
   
   var  subTypeList =  element[2];
  
for(var n = 0;n < subTypeList.length; n++ ){
  
if(option.value == subTypeList[n][1]){
  option_new.text = element[0]+"-"+subTypeList[n][0];
break;
}
}

}
  option_new.value = option.value;
  var addFlag = 0;
  if(select1.options.length<1){
   select1.options.add(option_new);
  }else{
  
    for(var k = 0; k < select1.options.length;k++){
   
    if(option_new.value.substring(0,1) == select1.options[k].value.substring(0,1)){
      addFlag = 1;   
      alert('你已经选择了此大分');  
      break;
    }
   
  }
  if(addFlag == 0){
     select1.options.add(option_new);
     return;
     }
  
  }

}


function  deleteOption(select_element){
var select1 = document.getElementById(select_element);
if(select1.options.length <1)
{ return false;
}

select1.remove(select1.selectedIndex);
select1.selectedIndex = select1.options.length-1;
}

</script>

<body><select id="select_types" name="select_types" multiple="true" size="6"  >
    <optgroup    label="         -----作品已有-----       " ></optgroup>
</select>                                                                      <input type="button" class="btn" name="Submit2" value=">>"  onClick="deleteOption('select_types')" >
                            <!-- ***********示所有的作品***************** -->
                <select name="select2"  onchange="addFileType(this);">
                                                                      <option label="---请选择作品分---"  disabled="disabled" selected></option>
    <optgroup label="大分0" >
<option value="00">小分00</option>
<option value="01">小分01</option>
<option value="02">小分02</option>
<option value="03">小分03</option>
</ optgroup>
<optgroup label="大分1" >
<option value="10">小分10</option>
<option value="11">小分11</option>
<option value="12">小分12</option>
<option value="13">小分13</option>
</ optgroup>
<optgroup label="大分2" >
<option value="20">小分20</option>
<option value="21">小分21</option>
<option value="22">小分22</option>
<option value="23">小分23</option>
</ optgroup>
<optgroup label="大分3" >
<option value="30">小分30</option>
<option value="31">小分31</option>
<option value="32">小分32</option>
<option value="33">小分33</option>
</ optgroup>
              </select>
</body>
</html>

最后还要注意一个问题,select多选控件在提交表单时只会提交已选上的所有值,因此在点击提交按钮时,应该加上这样的js语句:
var allType = document.getElementById("select_types");  //
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表