jasmine214--love

只有当你的内心总是充满快乐、美好的愿望和宁静时,你才能拥有强壮的体魄和明朗、快乐或者宁静的面容。
posts - 731, comments - 60, trackbacks - 0, articles - 0

JS--多级联动select

Posted on 2010-07-04 18:40 幻海蓝梦 阅读(1990) 评论(0)  编辑  收藏 所属分类: JS

 

< script language = " JavaScript "  type = " text/javascript " >
     
// 定义了城市的二维数组,里面的顺序跟省份的顺序是相同的。通过selectedIndex获得省份的下标值来得到相应的城市数组
     var city = [
     [
" 北京 " , " 天津 " , " 上海 " , " 重庆 " ],
     [
" 南京 " , " 苏州 " , " 南通 " , " 常州 " ],
     [
" 福州 " , " 福安 " , " 龙岩 " , " 南平 " ],
     [
" 广州 " , " 潮阳 " , " 潮州 " , " 澄海 " ],
     [
" 兰州 " , " 白银 " , " 定西 " , " 敦煌 " ]
     ];
 
     function getCity()
{
         
// 获得省份下拉框的对象
         var sltProvince = document.form1.province;
         
// 获得城市下拉框的对象
         var sltCity = document.form1.city;
         
         
// 得到对应省份的城市数组
         var provinceCity = city[sltProvince.selectedIndex  -   1 ];
 
         
// 清空城市下拉框,仅留提示选项
         sltCity.length = 1 ;
 
         
// 将城市数组中的值填充到城市下拉框中
          for (var i = 0 ;i < provinceCity.length;i ++ ) {
             sltCity[i
+ 1 ] = new  Option(provinceCity[i],provinceCity[i]);
         }

     }

 
</ script >
 
</ HEAD >
 
 
< BODY >
 
< FORM METHOD = POST ACTION = ""  name = " form1 " >
         
< SELECT NAME = " province "  onChange = " getCity() " >
             
< OPTION VALUE = " 0 " > 请选择所在省份  </ OPTION >
             
< OPTION VALUE = " 直辖市 " > 直辖市  </ OPTION >
             
< OPTION VALUE = " 江苏省 " > 江苏省  </ OPTION >
             
< OPTION VALUE = " 福建省 " > 福建省  </ OPTION >
             
< OPTION VALUE = " 广东省 " > 广东省  </ OPTION >
             
< OPTION VALUE = " 甘肃省 " > 甘肃省  </ OPTION >
         
</ SELECT >
         
< SELECT NAME = " city " >
             
< OPTION VALUE = " 0 " > 请选择所在城市  </ OPTION >
         
</ SELECT >
     
</ FORM >
 
</ BODY >
 
</ HTML >  

--------------------------------------------------------------
能够根据自定义的菜单数据和select,自动设置联级的下拉菜单,可定义默认值。

效果:


其中参数1是菜单结构:
菜单对象

参数2是select的id集合(按顺序):
var sel=["sel1","sel2","sel3","sel4","sel5"]

可设置默认值(按顺序):
var val=["3 ->""3_1 ->""3_1_2"];

源码:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>JavaScript 自定义多级联动下拉菜单</title>
<script type="text/javascript">
var $ = function (id) {
    
return "string" == typeof id ? document.getElementById(id) : id;
};

function addEventHandler(oTarget, sEventType, fnHandler) {
    
if (oTarget.addEventListener) {
        oTarget.addEventListener(sEventType, fnHandler, 
false);
    } 
else if (oTarget.attachEvent) {
        oTarget.attachEvent(
"on" + sEventType, fnHandler);
    } 
else {
        oTarget[
"on" + sEventType] = fnHandler;
    }
};

function Each(arrList, fun){
    
for (var i = 0, len = arrList.length; i < len; i++) { fun(arrList[i], i); }
};

function GetOption(val, txt) {
    
var op = document.createElement("OPTION");
    op.value 
= val; op.innerHTML = txt;
    
return op;
};

var Class = {
  create: 
function() {
    
return function() {
      
this.initialize.apply(this, arguments);
    }
  }
}

Object.extend 
= function(destination, source) {
    
for (var property in source) {
        destination[property] 
= source[property];
    }
    
return destination;
}


var CascadeSelect = Class.create();
CascadeSelect.prototype 
= {
  
//select集合,菜单对象
  initialize: function(arrSelects, arrMenu, options) {
    
if(arrSelects.length <= 0 || arrMenu.lenght <= 0return;//菜单对象
    
    
var oThis = this;
    
    
this.Selects = [];//select集合
    this.Menu = arrMenu;//菜单对象
    
    
this.SetOptions(options);
    
    
this.Default = this.options.Default || [];
    
    
this.ShowEmpty = !!this.options.ShowEmpty;
    
this.EmptyText = this.options.EmptyText.toString();
    
    
//设置Selects集合和change事件
    Each(arrSelects, function(o, i){
        addEventHandler((oThis.Selects[i] 
= $(o)), "change"function(){ oThis.Set(i); });
    });
    
    
this.ReSet();
  },
  
//设置默认属性
  SetOptions: function(options) {
    
this.options = {//默认值
        Default:    [],//默认值(按顺序)
        ShowEmpty:    false,//是否显示空值(位于第一个)
        EmptyText:    "请选择"//空值显示文本(ShowEmpty为true时有效)
    };
    Object.extend(
this.options, options || {});
  },
  
//初始化select
  ReSet: function() {
  
    
this.SetSelect(this.Selects[0], this.Menu, this.Default.shift());
    
this.Set(0);
  },
  
//全部select设置
  Set: function(index) {
    
var menu = this.Menu
    
    
//第一个select不需要处理所以从1开始
    for(var i=1, len = this.Selects.length; i < len; i++){
        
if(menu.length > 0){
            
//获取菜单
            var value = this.Selects[i-1].value;
            
if(value!=""){
                Each(menu, 
function(o){ if(o.val == value){ menu = o.menu || []; } });
            } 
else { menu = []; }
            
            
//设置菜单
            if(i > index){ this.SetSelect(this.Selects[i], menu, this.Default.shift()); }
        } 
else {
            
//没有数据
            this.SetSelect(this.Selects[i], [], "");
        }
    }
    
//清空默认值
    this.Default.length = 0;
  },
  
//select设置
  SetSelect: function(oSel, menu, value) {
    oSel.options.length 
= 0; oSel.disabled = false;
    
if(this.ShowEmpty){ oSel.appendChild(GetOption(""this.EmptyText)); }
    
if(menu.length <= 0){ oSel.disabled = truereturn; }
    
    Each(menu, 
function(o){
        
var op = GetOption(o.val, o.txt ? o.txt : o.val); op.selected = (value == op.value);
        oSel.appendChild(op);
    });    
  },
  
//添加菜单
  Add: function(menu) {
    
this.Menu[this.Menu.length] = menu;
    
this.ReSet();
  },
  
//删除菜单
  Delete: function(index) {
    
if(index < 0 || index >= this.Menu.length) return;
    
for(var i = index, len = this.Menu.length - 1; i < len; i++){ this.Menu[i] = this.Menu[i + 1]; }
    
this.Menu.pop()
    
this.ReSet();
  }
};


window.onload
=function(){
    
    
var menu = [
        {
'val''1''txt''value'},
        {
'val''2 ->''menu': [
            {
'val''2_1'},
            {
'val''2_2'}
        ]},
        {
'val''3 ->''menu': [
            {
'val''3_1 ->''menu': [
                {
'val''3_1_1'},
                {
'val''3_1_2'}
            ]},
            {
'val''3_2'}
        ]},
        {
'val''4 ->''menu': [
            {
'val''4_1 ->''menu': [
                {
'val''4_1_1 ->''menu': [
                    {
'val''4_1_1_1'}
                ]}
            ]}
        ]}
    ];
    
    
var sel=["sel1""sel2""sel3""sel4""sel5"];
    
    
var val=["3 ->""3_1 ->""3_1_2"];
    
    
var cs = new CascadeSelect(sel, menu, { Default: val });
    
    $(
"btnA").onclick=function(){cs.ShowEmpty=!cs.ShowEmpty;}
    
    $(
"btnB").onclick=function(){
        cs.Add(
            {
'val''5 ->''menu': [
                {
'val''5_1 ->''menu': [
                    {
'val''5_1_1 ->''menu': [
                        {
'val''5_1_1_1 ->''menu': [
                            {
'val''5_1_1_1_1'}
                        ]}
                    ]}
                ]}
            ]}
        )
    }
    
    $(
"btnC").onclick=function(){
        cs.Delete(
3)
    }
}
</script>

<style type="text/css">
.sel select
{ width:100px;}
</style>

</head>
<body>

<div class="sel">
<select id="sel1"></select>
<select id="sel2"></select>
<select id="sel3"></select>
<select id="sel4"></select>
<select id="sel5"></select>
</div>
<br />
<div>
<input id="btnA" type="button" value="显示/不显示空值" />
<input id="btnB" type="button" value="添加菜单" />
<input id="btnC" type="button" value="减少菜单" />

</div>
</body>
</html>

转载请注明出处:http://www.cnblogs.com/cloudgamer/


只有注册用户登录后才能发表评论。


网站导航: