`
senton
  • 浏览: 205683 次
  • 性别: Icon_minigender_1
  • 来自: 紫禁城
社区版块
存档分类
最新评论

发布一个支持N级下拉列表联动的控件

    博客分类:
  • Web
阅读更多
最近,由于工作的需要,写了一个联动下拉列表控件,理论上支持N级联动,后台可以使用java的Spring3 MVC的@ResponseBody标注来返回数据(我现在的项目就是使用这种方法)或者,也可以使用其他方式,只要返回的数据格式为json就行,且不局限于java语言代码中。

写的不好的地方,请大家多指教,哪位朋友有好的建议也可以修改并贴出来与大家共享。
有兴趣的朋友可以更进一步的增强:譬如缓存一些数据到客户端,支持不调用后台的获取数据的方式,等等。

废话不说了,直接贴代码:
/**
 * LinkedSelect: 联动下拉框控件,支持N级联动。
 * 根据每个Select的定义中的url和id为Select做初始化,后台返回的数据为[{value:"",label:""},{value:"",label:""}]形式的数组json
 * @author senton
 * @version 1.0
 * 
 * 以选国家、省、市的联动为例,调用示例如下:
 * <pre>
 *  // 声明一个select变量
 * 	var select = new LinkedSelect();
 *  // 调用selct的init()方法,注意,该方法的参数是一个数组,用[]括起来,每个select的定义用{}括起来,多个select定义之间以,分割
 * 	select.init([
 * 		{
 * 			id:"country",
 * 			url:"获取country列表的url",
 * 			nullable:false,
 * 			defaultValue:2
 * 		},
 * 		{
 * 			id:"province",
 * 			url:"获取province列表的url",
 * 			nullable:false
 * 		},
 * 		{
 * 			id:"city",
 * 			url:"获取city列表的url",
 * 			nullable:false
 * 		}
 *  ]); 
 * </pre>
 */
/**
 * 定义一个LinkedSelect函数
 */
function LinkedSelect(){
	return this;
}

/**
 * LinkedSelect的初始化方法
 * @param allSelectInputs 所有的需要联动显示的下拉框,是一个数组。
 * @returns
 */
LinkedSelect.prototype.init = function(allSelectInputs){
	
	// 定义一个内部方法,用于加载一个下拉框,参数:
	// 	allSelectInputs:所有的下拉框定义
	//  parentId: 上一个被选中的ID,即<option>的value属性值
	//  currentIndex: 要初始化的下拉框在allSelectInputs中的索引
	initNextSelect = function(allSelectInputs, parentId, currentIndex){
		// 如果没有allSelectInputs值或者allSelectInputs的长度小于等于currentIndex,说明没有需要初始化的下拉框了,就返回
		if(!allSelectInputs || allSelectInputs.length <= currentIndex){
			return;
		}
		// 取出当前需要初始化的select的定义
		var currentSelect = allSelectInputs[currentIndex];
		// 清空currentSelect的option
		$("#"+currentSelect.id).empty();
		// 如果还有下一个,则为当前的Select加上onchange事件
		if(allSelectInputs.length > currentIndex + 1){
			$("#"+currentSelect.id).unbind("change");
			$("#"+currentSelect.id).bind("change", function(){
				initNextSelect(allSelectInputs, $(this).val(), currentIndex + 1);
			});
		}
		// 如果不是第一个,则需要判断parentId是否为空,如果为空,则递归清空后面的所有下拉框
		if(currentIndex != 0){
			if(!parentId || parentId == ''){
				$("#"+currentSelect.id).append("<option value=''></option>");
				initNextSelect(allSelectInputs, $("#"+currentSelect.id).val(), currentIndex + 1);
				return;
			}
		}
		// 如果不为空,则根据parentId取出所有的SelectItem初始化currentSelect
		$.post(currentSelect.url,
			{
			   	parentId:parentId
			},
			function(data){
				// 如果currentSelect在被定义时nullable为true,则说明可以为空,在第一个加上一个空的option
				if(currentSelect.nullable){
					$("#"+currentSelect.id).append("<option value=''></option>");
				}
				// 取出所有的selectItem加到currentSelect上
				$.each(data, function (index, selectItem) {
					// 如果currentSelect在被定义时的defaultValue等于当前selectItem的值,则选中它
					if(selectItem.value == currentSelect.defaultValue){
						$("#"+currentSelect.id).append("<option selected='selected' value='" + selectItem.value + "'>" + selectItem.label + "</option>");
					}
					else {
						$("#"+currentSelect.id).append("<option value='" + selectItem.value + "'>" + selectItem.label + "</option>");
					}
				});
				// 初始化完毕后,取出当前currentSelect选中的值,作为parentId初始化下一个select
				initNextSelect(allSelectInputs, $("#"+currentSelect.id).val(), currentIndex + 1);
			},"json"
		);
	};

	// 调用initNextSelect,启动第一个下拉框的加载
	initNextSelect(allSelectInputs, "", 0);
	
};
分享到:
评论
2 楼 a1439226817 2014-11-27  
<!doctype html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="Generator" content="EditPlus®">
  <meta name="Author" content="">
  <meta name="Keywords" content="">
  <meta name="Description" content="">
  <script type="text/javascript" src="jquery.js">
  </script>
  <script type="text/javascript" src="linkedSelect.js">
  </script>
 
  <title>Document</title>
</head>
<body>
<select name="country" id="country">

  </select>
  <select name="province" id="province">

  </select>
  <select name="city" id="city">

  </select>
  <script type="text/javascript">
var data1= [{value:"1",label:"1"},{value:"2",label:"2"}];
var data2= [{value:"1",label:"1"},{value:"2",label:"2"}];
var data3= [{value:"1",label:"1"},{value:"2",label:"2"}];
var select = new LinkedSelect();
  select.init([
  {
  id:"country",
  url:data1,
  nullable:false,
  defaultValue:2
  },
{
  id:"province",
  url:data2,
  nullable:false
  },
  {
  id:"city",
  url:data3,
  nullable:false
  }
   ]);


  </script>
</body>
</html>
1 楼 a1439226817 2014-11-27  
也不高个测试的demo,别人怎么用啊

相关推荐

    学习笔记 MHT3

    “发布一个支持N级下拉列表联动的控件 - JQuery - web - JavaEye论坛”讨论的是使用JQuery实现的多级联动下拉列表,这对于前端界面交互设计来说是一个实用的技巧,尤其在处理复杂表单和数据关联时。 最后,“comet ...

    Android 实现城市省份的选择

    这个场景可以通过创建一个联动的下拉选择器(Spinner)来实现,让用户能够逐级选择省份和城市,并获取到对应的城市编号。下面将详细介绍如何在Android中实现这样的功能。 首先,我们需要准备省份和城市的数据库或...

    javascript常用函数代码大全.docx

    3. **联动下拉框**: 两个或多个下拉框之间的值相互依赖,改变一个下拉框的值会更新另一个。 4. **文本排序**: 对文本数据进行排序处理。 5. **画图类**: 包括饼图、柱状图、矢量贝塞尔曲线等图形绘制。 6. **客户端...

    jquery插件表

    - **jQuery - LinkedSelect**:创建关联的下拉列表,改变一个下拉框时,另一个下拉框会相应更新。 - **Choose Plugin (Select Replacement)**:美化并增强原生选择框。 ### 表单基本、输入框、选择框等 - **jQuery ...

    javascript经典例子.txt

    - 描述:实现一个支持输入搜索的下拉列表。 - 实现方法:使用JavaScript监听用户的输入事件,根据输入内容过滤下拉列表中的选项。 - **2.4 多行文本框中只能输入iMax文字。如果多输入了,自动减少到iMax个文字...

    240多个jQuery UI插件

    - **Select Combo Plugin**: 结合多个`&lt;select&gt;`元素为一个组合。 - **jQuery-Linked Select**: 实现两个或多个`&lt;select&gt;`元素的关联。 - **Auto-populate multiple select boxes**: 自动填充多选框中的选项。 -...

    在bs开发中经常用到的javaScript技术整理

    8. **联动下拉框**:一个下拉框的选择影响另一个下拉框的选项。 9. **文本排序**:允许用户按指定顺序排列文本。 这些JavaScript技术在BS开发中广泛使用,它们提高了用户体验,增强了网站的交互性和功能性。了解并...

    海量经典的jQuery插件集合

    - **功能概述**:提供另一个颜色选择器选项。 - **应用场景**:适用于需要不同风格的颜色选择器。 #### 六、投票插件(Rating Plugins) **1. jQuery Star Rating Plugin** - **功能概述**:实现星级评分功能。 - ...

    javascript代码常用大全

    ` 表示可选的负号,`\d+` 表示一个或多个数字。 - **1.2 大于0的整数验证** - 特别用于ID等必须为正整数的情况。 - 通过正则表达式 `/^[1-9]\d*$/.test(str)` 实现,确保数字大于0。 - **1.3 负整数验证** - 用于...

Global site tag (gtag.js) - Google Analytics