基于jquery & json的省市区联动

效果演示:

html代码:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>省市区联动</title>
    <script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.7.2.min.js" type="text/javascript"></script>
    <script src="/Scripts/script.js" type="text/javascript"></script>
</head>
<body>
<h2>Demo:</h2>
<select id="province">
    <option value="0">请选择省份</option>
</select>
<select id="city">
    <option value="0">请选择城市</option>
</select>
<select id="district">
    <option value="0">请选择区县</option>
</select>

<!--下列为初始值(可选,编辑表单时设置)-->
<input type="hidden" value="440000" id="pre_province"/>
<input type="hidden" value="440500" id="pre_city"/>
<input type="hidden" value="440511" id="pre_district"/>

<script type="text/javascript">
    $(function () {
        citySelector.Init($("#province"), $("#city"), $("#district"), $("#pre_province"), $("#pre_city"), $("#pre_district"), true);
    });
</script>
</body>
</html>

script.js代码:

/*
author: elycir
create: 2012-06
modify: 2012-08
description: 省市区三级(二级)联动
*/
var citySelector = function () {
    var jsonProvince = "/content/city/json-array-of-province.js";
    var jsonCity = "/content/city/json-array-of-city.js";
    var jsonDistrict = "/content/city/json-array-of-district.js";
    var initProvince = "<option value='0'>请选择省份</option>";
    var initCity = "<option value='0'>请选择城市</option>";
    var initDistrict = "<option value='0'>请选择区县</option>";
    return {
        Init: function (province, city, district, preProvince, preCity, preDistrict, hasDistrict) {
            var that = this;
            that._LoadOptions(jsonProvince, preProvince, province, null, 0, initProvince);
            province.change(function () {
                that._LoadOptions(jsonCity, preCity, city, province, 2, initCity);
            });
            if (hasDistrict) {
                city.change(function () {
                    that._LoadOptions(jsonDistrict, preDistrict, district, city, 4, initDistrict);
                });
                province.change(function () {
                    city.change();
                });
            }
            setTimeout(function () {
                province.change();
            }, 100);
        },
        _LoadOptions: function (datapath, preobj, targetobj, parentobj, comparelen, initoption) {
            $.get(
                datapath,
                function (r) {
                    var t = ''; // t:    html容器 
                    var s;      // s:    选中标识 
                    var pre;    // pre:  初始值
                    if (preobj === undefined || preobj === null) {
                        pre = 0;
                    } else {
                        pre = preobj.val();
                    }
                    for (var i = 0; i < r.length; i++) {
                        s = '';
                        if (comparelen === 0) {
                            if (pre !== "" && pre !== 0 && r[i].code === pre) {
                                s = ' selected=\"selected\" ';
                                pre = '';
                            }
                            t += '<option value=' + r[i].code + s + '>' + r[i].name + '</option>';
                        }
                        else {
                            var p = parentobj.val();
                            if (p.substring(0, comparelen) === r[i].code.substring(0, comparelen)) {
                                if (pre !== "" && pre !== 0 && r[i].code === pre) {
                                    s = ' selected=\"selected\" ';
                                    pre = '';
                                }
                                t += '<option value=' + r[i].code + s + '>' + r[i].name + '</option>';
                            }
                        }

                    }
                    if (initoption !== '') {
                        targetobj.html(initoption + t);
                    } else {
                        targetobj.html(t);
                    }
                },
                "json"
                );
        }
    };
} ();

省市区json数据文件:点击下载

原文地址:https://www.cnblogs.com/elycir/p/2559579.html