`
cloudgamer
  • 浏览: 61047 次
  • 性别: 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
分享到:
评论

相关推荐

    省市区 ajax多级联动 select

    在网页开发中,"省市区 ajax多级联动 select" 是一种常见的交互设计,主要用于用户填写地址信息时,通过联动下拉框的方式展示省、市、区的层级结构。这种功能通常利用 AJAX(异步JavaScript和XML)技术实现,与...

    js select多级联动

    在JavaScript编程中,"js select多级联动"是一种常见的交互设计技术,主要用于创建具有层级关系的下拉选择框。这种技术常用于展示如地区选择、组织结构或产品分类等具有层次结构的数据。在这个场景中,当用户在第一...

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

    在JavaScript、HTML和JS的世界里,自定义多级联动下拉菜单是一种常见的交互设计,它通常用于提升用户体验,尤其是在处理复杂的数据层级结构时。本文将深入探讨如何利用这些技术实现自定义的select联动效果。 首先,...

    select多级动态联动

    在多级联动中,通常会有多个`&lt;select&gt;`元素,它们之间的关系是父级与子级的关系。当用户在父级`&lt;select&gt;`中选择一个选项时,子级`&lt;select&gt;`的内容会根据这个选择动态更新。 实现多级联动的基本步骤如下: 1. 创建...

    Select-下拉列表多级联动

    在下拉列表多级联动中,Prototype可能会被用来监听`&lt;select&gt;`元素的`change`事件,然后根据用户的选取更新其他下拉列表的内容。 3. **linkage.js**:这是一个自定义的JavaScript脚本,负责实现下拉列表的联动逻辑。...

    ajax json select 多级联动

    以上就是使用Ajax、JSON和`&lt;select&gt;`实现多级联动的基本流程。在实际项目中,可能还需要考虑错误处理、数据缓存、性能优化等问题。同时,随着前端技术的发展,现代框架如React、Vue等提供了更高效、更便捷的方式来...

    很好用的多级联动

    在提供的文件列表中,`selectArea.html`很可能是实现这个多级联动选择器的HTML页面,它包含了相关的HTML结构和可能的JavaScript绑定事件。HTML文件通常会包含若干个`&lt;select&gt;`元素,每个`&lt;select&gt;`代表一个级别的...

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

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

    ajax多级联动菜单

    【Ajax多级联动菜单】是一种常见的前端交互设计,它允许用户在选择某个菜单项时,自动更新下一级菜单的内容,以此类推,实现多级菜单之间的动态关联。这种技术广泛应用于网页表单填写、筛选器等场景,为用户提供更加...

    JS多级联动下拉列表(自定义级数)

    本文将详细介绍如何使用原生JavaScript实现一个可自定义级数的多级联动下拉列表,以及如何根据提供的"demo"文件进行应用。 首先,我们需要了解多级联动的基本原理。在联动下拉列表中,当用户在一个下拉列表中选择一...

    JS下拉框多级联动--出生日期和世界各国

    本文档将详细介绍如何使用JavaScript实现下拉框的多级联动功能,具体应用在两个场景:一是用户选择出生日期(年、月、日);二是用户选择国籍或常驻国家。这两种场景都是实际开发中常见的需求,通过实现这些功能可以...

    jQuery多级联动美化版Select下拉框插件.zip

    jQuery作为一款强大的JavaScript库,提供了丰富的插件来增强这些功能,其中包括多级联动及美化版的Select下拉框。本篇将深入探讨"jQuery多级联动美化版Select下拉框插件",以帮助开发者更好地理解和运用这一工具。 ...

    Web数据多级联动

    在Web开发中,多级联动是指在一个表单中通过选择一个选项来动态加载下一个级别的选项列表。这种交互方式常见于地区选择器(例如省份-城市-区县)、分类选择器等场景。本文将详细介绍如何使用PHP与MySQL数据库技术...

    json实现多级联动

    在本话题中,我们将探讨如何利用JSON来实现多级联动的效果,这是一种常见的前端交互功能,例如在选择省份后自动更新城市选项,或者在选择类别后显示子类别的选项。 多级联动通常涉及到多个下拉框或列表,它们之间...

    多款多级联动下拉菜单打包!必有一款适合你!

    5. **ext.rar**:EXT.js是一个流行的JavaScript库,用于构建富客户端应用,这个rar文件可能包含EXT.js框架下的多级联动下拉菜单组件。 6. **MultilevelSelect-5265.rar**:"MultilevelSelect"直译为多级选择,这...

    jquery -- select美化--多级联动下拉

    标题 "jquery -- select美化--多级联动下拉" 指的是利用 jQuery 插件来实现 Select 的美化和多级联动效果。这种技术可以提升用户体验,使得用户在选择过程中能够更加直观、便捷地找到目标选项。 首先,jQuery 插件...

    基于vuejs的多级联动地址选择器

    本篇文章将详细讲解如何利用Vue.js实现一个基于多级联动的地址选择器,同时也会涉及一些CSS相关的技巧,以帮助开发者创建更美观且功能丰富的界面。 首先,我们要理解多级联动地址选择器的基本概念。它通常由省、市...

    javascript 联动列表 多级

    JavaScript联动列表是一种交互式的网页元素,它通常用于创建下拉菜单之间...实现多级联动需要对JavaScript有深入的理解,同时也需要考虑性能和用户体验。通过不断实践和优化,可以创建出更高效、更流畅的联动列表效果。

Global site tag (gtag.js) - Google Analytics