`
cloudgamer
  • 浏览: 59494 次
  • 性别: Icon_minigender_1
  • 来自: 顺德
社区版块
存档分类
最新评论

JavaScript 多级联动select

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

效果:
<style type="text/css"> .sel select{ width:100px;} </style> <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(); } }; </script>

<script type="text/javascript"> 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>
其中参数1是菜单结构:
菜单对象
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->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 <= 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'color: #000000; background-color: #f5f
分享到:
评论

相关推荐

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

    NULL 博文链接:https://heisetoufa.iteye.com/blog/353661

    vueaddressaync是一个异步的多级地址联动select组件

    vue-address-aync是一个异步的多级地址联动select组件。select元素可以通过异步接口获取数据之后,实现多级联动,因此它不单单可用于多级的地址选择,还可以支持其他的异步多级select联动。

    动态多级联动多级城市JQ插件selectlinkagejq

    动态多级联动 多级城市 JQ插件 select linkage jq

    LinkageSel Javascript 无限多级联动下拉菜单

    多级联动,支持Ajax动态获取数据并缓存数据,动态生成下级select菜单,设置动态生成"option"第一个条目作为提示项,自动选择唯一选项的菜单,设置回调函数在onChange事件触发时获取下拉菜单相关信息。 详细功能及...

    jQuery ajax 多级联动 下拉框 Demo

    &lt;script type="text/javascript"&gt; $(function () { $.fn.CascadeSelect({ url: '/CascadeSelect/CascadeSelect.ashx', //返回Json数据的一般处理文件 idKey: 'Id', // 绑定下拉框实际值的字段 nameKey: '...

    district是一款jQuery多级下拉菜单联动插件

    district 是一款 jQuery 插件,主要用于多级菜单联动(如省市县),可根据自己需求定制。支持 jQuery.select2(优化下拉菜单插件)插件,支持原生 select(下拉菜单)。

    JS简单实现多级Select联动菜单效果代码

    主要介绍了JS简单实现多级Select联动菜单效果代码,涉及JavaScript数组元素的遍历及动态设置select的实现技巧,需要的朋友可以参考下

    js_area_select.rar_area-select_area_select_area_select._js selec

    不错的javascript地区联动,可以实现一级,二级,或多级联动,可根据自己需要调整.

    cxSelect:jQuery cxSelect多级联动拖放菜单

    jQuery cxSelect cxSelect是基于jQuery的多级联动菜单插件,适用于省市,商品分类等联动菜单。列表数据通过AJAX获取,也可以自定义,数据内容使用JSON格式。同时兼容Zepto,方便在移动端使用。版本: jQuery v1.7 + ...

    jQuery多级联动下拉插件chained用法示例

    本文实例讲述了jQuery多级联动下拉插件chained用法。分享给大家供大家参考,具体如下: &lt;!DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.0 Transitional//EN ...&lt;... ...Ch

    JavaScript完全自学宝典 源代码

    6.6.html 多级下拉列表联动。 6.7.html 各种使用JavaScript获取复选框值的方法。 6.8.html JavaScript控制复选框。 6.9.html 复选框的JavaScript特效。 6.10.html JavaScript取单选框的值。 ...

    jQuery中Chosen三级联动功能实例代码

    Chosen 是一个JavaScript插件,它能让丑陋的、很长的select选择框变的更好看、更方便,不仅如此,它更扩大了,增长了主动筛选的功能。接下来通过本文给大家分享chosen 三级联动功能,一起看看吧

    lhgselect 联动下拉菜单Select插件 v1.0

    摘要:脚本资源,jQuery,联动菜单,jQuery插件 lhgselect 联动下拉菜单Select插件,同样是基于jQuery,部分代码修改自ZhouFan的通用JavaScript联动下拉菜单。本插件可让你快速在网页上建立多级的Selcet级联菜单,示例...

    mobile-select:移动端选择组件,支持级联(类似省市区)与非级联

    mobile-select移动端选择组件,支持级联(类似省市区)与非级联引入由于组件用到了modernizr的prefixed功能,所以需要引入modernizr.js&lt;link rel="stylesheet" href="index.css"&gt;[removed][removed][removed]...

    JS实现弹出层锁定窗口(改进版).txt

    由于ajaxtag在多级联动时,preFunction和postFunction被调用了多次,所以导致NeatDialog对象新增删除出现了问题 为了解决这个问题,我参照了Yahoo UI的设计思路,即在页面装载或者初始化时,把NeatDialog也装载或者...

    droplist:模拟选择

    droplist 版本:0.6 教程: ...[+] 增加由json数据渲染多级联动select功能,支持单选联动、多选联动、混合联动 [+] 增加了droplist的样式钩子,可配置样式名。config属性名: droplistCls [+] 从现有se

    linkage-selector:html 的链接选择

    不限制级数 : 可以是2级、3级、4级等多级联动菜单 #浏览器支持 IE10+及各大主流浏览器(Chrome, FireFox, Safari, Opera)的最新的几个版本。 #使用方法 使用方法非常简单,您只需要3步: ##1.设置三个参数。 data-role...

    myDemo:学习中做的一些小玩意

    ###学习过程中写的一些小例子 JS相关 map:调用百度地图API的一个小例子 select:简单的select多级联动 scrollLoad:滚动加载 2048: css相关 flip:实现简单的翻转效果 3dlist:3d滚动效果的列表 by yanxinyu

    精通JS脚本之ExtJS框架.part2.rar

    12.3.1 多级联动菜单 12.3.2 Ajax修改用户密码 12.3.3 自动保存的网络记事本 12.3.4 网页计算器 第13章 设计数据驱动模式 13.1 XML/JSON数据格式比较 13.2 容器类MixedCollection 13.3 数据存储基本单元...

Global site tag (gtag.js) - Google Analytics