jquery無限級聯(lián)下拉菜單簡單實例演示
本文實例講述了jquery無限級聯(lián)下拉菜單代碼以及jquery無限級聯(lián)下拉菜單實現(xiàn)思路。分享給大家供大家參考。具體如下:
最終效果圖:

因為是級聯(lián),所以數(shù)據(jù)必須是樹型結(jié)構(gòu)的,這里的測試數(shù)據(jù)如下:

看下效果圖:
1、效果圖一:

2、效果圖二:

3、效果圖三:

由圖可知,下拉框的個數(shù)并不是寫死的,而是動態(tài)加載的。每當下拉框選擇改變的時候,會發(fā)送一次ajax請求,請求成功返回json格式數(shù)據(jù),當返回的數(shù)據(jù)不為空時(即有子節(jié)點時),則會向頁面中添加一個下拉框,沒有則不添加。
插件的實現(xiàn)代碼如下:
(function ($) {
$.fn.CascadingSelect = function (options) {
//默認參數(shù)設(shè)置
var settings = {
url: "/Handler.ashx", //請求路徑
data: "0", //初始值(字符串格式)
split: ",", //分割符
cssName: "select", //樣式名稱
val: "id", //<option value="id">name</option>
text: "name", //<option value="id">name</option>
hiddenName: "selVal" //隱藏域的name屬性的值
}
//合并參數(shù)
if (options)
$.extend(settings, options);
//鏈式原則
return this.each(function () {
init($(this), settings.data);
/*
初始化
@param container 容器對象
@param data 初始值
*/
function init(container, data) {
//創(chuàng)建隱藏域?qū)ο?并賦初始值
var _input = $("<input type='hidden' name='" + settings.hiddenName + "' />").appendTo(container).val(settings.data);
var arr = data.split(settings.split);
for (var i = 0; i < arr.length; i++) {
//創(chuàng)建下拉框
createSelect(container, arr[i], arr[i + 1] || -1);
}
}
/*
創(chuàng)建下拉框
@param container 容器對象
@param parentid 父ID號
@param id 自身ID號
*/
function createSelect(container, parentid, id) {
//創(chuàng)建select對象,并將select對象放入container內(nèi)
var _select = $("<select></select>").appendTo(container).addClass(settings.cssName);
//如果parentid為空,則_parentid值為0
var _parentid = parentid || 0;
//發(fā)送AJAX請求,返回的data必須為json格式
$.getJSON(settings.url, { parentid: _parentid }, function (data) {
//添加子節(jié)點<option>
addOptions(container, _select, data).val(id || -1)
});
}
/*
為下拉框添加<option>子節(jié)點
@param container 容器對象
@param select 下拉框?qū)ο?
@param data 子節(jié)點數(shù)據(jù)(要求數(shù)據(jù)為json格式)
*/
function addOptions(container, select, data) {
select.append($('<option value="-1">=請選擇=</option>'));
for (var i = 0; i < data.length; i++) {
select.append($('<option value="' + data[i][settings.val] + '">' + data[i][settings.text] + '</option>'));
}
//為select綁定change事件
select.bind("change", function () { _onchange(container, $(this), $(this).val()) });
return select;
}
/*
select的change事件函數(shù)
@param container 容器對象
@param select 下拉框?qū)ο?
@param id 當前下拉框的值
*/
function _onchange(container, select, id) {
var nextAll = select.nextAll("select");
//如果當前select對象的值是空或-1(即:==請選擇==),則將其后面的select對象全部移除
if (!id || id == "-1") {
nextAll.remove();
}
$.getJSON(settings.url, { parentid: id }, function (data) {
if (data.length > 0) {
var _html = $("<select class='" + settings.cssName + "'></select>");
var _select = addOptions(container, _html, data);
//判斷當前select對象后面是否跟有select對象
if (nextAll.length < 1) {
select.after(_select); //沒有則直接添加
} else {
nextAll.remove(); //有則先移除再添加
select.after(_select);
}
}
else {
nextAll.remove(); //沒有子項則后面的select全部移除
}
saveVal(container); //進行數(shù)據(jù)保存,此方法必須放在回調(diào)函數(shù)里面
});
//saveVal(container); //如果放在這里,則會出現(xiàn)bug
}
/*
將選擇的值保存在隱藏域中,用于表單提交保存
@param container 容器對象
*/
function saveVal(container) {
var arr = new Array();
arr.push(0); //為數(shù)組arr添加元素0,父節(jié)點從0開始,所以添加0
$("select", container).each(function () {
if ($(this).val() > 0) {
arr.push($(this).val()); //獲取container下每個select對象的值,并添加到數(shù)組arr
}
});
//為隱藏域?qū)ο筚x值
$("input[name='" + settings.hiddenName + "']", container).val(arr.join(settings.split));
}
});
}
})(jQuery);
注釋我已經(jīng)盡量寫的詳細了,但還是要針對一些知識點進行講解。
1、我這里后臺語言用的是C#,因此你看到的請求路徑是這樣的(url:"/Handler.ashx"),你用其它語言是沒有問題的,但是通過ajax請求返回的數(shù)據(jù)必須是json格式的數(shù)據(jù)。

2、在初始化方法 init() 中,我們向容器中放入了一個隱藏域,這個隱藏域是用來存值的,我們通過一個 saveVal() 方法為其賦值。之所以要加隱藏域,是因為我們選擇的數(shù)據(jù)最終 是要保存到數(shù)據(jù)庫中的,這樣就會有表單提交操作,因此加個隱藏域。

3、默認參數(shù)設(shè)置(settings)里面的split分割符。這里用的是逗號(,) 你也可以改用其它的,比如(-)或者(|)。它主要是用來拆分和組合所有下拉框的值的。
拆分主要是在初始化(init)的時候,比如你給的初始值(data)不是0,而是 0,1,4 這時就會將其拆分,逐一執(zhí)行創(chuàng)建下拉框方法 createSelect()
組合主要是在給隱藏域賦值的時候,用分割符將各個下拉框的值拼接成一個字符串,然后賦給隱藏域。
4、默認參數(shù)設(shè)置(settings)里面的 {val: "id", text: "name" } 。它們對應的是你返回的json對象中對應的屬性名。
5、在_onchange()方法里面有寫到saveVal()執(zhí)行位置的問題。之所以寫在回調(diào)函數(shù)外面會出現(xiàn)bug,是因為$.getJSON()默認是異步的,在回調(diào)方法還沒執(zhí)行完時,就執(zhí)行了 saveVal()方法。我們來看來bug所在:

此時隱藏域的值是錯誤的,正確的值應該是 0,1,5 。由于回調(diào)函數(shù)還沒執(zhí)行完,也就是nextAll.remove()這個還沒執(zhí)行的時候,就是執(zhí)行了saveVal()
DEMO的Html部分的代碼:
<html>
<head>
<title></title>
<style type="text/css">
*{margin:0;padding:0;}
#box{ width:500px; margin:100px auto;}
.select{ width:120px; height:30px; margin-right:5px;}
</style>
</head>
<body>
<!--容器-->
<div id="box"></div>
<script src="Scripts/jquery-1.4.1.min.js" type="text/javascript"></script>
<script src="Scripts/jquery.similar.cascadingselect.js" type="text/javascript"></script>
<script type="text/javascript">
$("#box").CascadingSelect({data:"0,1,4"}); //設(shè)置初始值為0,1,4
</script>
</body>
</html>
以上就是jquery實現(xiàn)無限級聯(lián)下拉菜單效果的全部內(nèi)容,希望對大家的學習有所幫助。
相關(guān)文章
jquery+php后臺實現(xiàn)省市區(qū)聯(lián)動功能示例
這篇文章主要介紹了jquery+php后臺實現(xiàn)省市區(qū)聯(lián)動功能,涉及jQuery事件響應及頁面元素屬性動態(tài)變換,以及ajax后臺動態(tài)交互相關(guān)操作技巧,需要的朋友可以參考下2019-05-05
jQuery實現(xiàn)圖片上傳預覽效果功能完整實例【測試可用】
這篇文章主要介紹了jQuery實現(xiàn)圖片上傳預覽效果功能,結(jié)合完整實例形式分析了jQuery處理圖片上傳預覽相關(guān)事件響應、瀏覽器判斷、圖片及頁面元素動態(tài)操作相關(guān)實現(xiàn)技巧,需要的朋友可以參考下2018-05-05
Jquery使用each函數(shù)實現(xiàn)遍歷及數(shù)組處理
這篇文章主要介紹了Jquery使用each函數(shù)實現(xiàn)遍歷及數(shù)組處理,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-07-07
jquery UI實現(xiàn)autocomplete在獲取焦點時得到顯示列表功能示例
這篇文章主要介紹了jquery UI實現(xiàn)autocomplete在獲取焦點時得到顯示列表功能,結(jié)合實例形式分析了jquery UI實現(xiàn)autocomplete事件響應及顯示下拉列表功能操作技巧,需要的朋友可以參考下2019-06-06
模擬jQuery中的ready方法及實現(xiàn)按需加載css,js實例代碼
這篇文章介紹了模擬jQuery中的ready方法及實現(xiàn)按需加載css,js實例代碼,有需要的朋友可以參考一下2013-09-09

