DynamicOptionList连动菜单代码
时间:2021-07-01 10:21:17
帮助过:16人阅读
使用前请看一下说明,不会耽误你多少时间,明白以后有助你快速实现这个小功能,实际上非常简单,与你使用的开发语言也没有什么关系: 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需刷新才能执行]