首先訪問該鏈接:http://www.jq22.com/jquery-info12914
看看是否是你要找的三級聯動插件,(主要看注釋的部分!)
好了,不知道是不是我傻,沒有找到初始化數據的方法,本人只能直接格式化一下代碼,直接改源碼,總之呢,三個地方要改動,看源碼:
修改:city-picker.min.js
1 // jshint ignore: start 2 + 3 function(e) { 4 //開發時,直接把數據庫數據設置給rawCitiesData,注意,這里要轉json對象,不是json字符串。 5 e.rawCitiesData = [{//全國的數據太長,只能先放一個北京 6 name: "北京", 7 code: "110000", 8 sub: [{ 9 name: "北京市", 10 code: "110000", 11 sub: [{ 12 name: "東城區", 13 code: "110101" 14 }] 15 }] 16 }] 17 } ($), 18 + 19 function(e) { 20 "use strict"; 21 var n, a = e.rawCitiesData, 22 c = function(e) { 23 for (var n = [], a = 0; a < e.length; a++) { 24 var c = e[a]; 25 //注意,這里過濾條件,比如:北京是的二級是市轄區,如果不把'市轄區'這個條件去掉,那么,市轄區下的所有數據就沒有了。 26 /^請選擇|市轄區/.test(c.name) || n.push(c) 27 } 28 return n.length ? n: [] 29 }, 30 o = function(e) { 31 return e.sub ? c(e.sub) : [{ 32 name: "", 33 code: e.code 34 }] 35 }, 36 m = function(e) { 37 for (var n = 0; n < a.length; n++) if (a[n].code === e || a[n].name === e) return o(a[n]); 38 return [] 39 }, 40 d = function(e, n) { 41 for (var c = 0; c < a.length; c++) if (a[c].code === e || a[c].name === e) for (var m = 0; m < a[c].sub.length; m++) if (a[c].sub[m].code === n || a[c].sub[m].name === n) return o(a[c].sub[m]) 42 }, 43 u = function(e) { 44 var n, c, o = a[0], 45 m = e.split(" "); 46 return a.map(function(e) { 47 e.name === m[0] && (o = e) 48 }), 49 o.sub.map(function(e) { 50 e.name === m[1] && (n = e) 51 }), 52 m[2] && n.sub.map(function(e) { 53 e.name === m[2] && (c = e) 54 }), 55 c ? [o.code, n.code, c.code] : [o.code, n.code] 56 }; 57 e.fn.cityPicker = function(c) { 58 return c = e.extend({}, 59 n, c), 60 this.each(function() { 61 var n = this, 62 s = a.map(function(e) { 63 return e.name 64 }), 65 b = a.map(function(e) { 66 return e.code 67 }), 68 t = o(a[0]), 69 r = t.map(function(e) { 70 return e.name 71 }), 72 i = t.map(function(e) { 73 return e.code 74 }), 75 l = o(a[0].sub[0]), 76 f = l.map(function(e) { 77 return e.name 78 }), 79 p = l.map(function(e) { 80 return e.code 81 }), 82 v = s[0], 83 h = r[0], 84 V = f[0], 85 y = [{ 86 displayValues: s, 87 values: b, 88 cssClass: "col-province" 89 }, 90 { 91 displayValues: r, 92 values: i, 93 cssClass: "col-city" 94 }]; 95 c.showDistrict && y.push({ 96 values: p, 97 displayValues: f, 98 cssClass: "col-district" 99 }); 100 var g = { 101 cssClass: "city-picker", 102 rotateEffect: !1, 103 formatValue: function(e, n, a) { 104 return a.join(" ") 105 }, 106 onChange: function(a, o, u) { 107 var s, b = a.cols[0].displayValue; 108 if (b !== v) { 109 var t = m(b); 110 s = t[0].name; 111 var r = d(b, s); 112 return a.cols[1].replaceValues(t.map(function(e) { 113 return e.code 114 }), t.map(function(e) { 115 return e.name 116 })), 117 c.showDistrict && a.cols[2].replaceValues(r.map(function(e) { 118 return e.code 119 }), r.map(function(e) { 120 return e.name 121 })), 122 v = b, 123 h = s, 124 a.updateValue(), 125 !1 126 } 127 if (c.showDistrict && (s = a.cols[1].displayValue, s !== h)) { 128 var i = d(b, s); 129 return a.cols[2].replaceValues(i.map(function(e) { 130 return e.code 131 }), i.map(function(e) { 132 return e.name 133 })), 134 h = s, 135 a.updateValue(), 136 !1 137 } 138 e(n).attr("data-code", o[o.length - 1]), 139 e(n).attr("data-codes", o.join(",")), 140 c.onChange && c.onChange.call(n, a, o, u) 141 }, 142 cols: y 143 }; 144 if (this) { 145 var C = e.extend({}, 146 c, g), 147 w = e(this).val(); 148 //注意,這里是默認顯示第一個省的三級聯動,而且是必須的,如果匹配不到,會報錯二級聯動沒有被定義(坑!) 149 //這個'北京 北京市 東城區'條件改成:自己數據庫中的第一個省的三級聯動名稱即可,比如你想要把北京顯示在默認上(當然,最好是json數組對象的第一個省) 150 //替換下面的判斷條件:北京市 市轄區 東城區(判斷條件要與你數據一致,不然回會報錯,並且,默認顯示的條件也要與動態的數據一致) 151 if (w || (w = "北京市 市轄區 東城區"), v = w.split(" ")[0], h = w.split(" ")[1], V = w.split(" ")[2], w) { 152 if (C.value = u(w), C.value[0]) { 153 var D = m(C.value[0]); 154 C.cols[1].values = D.map(function(e) { 155 return e.code 156 }), 157 C.cols[1].displayValues = D.map(function(e) { 158 return e.name 159 }) 160 } 161 if (C.value[1]) { 162 if (c.showDistrict) { 163 var k = d(C.value[0], C.value[1]); 164 C.cols[2].values = k.map(function(e) { 165 return e.code 166 }), 167 C.cols[2].displayValues = k.map(function(e) { 168 return e.name 169 }) 170 } 171 } else if (c.showDistrict) { 172 var k = d(C.value[0], C.cols[1].values[0]); 173 C.cols[2].values = k.map(function(e) { 174 return e.code 175 }), 176 C.cols[2].displayValues = k.map(function(e) { 177 return e.name 178 }) 179 } 180 } 181 e(this).picker(C) 182 } 183 }) 184 }, 185 n = e.fn.cityPicker.prototype.defaults = { 186 showDistrict: !0 187 } 188 } ($);
初始化HTML頁面:
1 <!DOCTYPE html> 2 <html> 3 <head lang="en"> 4 <meta charset="UTF-8"> 5 <title></title> 6 <link rel="stylesheet" type="text/css" href="jquery-weui.min.css" /> 7 <style> 8 #city-picker{ 9 margin-left: 40%; 10 margin-right: 20%; 11 margin-top: 20%; 12 width: 200px; 13 height: 40px; 14 } 15 </style> 16 </head> 17 <body> 18 19 <input type='text' id='city-picker' placeholder='請選擇省市區縣' /> 20 <script src="jquery.min.js"></script> 21 <script type="text/javascript" src="jquery-weui.min.js"></script> 22 <script type="text/javascript" src="city-picker.min.js"></script> 23 <script> 24 $("#city-picker").cityPicker({ 25 title: "選擇省市區/縣", 26 onChange: function (picker, values, displayValues) {//選擇后觸發的事件 27 console.log(values, displayValues); 28 } 29 }); 30 </script> 31 </body> 32 </html>
問題來了,插件怎么回顯呢:
笨辦法一個,現在隱藏域把回顯的數據顯示在下拉上,這一步主要給用戶看到一個同步的效果,然后改js:第一步的js還需要改動:
修改后的:
1 // jshint ignore: start 2 + 3 function(e) { 4 //開發時,直接把數據庫數據設置給rawCitiesData,注意,這里要轉json對象,不是json字符串。 5 e.rawCitiesData = [{ 6 name: "北京", 7 code: "110000", 8 sub: [{ 9 name: "北京市", 10 code: "110000", 11 sub: [{ 12 name: "東城區", 13 code: "110101" 14 }] 15 }] 16 }] 17 } ($), 18 + 19 function(e) { 20 "use strict"; 21 var n, a = e.rawCitiesData, 22 c = function(e) { 23 for (var n = [], a = 0; a < e.length; a++) { 24 var c = e[a]; 25 //注意,這里過濾條件,比如:北京是的二級是市轄區,如果不把'市轄區'這個條件去掉,那么,市轄區下的所有去就沒有了。 26 /^請選擇|市轄區/.test(c.name) || n.push(c) 27 } 28 return n.length ? n: [] 29 }, 30 o = function(e) { 31 return e.sub ? c(e.sub) : [{ 32 name: "", 33 code: e.code 34 }] 35 }, 36 m = function(e) { 37 for (var n = 0; n < a.length; n++) if (a[n].code === e || a[n].name === e) return o(a[n]); 38 return [] 39 }, 40 d = function(e, n) { 41 for (var c = 0; c < a.length; c++) if (a[c].code === e || a[c].name === e) for (var m = 0; m < a[c].sub.length; m++) if (a[c].sub[m].code === n || a[c].sub[m].name === n) return o(a[c].sub[m]) 42 }, 43 u = function(e) { 44 var n, c, o = a[0], 45 m = e.split(" "); 46 return a.map(function(e) { 47 e.name === m[0] && (o = e) 48 }), 49 o.sub.map(function(e) { 50 e.name === m[1] && (n = e) 51 }), 52 m[2] && n.sub.map(function(e) { 53 e.name === m[2] && (c = e) 54 }), 55 c ? [o.code, n.code, c.code] : [o.code, n.code] 56 }; 57 e.fn.cityPicker = function(c) { 58 return c = e.extend({}, 59 n, c), 60 this.each(function() { 61 var n = this, 62 s = a.map(function(e) { 63 return e.name 64 }), 65 b = a.map(function(e) { 66 return e.code 67 }), 68 t = o(a[0]), 69 r = t.map(function(e) { 70 return e.name 71 }), 72 i = t.map(function(e) { 73 return e.code 74 }), 75 l = o(a[0].sub[0]), 76 f = l.map(function(e) { 77 return e.name 78 }), 79 p = l.map(function(e) { 80 return e.code 81 }), 82 v = s[0], 83 h = r[0], 84 V = f[0], 85 y = [{ 86 displayValues: s, 87 values: b, 88 cssClass: "col-province" 89 }, 90 { 91 displayValues: r, 92 values: i, 93 cssClass: "col-city" 94 }]; 95 c.showDistrict && y.push({ 96 values: p, 97 displayValues: f, 98 cssClass: "col-district" 99 }); 100 var g = { 101 cssClass: "city-picker", 102 rotateEffect: !1, 103 formatValue: function(e, n, a) { 104 return a.join(" ") 105 }, 106 onChange: function(a, o, u) { 107 var s, b = a.cols[0].displayValue; 108 if (b !== v) { 109 var t = m(b); 110 s = t[0].name; 111 var r = d(b, s); 112 return a.cols[1].replaceValues(t.map(function(e) { 113 return e.code 114 }), t.map(function(e) { 115 return e.name 116 })), 117 c.showDistrict && a.cols[2].replaceValues(r.map(function(e) { 118 return e.code 119 }), r.map(function(e) { 120 return e.name 121 })), 122 v = b, 123 h = s, 124 a.updateValue(), 125 !1 126 } 127 if (c.showDistrict && (s = a.cols[1].displayValue, s !== h)) { 128 var i = d(b, s); 129 return a.cols[2].replaceValues(i.map(function(e) { 130 return e.code 131 }), i.map(function(e) { 132 return e.name 133 })), 134 h = s, 135 a.updateValue(), 136 !1 137 } 138 e(n).attr("data-code", o[o.length - 1]), 139 e(n).attr("data-codes", o.join(",")), 140 c.onChange && c.onChange.call(n, a, o, u) 141 }, 142 cols: y 143 }; 144 if (this) { 145 var C = e.extend({}, 146 c, g), 147 w = e(this).val(); 148 //注意,這里是默認顯示第一個省的三級聯動,而且是必須的,如果匹配不到,會報錯二級聯動沒有被定義(坑!) 149 //這個'北京 北京市 東城區'條件改成:自己數據庫中的第一個省的三級聯動名稱即可,比如你想要把北京顯示在默認上(當然,最好是json數組對象的第一個省) 150 //替換下面的判斷條件:北京市 市轄區 東城區(判斷條件要與默認顯示的數據一致,不然回報錯,並且,默認的條件也要和動態的數據一致) 151 var defaultDatas = "北京市 市轄區 東城區";//初始化默認的顯示數據 152 if($("#ds").val()){//回顯的數據--數據庫的數據 153 defaultDatas = $("#ds").val(); 154 } 155 if (w || (w = defaultDatas), v = w.split(" ")[0], h = w.split(" ")[1], V = w.split(" ")[2], w) { 156 if (C.value = u(w), C.value[0]) { 157 var D = m(C.value[0]); 158 C.cols[1].values = D.map(function(e) { 159 return e.code 160 }), 161 C.cols[1].displayValues = D.map(function(e) { 162 return e.name 163 }) 164 } 165 if (C.value[1]) { 166 if (c.showDistrict) { 167 var k = d(C.value[0], C.value[1]); 168 C.cols[2].values = k.map(function(e) { 169 return e.code 170 }), 171 C.cols[2].displayValues = k.map(function(e) { 172 return e.name 173 }) 174 } 175 } else if (c.showDistrict) { 176 var k = d(C.value[0], C.cols[1].values[0]); 177 C.cols[2].values = k.map(function(e) { 178 return e.code 179 }), 180 C.cols[2].displayValues = k.map(function(e) { 181 return e.name 182 }) 183 } 184 } 185 e(this).picker(C) 186 } 187 }) 188 }, 189 n = e.fn.cityPicker.prototype.defaults = { 190 showDistrict: !0 191 } 192 } ($);
回顯的html:
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> <link rel="stylesheet" type="text/css" href="jquery-weui.min.css" /> <style> #city-picker{ margin-left: 40%; margin-right: 20%; margin-top: 20%; width: 200px; height: 40px; } </style> </head> <body> <input type='text' id='city-picker' value="湖南省 長沙市 芙蓉區" placeholder='請選擇省市區縣' /> <input type="text" id="ds" name="" value="湖南省 長沙市 芙蓉區"><!-- 這里使用隱藏域 --> <script src="jquery.min.js"></script> <script type="text/javascript" src="jquery-weui.min.js"></script> <script type="text/javascript" src="city-picker.min.js"></script> <script> $("#city-picker").cityPicker({ title: "選擇省市區/縣", onChange: function (picker, values, displayValues) { console.log(values, displayValues); } }); </script> </body> </html>
總得來說,這應該是封裝過的js,有可能別人有方法初始化動態數據或者回顯數據,只是我這邊比較捉急,沒時間在網絡上各種搜索了,直接看源碼...
歡迎各位大神丟板磚,提意見。嘿嘿嘿~~~