本文实例讲述了jquery无限级联下拉菜单代码以及jquery无限级联下拉菜单实现思路。分享给大家供大家参考。具体如下:
最终效果图:
因为是级联,所以数据必须是树型结构的,这里的测试数据如下:
看下效果图:
1、效果图一:
2、效果图二:
3、效果图三:
由图可知,下拉框的个数并不是写死的,而是动态加载的。每当下拉框选择改变的时候,会发送一次ajax请求,请求成功返回json格式数据,当返回的数据不为空时(即有子节点时),则会向页面中添加一个下拉框,没有则不添加。
插件的实现代码如下:
(function ($) { $.fn.cascadingselect = function (options) { //默认参数设置 var settings = { url: /handler.ashx, //请求路径 data: 0, //初始值(字符串格式) split: ,, //分割符 cssname: select, //样式名称 val: id, //name text: name, //name hiddenname: selval //隐藏域的name属性的值 } //合并参数 if (options) $.extend(settings, options); //链式原则 return this.each(function () { init($(this), settings.data); /* 初始化 @param container 容器对象 @param data 初始值 */ function init(container, data) { //创建隐藏域对象,并赋初始值 var _input = $().appendto(container).val(settings.data); var arr = data.split(settings.split); for (var i = 0; i < arr.length; i++) { //创建下拉框 createselect(container, arr[i], arr[i + 1] || -1); } } /* 创建下拉框 @param container 容器对象 @param parentid 父id号 @param id 自身id号 */ function createselect(container, parentid, id) { //创建select对象,并将select对象放入container内 var _select = $().appendto(container).addclass(settings.cssname); //如果parentid为空,则_parentid值为0 var _parentid = parentid || 0; //发送ajax请求,返回的data必须为json格式 $.getjson(settings.url, { parentid: _parentid }, function (data) { //添加子节点 addoptions(container, _select, data).val(id || -1) }); } /* 为下拉框添加子节点 @param container 容器对象 @param select 下拉框对象 @param data 子节点数据(要求数据为json格式) */ function addoptions(container, select, data) { select.append($('=请选择=')); for (var i = 0; i 0) { var _html = $(); var _select = addoptions(container, _html, data); //判断当前select对象后面是否跟有select对象 if (nextall.length 0) { arr.push($(this).val()); //获取container下每个select对象的值,并添加到数组arr } }); //为隐藏域对象赋值 $(input[name=' + settings.hiddenname + '], container).val(arr.join(settings.split)); } }); }})(jquery);
注释我已经尽量写的详细了,但还是要针对一些知识点进行讲解。
1、我这里后台语言用的是c#,因此你看到的请求路径是这样的(url:/handler.ashx),你用其它语言是没有问题的,但是通过ajax请求返回的数据必须是json格式的数据。
2、在初始化方法 init() 中,我们向容器中放入了一个隐藏域,这个隐藏域是用来存值的,我们通过一个 saveval() 方法为其赋值。之所以要加隐藏域,是因为我们选择的数据最终是要保存到数据库中的,这样就会有表单提交操作,因此加个隐藏域。
3、默认参数设置(settings)里面的split分割符。这里用的是逗号(,) 你也可以改用其它的,比如(-)或者(|)。它主要是用来拆分和组合所有下拉框的值的。
拆分主要是在初始化(init)的时候,比如你给的初始值(data)不是0,而是 0,1,4 这时就会将其拆分,逐一执行创建下拉框方法 createselect()
组合主要是在给隐藏域赋值的时候,用分割符将各个下拉框的值拼接成一个字符串,然后赋给隐藏域。
4、默认参数设置(settings)里面的 {val: id, text: name } 。它们对应的是你返回的json对象中对应的属性名。
5、在_onchange()方法里面有写到saveval()执行位置的问题。之所以写在回调函数外面会出现bug,是因为$.getjson()默认是异步的,在回调方法还没执行完时,就执行了 saveval()方法。我们来看来bug所在:
此时隐藏域的值是错误的,正确的值应该是 0,1,5 。由于回调函数还没执行完,也就是nextall.remove()这个还没执行的时候,就是执行了saveval()
demo的html部分的代码:
以上就是jquery实现无限级联下拉菜单效果的全部内容,希望对大家的学习有所帮助。