DynamicOptionList连动菜单代码

DarwinNewman · 发布于 2017-01-11 · 字数16446 · 浏览 707 · 评论 0

使用前请看一下说明,不会耽误你多少时间,明白以后有助你快速实现这个小功能,实际上非常简单,与你使用的开发语言也没有什么关系:

1. <option selected value=”all”>==查看所有==</option>
这个下拉项可以保留或忽略,内容如“==查看所有==”可替换为自己需要的内容,value=”all” 属性可以获得一个附加的全过滤显示功能,建议保留:)

2.下拉菜单数据格式,(实际开发可以由后台程序生成一个数据格式字符串,这个数据串格式和你查询的表结构应该是一样的,传到模板上取得这个数据格式串即可,所有下拉菜单数据是一次传到页面上的,并且与你使用的语言开发实现没有什么关系,只要你想办法得到这个字符串格式就行了)如下:

a.第一级连动菜单的下拉选项,格式为 (下拉选项option内容,下拉选项option值;……)

“上海,01;江西,02”;

b. 第二级连动菜单的下拉选项,(子下拉选项option过滤值,子下拉选项option内容,子下拉选项option值;……)

“01,徐汇区,001;01,嘉定区,002;01,黄浦区,003;02,南昌市,004;02,九江市,005;02,上饶市,006”;

c. 第三级连动菜单的下拉选项,(子下拉选项option过滤值,子下拉选项option内容,子下拉选项option值;……)

“001,徐汇1区,0001;002,嘉定1区,0002;003,黄浦1区,0003;004,南昌1市,0004;005,九江1市,0005;006,上饶1市,0006”;
.
.
.
第 N 级连动菜单的下拉选项,(子下拉选项option过滤值,子下拉选项option内容,子下拉选项option值;……)

除了第一级没有子下拉选项option过滤值这一项外,其他子集都有子下拉选项option过滤值

3.实际可实现N级连动菜单,只要由当前菜单驱动它的子菜单即可,类似与责任链模式;

4.实际开发将<head> …</head> 中的3个方法放至在一个单独的脚本文件里面,并引入它,只要在页面调用方法即可,这样就会发现实现这个功能很简洁,调用的方法也很自然;

5.下文举了4个例子,实际都一样,只是名字和样式不一样而已,名称后缀(‘_’下划线作为后缀的分隔符)不是必要的;
代码如下:

<html>
<head>
<title>List</title>
<meta http-equiv=”Content-Type” content=”text/html; charset=gb2312″>
<script LANGUAGE=”javascript”>
<!–
//测试用的一组数据

//第1级下拉菜单数据
var opt = “上海,01;江西,02”;

//第2级下拉菜单数据
var subopt = “01,徐汇区,001;01,嘉定区,002;01,黄浦区,003;02,南昌市,004;02,九江市,005;02,上饶市,006”;

//第3级下拉菜单数据
var subsubopt = “001,徐汇1区,0001;002,嘉定1区,0002;003,黄浦1区,0003;004,南昌1市,0004;005,九江1市,0005;006,上饶1市,0006”;

/**
* get Element By Id or name.
* 根据一个dom对象的名称返回这个对象,省略了你
* 直接操作document.getElementById的过程.
*
* 例如: $(‘默认文本框的名称’).value
* 就可以取得它的value
*/
function $() {
var elements = new Array();

for (var i = 0; i < arguments.length; i++) {
var element = arguments[i];
if (typeof element == ‘string’)
element = document.getElementById(element);

if (arguments.length == 1)
return element;

elements.push(element);
}

return elements;
}

/*
* 自动填充一个下拉列表,一般用于填充连动菜单的第一项
*
* selname :: 当前下拉选项(this)
* 后缀是为了区分由程序动态生成的如果有多个相同的下拉选项而设
* 置的一个辅助名称后缀(‘_’下划线作为后缀的分隔符),如果没有这
* 个需要可以忽略 “_后缀”,只要设置一个普通的名称即可.
*
* seldata :: 数据源,菜单的数据项(子下拉选项名称,子下拉选项值,子下拉选项过滤值)
* filter :: 下拉选项的过滤条件
*
*/
function fillselect(selname,seldata,filters) {
var sel = $(selname);
var data = seldata.split(“;”);
var filtersdata = filters.split(“;”);

var index = “”;
var selkey = “”;
var selvalue = “”;

if(data.length > 0) {

//过滤条件为’all’,显示全部,用于连动菜单
if(filtersdata[0] == ‘all’) {
sel.options[0] = new Option(‘==查看所有==’,’all’);

for(i=0; i < data.length; i++) {
selkey = data[i].split(“,”)[1];
selvalue = data[i].split(“,”)[2];
sel.options[sel.length] = new Option(selkey,selvalue);
}

return;
}

sel.options[0] = new Option(‘==查看所有==’,’all’);
for(i=0;i < data.length; i++) {

//有过滤条件的下拉项(连动菜单数据格式)
if (data[i].split(“,”).length == 3) {
for(j=0; j < filtersdata.length; j++){
if( (data[i].split(“,”)[0] == filtersdata[j]) ) {
selkey = data[i].split(“,”)[1];
selvalue = data[i].split(“,”)[2];
sel.options[sel.length] = new Option(selkey,selvalue);
}
}
}

//无过滤条件的下拉项(非连动菜单数据格式)
if (data[i].split(“,”).length == 2) {
selkey = data[i].split(“,”)[0];
selvalue = data[i].split(“,”)[1];
sel.options[sel.length] = new Option(selkey,selvalue);
}

}

if (sel.length == 1) {
sel.options[0] = new Option(‘==没有选项==’,”);
}else{

}
}
}

/*
* 连动下拉列表的驱动函数
*
* selname_src :: 当前下拉选项(this)
*
* subselname_src :: 所要驱动的子下拉选项的名称(名称结构为: 名称_后缀 或 名称)
* 后缀是为了区分由程序动态生成的如果有多个相同的下拉选项而设
* 置的一个辅助名称后缀(‘_’下划线作为后缀的分隔符),如果没有这
* 个需要可以忽略 “_后缀”,只要设置一个普通的名称即可.
*
* subseldata_src :: 数据源,被驱动菜单的数据项.
* 数据源格式 : (子下拉选项option过滤值,子下拉选项option内容,子下拉选项option值;……)
*
*/
function driverselect(selname_src,subselname_src,subseldata_src) {

var index = “”, selkey = “”, selvalue = “”;

var selName=””, selSuffix=””;
var subselName=””, subselSuffix=””;

if(selname_src.name.split(“_”).length==2) {
selName=selname_src.name.split(“_”)[0];
selSuffix=”_” + selname_src.name.split(“_”)[1];
}else{
selName=selname_src.name;
}

if(subselname_src.split(“_”).length==2) {
subselName=subselname_src.split(“_”)[0];
subselSuffix=”_” + subselname_src.split(“_”)[1];
}else{
subselName=subselname_src;
}

var source = $(selName+selSuffix);
var target = $(subselName+subselSuffix);
target.length=1;

var filters = “”;
for(j=0; j < source.length; j++) {
if(source[j].selected){
filters = filters + source[j].value + ‘;’;
}
}

fillselect(target,subseldata_src,filters);
}

//–>
</script>
</head>
<body>
<form name=”myform” method=”post”>

sample1:

<select name=”sel_1″ onChange=”driverselect(this,’subsel_1′,subopt)”>
<option selected value=”all”>==查看所有==</option>
</select>
<select name=”subsel_1″ onChange=”driverselect(this,’subsubsel_1′,subsubopt)”>
<option selected value=”all”>==查看所有==</option>
</select>
<select name=”subsubsel_1″>
<option selected value=”all”>==查看所有==</option>
</select>

<br><br>

sample2:

<select name=”sel_2″ onChange=”driverselect(this,’subsel_2′,subopt)”>
<option selected value=”all”>==查看所有==</option>
</select>
<select name=”subsel_2″ onChange=”driverselect(this,’subsubsel_2′,subsubopt)”>
<option selected value=”all”>==查看所有==</option>
</select>
<select name=”subsubsel_2″>
<option selected value=”all”>==查看所有==</option>
</select>

<br><br>

sample3:

<select name=”selM_1″ MULTIPLE size=”5″ onChange=”driverselect(this,’subselM_1′,subopt)” >
<option selected value=”all”>==查看所有==</option>
</select>
<select name=”subselM_1″ MULTIPLE size=”5″ onChange=”driverselect(this,’subsubselM_1′,subsubopt)”>
<option selected value=”all”>==查看所有==</option>
</select>
<select name=”subsubselM_1″ MULTIPLE size=”5″>
<option selected value=”all”>==查看所有==</option>
</select>

<br><br>

sample4:

<select name=”selM_2″ MULTIPLE size=”5″ onChange=”driverselect(this,’subselM_2′,subopt)”>
<option selected value=””>==查看所有==</option>
</select>
<select name=”subselM_2″ MULTIPLE size=”5″ onChange=”driverselect(this,’subsubselM_2′,subsubopt)”>
<option selected value=””>==查看所有==</option>
</select>
<select name=”subsubselM_2″ MULTIPLE size=”5″>
<option selected value=””>==查看所有==</option>
</select>

<br><br>

</form>

<SCRIPT LANGUAGE=”JavaScript”>
<!–
//初始化sample1:第一个下拉菜单项
fillselect(‘sel_1’,opt,”);

//初始化sample2:第一个下拉菜单项
fillselect(‘sel_2’,opt,”);

//初始化sample3:第一个下拉菜单项
fillselect(‘selM_1’,opt,”);

//初始化sample4:第一个下拉菜单项
fillselect(‘selM_2’,opt,”);
//–>
</SCRIPT>
</body>
</html>


[Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]

本文系作者 DarwinNewman 授权问说网发表,并经问说网编辑,转载请注明出处和 本文链接

相关文章

  • 2014-12-03设计之道:使用NUnit测试新创建的库和创建GUI
  • 2017-01-19用JavaScript实现给出的盒子的序列是否可连为一矩型
  • 2016-12-02FlyJSONP轻量级的跨域AJAX请求插件
  • 2016-03-29详解Web中PJAX的实现与应用实例
  • 2016-12-02Response JS创建高性能的支持移动设备的网站
  • 2016-05-17设计师的配色理论:你理解这些色彩术语吗?
  • 2016-06-24配置和查看Apache运行性能监控状态
  • 2016-07-02jQuery Scroll Path按路径元素滚动动画插件
  • 发布评论

    为您推荐

    用JavaScript实现给出的盒子的序列是否可连为一矩型
    AustenJuliet · 发布于 2017-01-19

    用JavaScript实现给出的盒子的序列是否可连为一矩型

    by cpglkg <script>var arr=[5,10,15];function rect(arr,width){ arr.sort(fun…

    问说网 · 发布于 2016-12-02

    FlyJSONP轻量级的跨域AJAX请求插件

    FlyJSONP是一个JavaScript库,用于实现跨域GET和POST请求服务,支持JSONP,并取得一个JSON格式的数据响应,这个Library具有易于…

    经验分享!响应式文字排版中的关键点

    当我们建立网站的时候,我们一般从定义正文开始。正文的定义显示了你的主栏有多宽,其它几栏的大小就随它自己内容定义了。直到最近,各种屏幕分辨率或多或少是同质化的。如…

    • 经验分享!响应式文字排版中的关键点
    • 经验分享!响应式文字排版中的关键点
    • 经验分享!响应式文字排版中的关键点
    • 经验分享!响应式文字排版中的关键点
    张雪华 · 发布于 2016-05-17 · 浏览 1031 · 评论 0
    问说网 · 发布于 2016-05-19

    MFC中Doc/View/Frame互相调用

    Document/View模式,是为了在逻辑上,让数据和显示分开,一般在Document里,定义Document类的成员变量,来存数据,并用View来显示。

    问说网 · 发布于 2016-06-01

    使用Zepto开发应用的注意点和技巧

    但是在开发过程中,我发现 Zepto 还远未成熟,其中包含了一些或大或小的“坑”,与 jQuery的差距还是很明显的,所以写篇文章记录下,希望对后来者有帮助。

    ResponsiveSlides.js基于jQuery响应式幻灯片插件
    问说网 · 发布于 2016-06-12

    ResponsiveSlides.js基于jQuery响应式幻灯片插件

    ResponsiveSlides.js 是一个微型的 jQuery 插件用来创建响应式的幻灯展示效果,对 <ul< 标签中的图片进行自动幻灯展示,支…

    LionBars创建类似OSX Lion操作系统风格的滚动条
    问说网 · 发布于 2016-07-14

    LionBars创建类似OSX Lion操作系统风格的滚动条

    今天介绍一款超酷的帮助你生成OSX式样的滚动条的jQuery插件Lionbars,使用这个插件,你可以快速的生成一个OSX风格的滚动条。绝对能够让你的UI界面充…

    问说网 · 发布于 2016-07-15

    全局唯一GUID生成方案对比分析

    全局唯一标识符是一种由算法生成的二进制长度为128位的数字标识符。GUID主要用于在拥有多个节点、多台计算机的网络或系统中。在理想情况下,任何计算机和计算机集群…

    问说网手机版

    躺着 站着 跪着轻松访问

    更多详情 关于作者

    DarwinNewman

    这个人比较懒,什么都没有填写!

    96 文章
    0 评论
    1373 人气

    更多 热门话题

    APP界面

    关注 APP界面

    文章 41506 · 浏览 1574

    APP欣赏

    关注 APP欣赏

    文章 41427 · 浏览 1506

    APP手机界面

    关注 APP手机界面

    文章 41417 · 浏览 1522

    图片素材

    关注 图片素材

    文章 29463 · 浏览 1026

    高清图片

    关注 高清图片

    文章 26530 · 浏览 1217

    更多 推荐作者

    关注 秋天的孤寂

    文章 99 · 评论 0

    关注 怎麽继续

    文章 90 · 评论 2

    关注 倾听寂寞

    文章 83 · 评论 0

    关注 溫柔的溫柔

    文章 91 · 评论 0

    关注 走了留下什么

    文章 110 · 评论 0

    关注 莪很迷茫

    文章 97 · 评论 0

    顶部 反馈 评论 底部

    意见反馈

    感谢您对问说网的支持,提出您在使用过程中遇到的问题或宝贵建议,您的反馈对我们产品的完善有很大帮助。

    您的反馈我们已收到!

    感谢您提供的宝贵意见,我们会在1-2个工作日,通过您留下的联系方式将处理结果反馈给您!