在上一篇文章中两个联动菜单,简单的实现我写了一个插件,但是只支持两个链接,完好下支持二 、三级联动
/** * jQuery Linkage Menu * * Copyright 2014, sunyingyuan * QQ: 1586383022 * Email: yingyuansun@163.com * * 二级/三级 联动菜单 * 支持二级或三级联动。支持页面静态json和AJAX动态从后台获取值 * * 简单用法介绍: * HTML代码: * <select id="selectOne"> * <option>一级菜单默认显示名称</option> * </select> * <select id="selectTwo"> * <option>二级菜单默认显示名称</option> * </select> * 假设有三级菜单,同上 * * JS代码: * 引入jQuery和jquery.linkageMenu.js后 * 当中jquery.linkageMenu.js必须在jQuery之后引入 * * $(function(){ * $.linkageMenu({ * 'selectOneId': 'selectOne', //一级菜单Id 'selectTwoId': 'selectTwo', //二级菜单Id 'selectThreeId': '', //三级菜单Id 'selectOneVal': '', //一级菜单option值 'selectTwoVal': '', //二级菜单option值 'selectThreeVal': '', //三级菜单option值 'selectOneParam': 'selectOneValue', //向后台获取二级菜单的值时,一级菜单的參数名称,默认是selectOneValue 'selectTwoParam': 'selectTwoValue', //向后台获取三级菜单的值时,二级菜单的參数名称,默认是selectTwoValue 'getSelectTwoValUrl': '', //得到二级菜单value的url 'getSelectThreeValUrl': '' //得到三级菜单value的url * }); * }); * */ (function ($) { $.linkageMenu = function (options) { //默认參数 var settings = $.extend({ 'selectOneId': 'selectOne', //一级菜单Id 'selectTwoId': 'selectTwo', //二级菜单Id 'selectThreeId': '', //三级菜单Id 'selectOneVal': '', //一级菜单option值 'selectTwoVal': '', //二级菜单option值 'selectThreeVal': '', //三级菜单option值 'selectOneParam': 'selectOneValue', //向后台获取二级菜单的值时,一级菜单的參数名称,默认是selectOneValue 'selectTwoParam': 'selectTwoValue', //向后台获取三级菜单的值时。二级菜单的參数名称。默认是selectTwoValue 'getSelectTwoValUrl': '', //得到二级菜单value的url 'getSelectThreeValUrl': '' //得到三级菜单value的url }, options); var $s1 = $("#" + settings.selectOneId); var $s2 = $("#" + settings.selectTwoId); var $s3 = $("#" + settings.selectThreeId); //一级菜单初始化 _selectValParseJSON($.parseJSON(settings.selectOneVal), $s1); //当一级菜单变化时。二级菜单改变option值 $s1.change(function () { _changeMenu($s1, $s2, settings.selectTwoVal, settings.selectOneParam, settings.getSelectTwoValUrl); $s2.change(); }); //假设有三级菜单。当二级菜单改变时,三级菜单改变option if (settings.selectThreeId) { $s2.change(function () { _changeMenu($s2, $s3, settings.selectThreeVal, settings.selectTwoParam, settings.getSelectThreeValUrl); }); } /** * Private Methods : _changeMenu * * 当select组件的value发生改变时,对下一级select组件value产生的影响,即下一级select组件值的改变 * @param preSelectIdObj : value发生变化的组件的对象 * @param folSelectIdObj : 因为变化的组件产生影响的下一级组件的对象 * @param folSelectMenuVal : 下一级组件的静态值(非AJAX从后台获取数据时用) * @param getFolSelectMenuValParam : AJAX获取数据时。向后台请求的參数 * @param getFolSelectMenuValUrl : AJAX获取数据的URL * @private */ function _changeMenu(preSelectIdObj, folSelectIdObj, folSelectMenuVal, getFolSelectMenuValParam, getFolSelectMenuValUrl) { //preSelectIdObj.change(function () { folSelectIdObj.html(""); var preSelectedVal = preSelectIdObj.val(); if (folSelectMenuVal) { _selectValParseJSON($.parseJSON(folSelectMenuVal), folSelectIdObj); return; } //ajax异步获取下一级菜单数据 $.ajax({ type: "GET", url: getFolSelectMenuValUrl, data: getFolSelectMenuValParam + "=" + preSelectedVal, success: function (val) { _selectValParseJSON($.parseJSON(val), folSelectIdObj); } }); //}); } /** * Private Methods : _selectValParseJSON * * 将json填充到指定id的select组件上 * @param jsonVal : json对象,要填充到select组件上的json对象 * @param selectId : 要填充的select组件的Id * @private */ function _selectValParseJSON(jsonVal, selectId) { $.each(jsonVal, function (key, val) { _appendOptionTo(selectId, key, val); }); }; /** * Private Methods : _appendOptionTo * * 将值添加到option组件 * @param $obj : The selected object jquery,一般为须要加入option的select对象 * @param key : option的key,一般为设置的Id * @param val ; option的val,同一时候一般也作为显示的值,在这里我们默觉得显示的value和option的value是同一个值 * @param defaultSelectVal ; 设置默认选中的值,一般为初始化的情况下,默认选中的value * @private */ function _appendOptionTo($obj, key, val, defaultSelectVal) { var $opt = $("<option>").text(key).val(val); if (val == defaultSelectVal) { $opt.attr("selected", "selected"); } $opt.appendTo($obj); } }; })(jQuery);
下面为測试HTML
<!DOCTYPE html> <html> <head> <title>Test Select</title> <script src="jquery-1.11.0.js"></script> <script src="test.js"></script> <script> $(function(){ $.linkageMenu({ 'selectOneId': 'selectOne', 'selectTwoId': 'selectTwo', 'selectThreeId': 'selectThree', 'selectOneVal': '{"key1":"value1", "key2":"value2"}', //'selectTwoVal': '{"abc":"abc", "abca":"abca"}', 'selectThreeVal': '{"abc":"abc", "abca":"abca"}', 'getSelectTwoValUrl': 'http://localhost:8080/getSelect2Val/listAll' }); }); </script> </head> <body> <div> <select id="selectOne"> <option>一级菜单</option> </select> <select id="selectTwo"> <option>请选择一级菜单</option> </select> <select id="selectThree"> <option>请选择二级菜单</option> </select> </div> </body> </html>
git地址为https://github.com/sunyingyuan/jquery.linkageMenu
版权声明:本文博客原创文章。博客,未经同意,不得转载。