07.demo 省市区

需求

通过三个下拉菜单的联动来实现,第一级下拉菜单为省级,第二级下拉菜单为市级,第三级下拉菜单为区级。当点击第一级下拉菜单,第二级菜单的内容会自动匹配;选择第二级菜单时,第三级菜单会自动生成。当我取消上一级菜单的选项时,次一级选项会自动消失。

演示图

思路解析

  1. HTML结构:

    • 三个下拉菜单分别用<select>元素表示,分别为省级(province)、市级(city)、区级(district)。
    • 每个下拉菜单都有一个id属性,方便在JavaScript中获取对应的元素引用。
    • 给省级下拉菜单添加了onchange事件,当省级选项改变时,触发updateCities函数。
    • 同样,市级下拉菜单也有onchange事件,当市级选项改变时,触发updateDistricts函数。
  2. JavaScript逻辑:

    • 定义了一个包含省市区数据的JavaScript对象 data,其中省份作为键,对应的市级数组作为值。

    • 获取省、市、区三个下拉菜单的引用。

    • 编写updateCities函数,该函数在省级下拉菜单选项改变时触发。

      • 获取选中的省份值。
      • 清空市级和区级下拉菜单的选项。
      • 如果选择了省份,启用市级下拉菜单,并将对应省份的市级数据添加到市级下拉菜单中。
      • 如果未选择省份,禁用市级和区级下拉菜单。
    • 编写updateDistricts函数,该函数在市级下拉菜单选项改变时触发。

      • 获取选中的市值。
      • 清空区级下拉菜单的选项。
      • 如果选择了市,启用区级下拉菜单,并根据选择的市添加对应的区级数据。
      • 如果未选择市,禁用区级下拉菜单。
  3. 数据处理:

    • 数据通过JavaScript对象data进行存储,每个省份对应一个市级数组。
    • 在函数中根据选择的省份或市级,动态生成对应的市级和区级选项。
  4. 禁用和启用下拉菜单:

    • 下拉菜单通过disabled属性进行禁用和启用。在没有选择省份或市级时,市级和区级下拉菜单被禁用,防止用户选择无效的组合。
  5. 动态生成选项:

    • 使用document.createElement方法创建新的<option>元素,设置其valuetextContent属性,然后将其添加到相应的下拉菜单中。

代码部分

ini 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>三级联动下拉菜单</title>
</head>
<body>

<!-- 省级下拉菜单 -->
<label for="province">省级:</label>
<select id="province" onchange="updateCities()">
    <option value="">请选择省份</option>
    <option value="jiangsu">江苏省</option>
    <option value="liaoning">辽宁省</option>
</select>

<!-- 市级下拉菜单 -->
<label for="city">市级:</label>
<select id="city" onchange="updateDistricts()" disabled>
    <option value="">请选择市</option>
</select>

<!-- 区级下拉菜单 -->
<label for="district">区级:</label>
<select id="district" disabled>
    <option value="">请选择区</option>
</select>

<script>
    // 省市区数据,可以根据实际情况进行修改
    const data = {
        jiangsu: ['南京市', '扬州市'],
        liaoning: ['沈阳市', '大连市']
    };

    // 获取省市区下拉菜单的引用
    const provinceSelect = document.getElementById('province');
    const citySelect = document.getElementById('city');
    const districtSelect = document.getElementById('district');

    // 更新市级下拉菜单的函数
    function updateCities() {
        // 获取选中的省份值
        const selectedProvince = provinceSelect.value;

        // 清空市级和区级下拉菜单的选项
        citySelect.innerHTML = '<option value="">请选择市</option>';
        districtSelect.innerHTML = '<option value="">请选择区</option>';

        // 如果选择了省份
        if (selectedProvince) {
            // 获取对应省份的市级数据
            const cities = data[selectedProvince];

            // 启用市级下拉菜单
            citySelect.disabled = false;

            // 将市级数据添加到市级下拉菜单中
            cities.forEach(city => {
                const option = document.createElement('option');
                option.value = city;
                option.textContent = city;
                citySelect.appendChild(option);
            });
        } else {
            // 如果未选择省份,禁用市级和区级下拉菜单
            citySelect.disabled = true;
            districtSelect.disabled = true;
        }
    }

    // 更新区级下拉菜单的函数
    function updateDistricts() {
        // 获取选中的市值
        const selectedCity = citySelect.value;

        // 清空区级下拉菜单的选项
        districtSelect.innerHTML = '<option value="">请选择区</option>';

        // 如果选择了市
        if (selectedCity) {
            // 启用区级下拉菜单
            districtSelect.disabled = false;

            // 这里可以根据实际情况获取对应市的区级数据,如果有的话,添加到区级下拉菜单中
            if (selectedCity === '南京市') {
                const districts = ['鼓楼区', '秦淮区'];
                districts.forEach(district => {
                    const option = document.createElement('option');
                    option.value = district;
                    option.textContent = district;
                    districtSelect.appendChild(option);
                });
            } else if (selectedCity === '扬州市') {
                const districts = ['广陵区', '邗江区'];
                districts.forEach(district => {
                    const option = document.createElement('option');
                    option.value = district;
                    option.textContent = district;
                    districtSelect.appendChild(option);
                });
            }
        } else {
            // 如果未选择市,禁用区级下拉菜单
            districtSelect.disabled = true;
        }
    }
</script>
</body>
</html>
相关推荐
Leyla15 分钟前
【代码重构】好的重构与坏的重构
前端
影子落人间18 分钟前
已解决npm ERR! request to https://registry.npm.taobao.org/@vant%2farea-data failed
前端·npm·node.js
世俗ˊ42 分钟前
CSS入门笔记
前端·css·笔记
子非鱼92142 分钟前
【前端】ES6:Set与Map
前端·javascript·es6
6230_1 小时前
git使用“保姆级”教程1——简介及配置项设置
前端·git·学习·html·web3·学习方法·改行学it
想退休的搬砖人1 小时前
vue选项式写法项目案例(购物车)
前端·javascript·vue.js
加勒比海涛1 小时前
HTML 揭秘:HTML 编码快速入门
前端·html
啥子花道1 小时前
Vue3.4 中 v-model 双向数据绑定新玩法详解
前端·javascript·vue.js
麒麟而非淇淋1 小时前
AJAX 入门 day3
前端·javascript·ajax
茶茶只知道学习2 小时前
通过鼠标移动来调整两个盒子的宽度(响应式)
前端·javascript·css