亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

jquery無限級聯下拉菜單簡單實例演示

2019-11-20 11:11:40
字體:
來源:轉載
供稿:網友

本文實例講述了jquery無限級聯下拉菜單代碼以及jquery無限級聯下拉菜單實現思路。分享給大家供大家參考。具體如下:

最終效果圖:

因為是級聯,所以數據必須是樹型結構的,這里的測試數據如下:

看下效果圖:

1、效果圖一:

 

2、效果圖二:

 

3、效果圖三:

 

 

  由圖可知,下拉框的個數并不是寫死的,而是動態加載的。每當下拉框選擇改變的時候,會發送一次ajax請求,請求成功返回json格式數據,當返回的數據不為空時(即有子節點時),則會向頁面中添加一個下拉框,沒有則不添加。

插件的實現代碼如下:

(function ($) { $.fn.CascadingSelect = function (options) {  //默認參數設置  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屬性的值  }  //合并參數  if (options)   $.extend(settings, options);  //鏈式原則  return this.each(function () {   init($(this), settings.data);   /*   初始化   @param container 容器對象   @param data   初始值   */   function init(container, data) {    //創建隱藏域對象,并賦初始值    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++) {     //創建下拉框     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 = $("<select></select>").appendTo(container).addClass(settings.cssName);    //如果parentid為空,則_parentid值為0    var _parentid = parentid || 0;    //發送AJAX請求,返回的data必須為json格式    $.getJSON(settings.url, { parentid: _parentid }, function (data) {     //添加子節點<option>     addOptions(container, _select, data).val(id || -1)    });   }   /*   為下拉框添加<option>子節點   @param container 容器對象   @param select  下拉框對象   @param data   子節點數據(要求數據為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事件函數   @param container 容器對象   @param select  下拉框對象   @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); //進行數據保存,此方法必須放在回調函數里面    });         //saveVal(container); //如果放在這里,則會出現bug   }   /*   將選擇的值保存在隱藏域中,用于表單提交保存   @param container 容器對象   */   function saveVal(container) {    var arr = new Array();    arr.push(0); //為數組arr添加元素0,父節點從0開始,所以添加0    $("select", container).each(function () {     if ($(this).val() > 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部分的代碼:

<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"}); //設置初始值為0,1,4 </script></body></html>

以上就是jquery實現無限級聯下拉菜單效果的全部內容,希望對大家的學習有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩av最新在线| 北条麻妃一区二区在线观看| 欧美专区国产专区| 亚洲精品美女视频| 成人在线激情视频| 久久深夜福利免费观看| 国产精品直播网红| 丁香五六月婷婷久久激情| 日本aⅴ大伊香蕉精品视频| 国产精品丝袜高跟| 在线观看欧美日韩国产| 日韩av成人在线| 国产精品久久久久久久久影视| 8090理伦午夜在线电影| 国产精品丝袜久久久久久高清| 国产精品久久久久高潮| 亚洲片av在线| 久久天天躁狠狠躁夜夜躁| 国产精选久久久久久| 欧美激情免费观看| 日本久久久久久久| 日韩中文字幕视频| 日韩av综合中文字幕| 久久伊人免费视频| 亚洲精品日韩久久久| 欧美做受高潮电影o| 91免费的视频在线播放| 亚洲肉体裸体xxxx137| 午夜精品久久久久久久99热浪潮| 一本色道久久综合亚洲精品小说| 黄色精品一区二区| 国产精品都在这里| 久久久免费观看| 亚洲成人在线网| 欧美一区二区色| 亚洲日韩中文字幕在线播放| www.日本久久久久com.| 国产精品久久久久久av福利软件| 青草热久免费精品视频| 久久久国产精品免费| 久久色免费在线视频| 一区二区成人av| 久久久精品视频成人| 日韩av在线不卡| 亚洲r级在线观看| 91最新在线免费观看| 久久精品免费电影| 亚洲精品成人久久电影| 欧美精品成人在线| 成人欧美一区二区三区黑人孕妇| 亚洲第一天堂无码专区| 欧美特级www| 国产视频精品自拍| 57pao国产成人免费| 欧美成人精品在线观看| 最近2019年日本中文免费字幕| 精品动漫一区二区三区| 欧美极品少妇全裸体| 高清一区二区三区日本久| 久久这里有精品| 欧美激情一区二区三区高清视频| 久久久久久国产免费| 国产精品一区久久久| 97视频在线观看免费高清完整版在线观看| 国产欧美日韩最新| 午夜精品久久久久久久久久久久久| 国产精品旅馆在线| 日本一区二区在线免费播放| 亚洲毛茸茸少妇高潮呻吟| 色综合五月天导航| 91精品视频免费| 91视频8mav| 日本欧美一二三区| 国内成人精品视频| 国产美女精品视频免费观看| 爽爽爽爽爽爽爽成人免费观看| 欧美疯狂xxxx大交乱88av| 亚洲国产中文字幕久久网| 日韩一中文字幕| 久久久久国产精品免费| 中文.日本.精品| 午夜精品三级视频福利| 国产精品九九久久久久久久| 欧美在线视频免费播放| 91tv亚洲精品香蕉国产一区7ujn| 国产成人精品久久二区二区| 久久久精品影院| 欧美寡妇偷汉性猛交| 欧美另类99xxxxx| 精品久久久久久久久久久| 国模叶桐国产精品一区| 国产精品中文字幕在线观看| 日韩欧美精品中文字幕| 亚洲欧美日韩图片| 日韩中文在线不卡| 丰满岳妇乱一区二区三区| 日产精品99久久久久久| 日韩在线激情视频| 欧美夫妻性生活视频| 91在线中文字幕| 国产福利视频一区二区| 国产亚洲欧美一区| 精品福利一区二区| 国内揄拍国内精品少妇国语| 538国产精品一区二区免费视频| 国产精品视频精品| 欧美黑人一区二区三区| 亚洲大尺度美女在线| 中文字幕最新精品| 亚洲乱码av中文一区二区| 亚洲精品av在线播放| 一区二区三区回区在观看免费视频| 亚洲国产成人在线播放| 国产精品91在线| 狠狠躁夜夜躁人人爽天天天天97| 国产亚洲欧洲高清一区| 久久久久久九九九| 亚洲成人网久久久| 亚洲综合一区二区不卡| 欧美日韩国产页| 亚洲欧美一区二区三区四区| 国产一区二区三区在线看| 亚洲天堂日韩电影| 欧美激情女人20p| 国产精品久久久久久av福利| 日韩精品久久久久久久玫瑰园| 国产日韩欧美夫妻视频在线观看| 亚洲网站在线看| 久久男人的天堂| 欧美成人黑人xx视频免费观看| 欧美精品日韩三级| 亚洲第一区中文字幕| 久久亚洲国产精品成人av秋霞| 国外成人在线直播| 人妖精品videosex性欧美| 亚洲色图激情小说| 久热爱精品视频线路一| 精品国产999| 国产精品久久精品| 亚洲人成绝费网站色www| 国产男人精品视频| 中文字幕欧美精品在线| 亚洲天堂av在线免费| 久久久精品免费| 国外成人免费在线播放| 精品亚洲一区二区三区四区五区| 欧美亚洲视频一区二区| 91精品在线观看视频| 国产精品自产拍高潮在线观看| 亚洲精品免费一区二区三区| 神马久久久久久| 欧美—级a级欧美特级ar全黄| 尤物yw午夜国产精品视频| 4438全国亚洲精品在线观看视频| 性日韩欧美在线视频| 91精品国产九九九久久久亚洲| 国产a∨精品一区二区三区不卡| 国产一区二区三区中文| 日韩免费精品视频| 91最新国产视频| 亚洲自拍偷拍区| 色偷偷偷综合中文字幕;dd| 91欧美精品成人综合在线观看| 国产精品成人一区二区|