1. 程式人生 > 其它 >js實現三級聯動的函式封裝

js實現三級聯動的函式封裝

完整版的程式碼如下:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>三級聯動</title>
</head>

<body>
    <select name="" id="province"></select>
    <select name="" id="city"></select>
    <select name="" id="district"></select>
    <script src="./area.js"></script>
    <script>
        /*
        renderOpt()
        作用: 根據資料, 給某個select 渲染option
        參一: select元素 型別elementObject
        參二: 資料 obj
        返回值: 無
        */
        function renderOpt(select, data) {
            select.innerHTML = ' ';  // 先清空select
            if (data.constructor === Object) {
                for (var k in data) {  // 新增option
                    var option = document.createElement('option') // 建立一個option
                    option.innerHTML = k  //給option新增文字內容
                    option.value = k  // 給option新增value
                    select.appendChild(option) // 將建立option新增到 select上
                }
            } else if (Array.isArray(data)) {
                for (var i in data) {
                    data[i]
                    for (var k in data[i]) {
                        var option = document.createElement('option')
                        option.innerHTML = k
                        option.value = k
                        select.appendChild(option)
                    }
                }
            }

        }

        /*
        filterOptSelected()
        作用: 過濾某個select中選中的option
        參一: select元素  型別  elementObject
        返回值: 選中的option元素  型別: elementObject
        */
        function filterOptSelected(select) {
            //    var opts = document.querySelectorAll('select>option')
            var opts = select.options   // 獲取select元素中所有的option集合
            for (let i = 0; i < opts.length; i++) {  // 遍歷option, 為了檢查每個option
                var isSelected = opts[i].selected  // 獲取option值, true 選中   false  沒選中
                if (isSelected) {   // 當前被選中的option
                    return opts[i]  // 將選中的option元素 輸出到函式外部
                }
            }
        }
        var province_dom = document.querySelector('#province')
        // 第一步: 初始化
        // 1.1 初始化省資料渲染
        renderOpt(province_dom, area)

        // 1.2 初始化市
        // 1.2.1 獲取當前選中的是哪個省
        var pro_opt = filterOptSelected(province_dom)
        console.log(pro_opt);
        console.log(pro_opt.value);
        // 1.2.2 根據省獲取渲染市的資料
        var city_data = area[pro_opt.value][0]
        console.log(city_data);
        // 1.2.3 根據市資料渲染市
        var city_dom = document.querySelector('#city')
        renderOpt(city_dom, city_data)


        // 1.3 初始化區
        // 1.3.1 獲取當前選中的是哪個市
        var city_opt = filterOptSelected(city_dom)
        console.log(city_opt);
        console.log(city_opt.value);
        // 1.3.2 根據市獲取渲染區的資料

        var district_data = city_data[city_opt.value]
        console.log(district_data);
        // 1.3.3 根據區資料渲染區
        var district_dom = document.querySelector('#district')
        // ???
        renderOpt(district_dom, district_data)

        // 第二步: 當用戶更新, 省或者市

        // 2.1 監聽使用者是否更換了省
        province_dom.addEventListener('change', function () {
            // 2.1.1 獲取更新後的option
            var pro_opt = filterOptSelected(province_dom)
            // 2.1.2 根據選擇的省更新市資料
             city_data = area[pro_opt.value][0]
            console.log(city_data);
            // 2.1.3 根據市資料更新市
            renderOpt(city_dom, city_data)
            // 2.1.4 獲取當前更新的市, 得到獲取區資料的索引
            var city_opt = filterOptSelected(city_dom)
            console.log(city_opt.value);
            // 2.1.5 根據市索引獲取區資料
             district_data = city_data[city_opt.value]
            console.log(district_data);
            // 2.1.6 根據區資料, 渲染區
            renderOpt(district_dom, district_data)
        })

        city_dom.addEventListener('change', function () {
            // var pro_opt = filterOptSelected(province_dom)
            // var city_data = area[pro_opt.value][0]
            var city_opt = filterOptSelected(city_dom)
            var district_data = city_data[city_opt.value]
            renderOpt(district_dom, district_data)
        })
    </script>
</body>

</html>