最近做了一个外包项目,其中写了一个模块是select框国家-省-市的三级联动,其中操作用到了JQuery,数据文件是引入了JSON,没有进行后端交互。如果用到后端交互的话,每次change的函数改成ajax请求即可。因为项目代码的保密,没有写得特别清楚,但结构应该也比较清晰了。
JSON格式
由于数据是用脚本分几个文档处理出来的,所以JSON文件的格式是形如以下形式,分为了国家-省.json,省-市.json,一般情况下整合在一起会比较合适,操作起来也比较方便。
[
{
"country":"China",
"provinces":[
"Guangdong",
"Beijing",
"Shanghai"
]
},
{...}
]
HTML
<div class="select-list">
<select name="country"></select>
<select name="provinces"></select>
<select name="cities"></select>
</div>
JS
var countrySel = $('select[name=country]');
var provincesSel = $('select[name=provinces]');
var citiesSel = $('select[name=cities]');
var changePro = function () {
var optionData = "";
// 遍历JSON
$.each(country2pro, function (idx, reg) {
optionData += "<option value='" + reg.country + "'>" + reg.country + "</option>";
});
countrySel.empty();
countrySel.html(optionData);
changePro();
};
var changePro = function () {
var optionData = "";
var idx = countrySel.get(0).selectedIndex;
country2pro[idx].provinces.sort();
country2pro[idx].provinces.forEach(function (item) {
optionData += "<option value='"+item+"'>" + item + "</option>";
});
provincesSel.empty();
provincesSel.html(optionData);
changeCity();
};
var changeCity = function () {
var optionData = "";
// 获取province值
var province = provincesSel.val();
$.each(prov2cities, function (idx, opt) {
if (opt.province == province) {
opt.cities.sort();
opt.cities.forEach(function (item) {
optionData += "<option value='"+item+"'>" + item + "</option>";
});
return false;
}
});
citiesSel.empty();
citiesSel.html(optionData);
};
//文档加载时执行时事件
window.onload = function () {
changeRegion();
}
//select框change事件
regionSel.change(function () {
changePro();
});
countrySel.change(function () {
changeCity();
});
一些小知识点
- $.each遍历JSON的时候通过return进行类似for循环的break和continue
- select框change的时候必须要清除框内的值