省市區三級聯動——思路、demo、示例


說明(2017-12-13 11:03:58):

1. 這個功能應該是注冊的時候非常、常用的了,不過現在都是微信登錄,手機端自動獲取位置什么的,可能就網站還用用吧!

2. 這個東西的難點在於統計各地省、市、自治區、以及茫茫多的地級市,是用數組還是json存?其實都可以,但要自己寫,估計寫兩個省就跪了,真的是非常之多啊!所以無奈只能用別人寫好的數組或json,而你一旦用了別人的數組或json,你就很難不用別人配套的js代碼了,那我自己還寫個J8啊!

3. 其實主要是為了了解一下三級聯動的思路,學習一下jquery的簡單操作。另外,畢竟別人寫的,跟自己的需求有些出入,有些地方得知道怎么改。

4. 雖然最后還是用了別人的代碼,哇哈哈哈哈!實在是不想自己創建省市數組!而且人家也沒用jquery,用的原生js。雖然我也只是用了幾個jquery的選擇器。。

下面是自己寫的demo,要引用jquery:

city.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
</head>
<body>
    <select id="province">
        <option value="value">選擇省</option>
        <!--<option value="value">北京</option>
        <option value="value">山東</option>-->
    </select>
    <select id="city">
        <option value="value">選擇市</option>
    </select>
    <select id="district">
        <option value="value">選擇區</option>
    </select>
</body>
<script src="jquery1.11.3.js" type="text/javascript"></script>
<script src="city.js" type="text/javascript"></script>
<script type="text/javascript">
    //獲取省、市、區select節點
    var province = $("#province");
    var city = $("#city");
    var district = $("#district");
    //提前定義動態變量市、區
    var cities;
    var districts;
    //定義省、市下標
    var p_num;
    var c_num;
    //添加省
    for (var i = 0; i < provinces.length; i++) {
        province.append("<option value='value'>" + provinces[i] + "</option>");
    }
    //選擇省后,添加市(如果點“選擇省”,清空市區)(如果沒查到對應的市,默認填充為“選擇市”)
    province.change(function () {
        //先清空市、區
        city.empty();
        district.empty();
        city.append("<option value='value'>選擇市</option>");
        district.append("<option value='value'>選擇區</option>");
        var p = province.find("option:selected").text();
        if (p == "選擇省") {
            city.empty();
            city.append("<option value='value'>選擇市</option>");
        } else {
            //查找選擇的省的下標
            for (var i in provinces) {
                if (provinces[i] == p) {
                    p_num = i;
                }
            }
            //網上一堆說eval不行的,不安全的,有很多替代方法的。麻痹找了一頓也沒找到,我就用eval了!
            //動態查找市的變量名,顯示
            cities = eval("p" + p_num);
            for (var i in cities) {
                city.append("<option value='value'>" + cities[i] + "</option>");
            }
        }
    }
    );
    //選擇市后,添加區(如果點“選擇市”,清空區)(如果沒查到對應的區,默認填充為“選擇區”)
    city.change(function () {
        var c = city.find("option:selected").text();
        if (c == "選擇市") {
            district.empty();
            district.append("<option value='value'>選擇區</option>");
        } else if ($.inArray(c, cities)) {
            //jquery的inarray方法,判斷某個元素是不是在數組中
            district.empty();
            district.append("<option value='value'>選擇區</option>");
        } else {
            for (var i in cities) {
                if (c == cities[i]) {
                    c_num = i;
                }
            }
            //            alert("p" + p_num + "_" + c_num);
            districts = eval("p" + p_num + "_" + c_num);
            for (var i in districts) {
                district.append("<option value='value'>" + districts[i] + "</option>");
            }
        }

    });
</script>
</html>

city.js

var provinces = ["山東", "北京"];
var p0 = ["濟南市", "青島市", "淄博市", "棗庄市"];
var p0_0 = ["市中區", "歷下區", "天橋區", "槐蔭區"];
var p0_1 = ["市南區", "市北區", "李滄區", "四方區"];
var p1 = ["北京"];
var p1_0 = ["東城", "西城", "海淀", "朝陽"];

補充:

1. 網上有人說可以這么寫,變量中可以存儲數組,但是這樣有一個問題,如果有兩個省份,有兩個重名的市,那數組就會重名,比如北京的朝陽區,和遼寧的朝陽市,不過這倆可以通過區和市分成兩個數組,但是其他地方有沒有重名的市我就沒做過調查了,應該說是有風險的。

var provinces = ["山東", "北京"];
Array["山東"] = ["濟南市", "青島市", "淄博市", "棗庄市"];
Array["濟南市"] = ["市中區", "歷下區", "天橋區", "槐蔭區"];
Array["青島市"] = ["市南區", "市北區", "李滄區", "四方區"];
Array["北京"] = ["北京市"];
Array["北京市"] = ["東城", "西城", "海淀", "朝陽"];

2. 我是用了純數組的辦法,一般網上比較好的示例都是用的json,比如下面這個,我就准備抄這個了:

純JS省市區三級聯動


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM