JavaScript 多级联动select

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

参数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 <= 0) return;//菜单对象
    
    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 = true; return; }
    
    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>

本文转自博客园cloudgamer的博客,原文链接:JavaScript 多级联动select,如需转载请自行联系原博主。

时间: 2024-10-08 12:54:13

JavaScript 多级联动select的相关文章

JavaScript 多级联动浮动菜单

菜单使用演示: 位置: 第四个 第三个 第二个 第一个 1秒 0.5秒 0.2秒 不延时 仿京东商城商品分类菜单: 图片动画 图片效果 动画效果 系统其他 系统效果 其他效果 图片滑动切换效果 图片变换效果(ie only) 图片滑动展示效果 图片切割效果 Tween算法及缓动效果 渐变效果 无刷新多文件上传系统 图片切割系统 拖放效果 拖拉缩放效果 滑动条效果 仿淘宝拼音索引菜单: Tag索引 Table Fixed Color Date Select Table行定位效果 Table排序 浮

JavaScript 多级联动浮动(下拉)菜单 (第二版)

上一个版本(第一版请看这里)基本实现了多级联动和浮动菜单的功能,但效果不是太好,使用麻烦还有些bug,实用性不高. 这次除了修改已发现的问题外,还对程序做了大幅调整和改进,使程序实用性更高,功能更强大. 效果预览 菜单使用演示:  仿京东商城商品分类菜单:  仿window xp右键菜单:  仿淘宝拼音索引菜单:  程序原理 程序最关键的地方是多级联动,先大概说明一下: 首先第一级的菜单元素整理好后,从他们开始,当某个菜单元素触发显示下级菜单时, 准备好下一级的容器元素,并把下一级的菜单元素放进

jQuery制作简洁的多级联动Select下拉框_jquery

今天我们要来分享一款很实用的jQuery插件,它是一个基于jQuery多级联动的省市地区Select下拉框,并且值得一提的是,这款联动下拉框是经过自定义美化过的,外观比浏览器自带的要漂亮许多.另外,这个Select下拉框也可以绑定下拉事件,并获取当前选中项的值. html代码: 复制代码 代码如下:  <div class="wrap">         <div class="nice-select" name="nice-select

javascript实现多级联动下拉菜单的方法_javascript技巧

本文实例讲述了javascript实现多级联动下拉菜单的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: <SCRIPT LANGUAGE="JavaScript"> <!-- Begin var arrItems1 = new Array(); var arrItemsGrp1 = new Array(); arrItems1[3] = "列二"; arrItemsGrp1[3] = 1; arrItems1[4] = &qu

JS二级、多级联动的简单实例

 本篇文章主要是对超简单JS二级.多级联动的简单实例进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助 超简单的JS联动代码,不过要配合jquery用,也可以自己修改为不用任选JS库的代码  代码如下: <tr>   <th>一级分类</th><td>     <select name="subsidiary_cat_id" class="subsidiary_cat_id" onchange="

jQuery EasyUI编辑DataGrid用combobox实现多级联动_jquery

我在项目中设计课程表的时候需要用到老师和分类之间的多级联动. 首先是一张效果图: 下面是实现的代码: <body> <script type="text/javascript"> $(function(){ var editing ; //判断用户是否处于编辑状态 var flag ; //判断新增和修改方法 $('#set_schedule').datagrid({ idField:'id' , fitColumns: false , url:'schedul

jquery 实现二级/三级/多级联动菜单的思路及代码_jquery

本文介绍使用jQuery的AJAX功能和asp.net来实现省市区的三级联动效果,其他二级.三级或多级联动也可以按照此方法完成. 文章中涉及到的数据表为City,为方便管理. 设计此表如下 ID:自增长字段 City_Name:城市名称 City_Code:城市代码 我们根据城市代码来查询省.市.区.城市代码结构大致如下: 内蒙古:150000,呼和浩特:150100,新城区:150101. 其他地区代码与此一样,省级为省级编号+0000,市级为省级编号+市级编号+00,地区为省级编号+市级编号

jQuery实现多级联动下拉列表查询框_jquery

本文实例介绍了jQuery实现多级联动下拉列表查询框的详细代码,分享给大家供大家参考,具体内容如下  效果图: 具体代码: <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title></title> <meta name="keywords" content

jQuery插件cxSelect多级联动下拉菜单实例解析_jquery

随着电商的火爆,这多级联动下拉菜单体现的更加充分,最明显的就是地址的多级联动下拉选择,所以这里就简单的分享一下 jQuery cxSelect 多级联动下拉菜单cxSelect 是基于 jQuery 的多级联动菜单插件,适用于省市.商品分类等联动菜单. 列表数据通过 AJAX 获取(需要在服务器环境运行),也可以使用变量自定义,数据内容使用 JSON 格式. 提供国内省市县数据(数据来源:basecss/cityData Date: 2014.03.31) 个人一直都有习惯,当有新知识点需要学习