六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 94|回复: 0

javascript html js 自定义多级联动下拉菜单,自定义select联动

[复制链接]

升级  61.3%

726

主题

726

主题

726

主题

探花

Rank: 6Rank: 6

积分
2226
 楼主| 发表于 2013-2-7 20:55:13 | 显示全部楼层 |阅读模式
其中参数1是菜单结构:

菜单对象
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'}            ]}        ]}    ]}];

参数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>


转自:http://www.cnblogs.com/cloudgamer/archive/2008/06/24/1228736.html

黑色头发:http://heisetoufa.iteye.com/
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

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