jQuery+JSON三級聯動效果,通用

http://www.helloweba.com/view-blog-188.html 

基於此篇文章,修改一些源代碼,可實現下拉1-3級聯動,其中option中   value=id,text=name

chrome 本地測試,url:"js/json.min.js" 這種方式不支持,直接寫json是支持的

1、html源碼

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="keywords" content="ajax,jquery,三級聯動" />
<title>jQuery+JSON三級聯動效果</title>
<style type="text/css">
</style>
<script type="text/javascript" src="js/jquery-1.11.1.min.js"></script>
<script type="text/javascript" src="js/jquery.threeselect.js"></script>
<script type="text/javascript">
$(function(){
    $("#city_1").citySelect({
        url:"js/json.min.js",//必選 (可以是文件,也可以是json)
        frist:'',//可選
        secend:'',//可選
        third:'',//可選
        class_first:'prov',//第一個select classname  //必選
        class_secend:'city',//第二個select classname //可選(只需要一級 此選項不填)
        class_third:'dist',//第三個select classname  //可選(只需要二級 此選項不填)
        first_children:"cityitylist",//一級 //必選
        secend_children:"city",//二級  //可選 (只需要一級 此選項不填)
        third_children:"dist",//三級  //可選(只需要二級 此選項不填)
        nodata:"none", //可選
        required:true //可選
    });
    
    $("#city_2").citySelect({
        url:"js/json.min.js",
        frist:'',
        secend:'',
        third:'',
        class_first:'prov',//第一個select classname
        class_secend:'city',//第二個select classname
        class_third:'dist',//第三個select classname
        first_children:"cityitylist",//一級
        secend_children:"city",//二級
        third_children:"dist",//三級
        nodata:"hidden",
        required:false
    }); 
    
    $("#game").citySelect({
        url:{"list":[{"id":1,"name":"1區","child":[{"id":1,"name":"1服","children":[{"id":1,"name":"test"}]},{"id":2,"name":"2服"}]},{"id":2,"name":"2區","child":[{"id":1,"name":"1服"},{"id":2,"name":"2服"}]}]},
        frist:'',
        secend:'',
        third:'',
        class_first:'qu',//第一個select classname
        class_secend:'fu',//第二個select classname
        class_third:'user',//第三個select classname
        first_children:"list",//一級
        secend_children:"child",//二級
        third_children:"children",//三級
        nodata:"",
        required:false
    });
    
});
</script>
</head>

<body>

<div id="main">
  <div class="demo">    
      <h3>設置省份、城市、地區(縣)的默認值</h3>
    <p>二級聯動</p>
      <div id="city_1">
          <select class="prov"></select> 
        <select class="city" disabled="disabled"></select>
    </div>
    <p>三級聯動</p>
    <div id="city_2">
          <select class="prov"></select> 
        <select class="city" disabled="disabled"></select>
        <select class="dist" disabled="disabled"></select>
    </div>
  </div>
  
  <div class="demo">
      <h3>自定義遊戲服務區選項</h3>
      <div id="game">
          <select class="qu"></select>
        <select class="fu" disabled="disabled"></select>
        <select class="user" disabled="disabled"></select>
    </div>
  </div>
</div>
</body>
</html>

2、js源碼:

/*
Ajax 三級聯動

settings 參數說明
-----
url:數據josn文件路徑,也可以是json數據 //必須

frist:默認第一個值
secend:默認第二個值
third:默認第三個值

class_first:第一個選擇框的class name //必須
class_secend:第二個選擇框的class name //必須
class_third:第三個選擇框的class name //必須

first_children:第一層字段
secend_children:第二個選擇框與第一個選擇框關聯字段
third_children:第三個選擇框與第二個選擇框關聯字段

required:必選項
nodata:無數據狀態
------------------------------ */
(function($){
	$.fn.citySelect=function(settings){
		if(this.length<1){return;};
		
		// 默認值
		settings=$.extend({
			url:"",
			frist:null,
			secend:null,
			third:null,
			class_first:null,
			class_secend:null,
			class_third:null,
			first_children:"first_children",
			secend_children:"secend_children",	
			third_children:"third_children",	
			nodata:null,
			required:true
		},settings);

		var box_obj=this;
		var frist_obj=box_obj.find("."+settings.class_first);
		var secend_obj=box_obj.find("."+settings.class_secend);
		var third_obj=box_obj.find("."+settings.class_third);
		var frist_val=settings.first;
		var secend_val=settings.secend;
		var third_val=settings.third;
		var select_prehtml=(settings.required) ? "" : "<option value=''>請選擇</option>";
		var node_first = settings.first_children;
		var node_secend = settings.secend_children;
		var node_third = settings.third_children;
		var json_data;
		
		// 賦值第二個選擇框
		var secendStart=function(){
			var frist_id=frist_obj.get(0).selectedIndex;
			
			if(!settings.required){
				frist_id--;
			};
			secend_obj.empty().attr("disabled",true);
			third_obj.empty().attr("disabled",true);

			if(frist_id<0||typeof(json_data[node_first][frist_id][node_secend])=="undefined"){
				if(settings.nodata=="none"){
					secend_obj.css("display","none");
					third_obj.css("display","none");
				}else if(settings.nodata=="hidden"){
					secend_obj.css("visibility","hidden");
					third_obj.css("visibility","hidden");
				};
				return;
			};
			
			// 遍歷賦值第二下拉列表
			temp_html=select_prehtml;
			$.each(json_data[node_first][frist_id][node_secend],function(i,secend){
				temp_html+="<option value='"+secend.id+"'>"+secend.name+"</option>";
			});
			secend_obj.html(temp_html).attr("disabled",false).css({"display":"","visibility":""});
			thirdStart();
		};

		// 賦值第三個選擇框
		var thirdStart=function(){
			var frist_id=frist_obj.get(0).selectedIndex;
			var secend_id=secend_obj.get(0).selectedIndex;
			if(!settings.required){
				frist_id--;
				secend_id--;
			};
			third_obj.empty().attr("disabled",true);

			if(frist_id<0||secend_id<0||typeof(json_data[node_first][frist_id][node_secend][secend_id][node_third])=="undefined"){
				if(settings.nodata=="none"){
					third_obj.css("display","none");
				}else if(settings.nodata=="hidden"){
					third_obj.css("visibility","hidden");
				};
				return;
			};
			
			// 遍歷賦值第三下拉列表
			temp_html=select_prehtml;
			$.each(json_data[node_first][frist_id][node_secend][secend_id][node_third],function(i,third){
				temp_html+="<option value='"+third.id+"'>"+third.name+"</option>";
			});
			third_obj.html(temp_html).attr("disabled",false).css({"display":"","visibility":""});
		};

		var init=function(){
			// 遍歷賦值第一下拉列表
			temp_html=select_prehtml;
			$.each(json_data[node_first],function(i,first){
				temp_html+="<option value='"+first.id+"'>"+first.name+"</option>";
			});
			frist_obj.html(temp_html);

			// 若有傳入第一、第二的值,則選中。(setTimeout爲兼容IE6而設置)
			setTimeout(function(){
				if(settings.first!=null){
					frist_obj.val(settings.first);
					secendStart();
					setTimeout(function(){
						if(settings.secend!=null){
							secend_obj.val(settings.secend);
							thirdStart();
							setTimeout(function(){
								if(settings.third!=null){
									third_obj.val(settings.third);
								};
							},1);
						};
					},1);
				};
			},1);

			// 選擇第一選擇框時發生事件
			frist_obj.bind("change",function(){
				secendStart();
			});

			// 選擇第二選擇框時發生事件
			secend_obj.bind("change",function(){
				thirdStart();
			});
		};

	
		// 設置json數據
		if(typeof(settings.url)=="string"){
			$.getJSON(settings.url,function(json){
				json_data=json;		
				init();
			});
		}else{
			json_data=settings.url;
			init();
		};
	};
})(jQuery);

3、json格式

{"cityitylist":[{"id":1,"name":"北京","city":[{"id":2,"name":"東城區","dist":[{"id":1001,"name":"測試縣1"},{"id":1002,"name":"測試縣2"},{"id":1003,"name":"測試縣3"},{"id":1004,"name":"測試區"}]},{"id":3,"name":"西城區"},{"id":4,"name":"崇文區"},{"id":5,"name":"宣武區"},{"id":6,"name":"朝陽區"},{"id":7,"name":"豐臺區"},{"id":8,"name":"石景山區"},{"id":9,"name":"海淀區"},{"id":10,"name":"門頭溝區"},{"id":11,"name":"房山區"},{"id":12,"name":"通州區"},{"id":13,"name":"順義區"},{"id":14,"name":"昌平區"},{"id":15,"name":"大興區"},{"id":16,"name":"平谷區"},{"id":17,"name":"懷柔區"},{"id":18,"name":"密雲縣"},{"id":19,"name":"延慶縣"}]},{"id":20,"name":"天津","city":[{"id":21,"name":"和平區"},{"id":22,"name":"河東區"},{"id":23,"name":"河西區"},{"id":24,"name":"南開區"},{"id":25,"name":"河北區"},{"id":26,"name":"紅撟區"},{"id":27,"name":"濱海新區"},{"id":28,"name":"東麗區"},{"id":29,"name":"西青區"},{"id":30,"name":"津南區"},{"id":31,"name":"北辰區"},{"id":32,"name":"寧河區"},{"id":33,"name":"武清區"},{"id":34,"name":"靜海縣"},{"id":35,"name":"寶坻區"},{"id":36,"name":"薊縣"}]}]}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章