4级联动的JS

<!DOCTYPE html>
<html>
<head>
  <title>四级联动完整示例</title>
</head>
<body>
  <!-- 四级下拉框 -->
  <select id="province"><option value="">请选择省份</option></select>
  <select id="city"><option value="">请选择城市</option></select>
  <select id="district"><option value="">请选择区县</option></select>
  <select id="street"><option value="">请选择街道</option></select>
 
  <script>
    // 完整数据(省-市-区-街道)
    const regionData = [
      {
        id: 1,
        name: "广东省",
        children: [
          {
            id: 11,
            name: "广州市",
            children: [
              {
                id: 1101,
                name: "天河区",
                children: [
                  { id: 110101, name: "石牌街道" },
                  { id: 110102, name: "天河南街道" }
                ]
              },
              {
                id: 1102,
                name: "越秀区",
                children: [
                  { id: 110201, name: "北京街道" },
                  { id: 110202, name: "人民街道" }
                ]
              }
            ]
          }
        ]
      },
      {
        id: 2,
        name: "浙江省",
        children: [
          {
            id: 21,
            name: "杭州市",
            children: [
              {
                id: 2101,
                name: "西湖区",
                children: [
                  { id: 210101, name: "灵隐街道" },
                  { id: 210102, name: "北山街道" }
                ]
              }
            ]
          }
        ]
      }
    ];
 
    // ==================== 核心函数 ====================
    // 初始化第一级(省份)
    function initFirstLevel() {
      const provinceSelect = document.getElementById('province');
      provinceSelect.innerHTML = '<option value="">请选择省份</option>';
      regionData.forEach(province => {
        const option = document.createElement('option');
        option.value = province.id;
        option.textContent = province.name;
        provinceSelect.appendChild(option);
      });
    }
 
    // 更新下级选项(通用方法)
    function updateNextLevel(parentLevel, childLevel, parentId) {
      const childSelect = document.getElementById(childLevel);
      childSelect.innerHTML = `<option value="">请选择${getLevelName(childLevel)}</option>`;
 
      // 根据父级ID查找子级数据
      let childData = [];
      if (parentLevel === 'province') {
        childData = regionData.find(p => p.id === parentId)?.children || [];
      } else if (parentLevel === 'city') {
        const province = regionData.find(p => p.children?.some(c => c.id === parentId));
        childData = province?.children?.find(c => c.id === parentId)?.children || [];
      } else if (parentLevel === 'district') {
        const province = regionData.find(p => p.children?.some(c => c.children?.some(d => d.id === parentId)));
        const city = province?.children?.find(c => c.children?.some(d => d.id === parentId));
        childData = city?.children?.find(d => d.id === parentId)?.children || [];
      }
 
      // 填充子级选项
      childData.forEach(item => {
        const option = document.createElement('option');
        option.value = item.id;
        option.textContent = item.name;
        childSelect.appendChild(option);
      });
    }
 
    // 设置默认选中(核心方法)
    function setDefaultSelected(parentId, childIds = []) {
      if (!parentId) return;
 
      // 设置省份
      document.getElementById('province').value = parentId;
      updateNextLevel('province', 'city', parentId);
 
      // 递归设置子级
      let currentParentId = parentId;
      const levels = ['city', 'district', 'street'];
      for (let i = 0; i < childIds.length; i++) {
        const childId = childIds[i];
        const currentLevel = levels[i];
        const nextLevel = levels[i + 1];
 
        document.getElementById(currentLevel).value = childId;
        if (nextLevel) {
          updateNextLevel(currentLevel, nextLevel, childId);
        }
        currentParentId = childId;
      }
    }
 
    // ==================== 辅助函数 ====================
    function getLevelName(level) {
      const map = { province: '省份', city: '城市', district: '区县', street: '街道' };
      return map[level] || '';
    }
 
    // ==================== 事件绑定 ====================
    document.getElementById('province').addEventListener('change', (e) => {
      updateNextLevel('province', 'city', parseInt(e.target.value));
      document.getElementById('district').innerHTML = '<option value="">请选择区县</option>';
      document.getElementById('street').innerHTML = '<option value="">请选择街道</option>';
    });
 
    document.getElementById('city').addEventListener('change', (e) => {
      updateNextLevel('city', 'district', parseInt(e.target.value));
      document.getElementById('street').innerHTML = '<option value="">请选择街道</option>';
    });
 
    document.getElementById('district').addEventListener('change', (e) => {
      updateNextLevel('district', 'street', parseInt(e.target.value));
    });
 
    // ==================== 初始化 ====================
    document.addEventListener('DOMContentLoaded', () => {
      // 1. 初始化省份
      initFirstLevel();
 
      // 2. 设置默认选中(两个参数:父ID + 子ID数组)
      setDefaultSelected(2, [21, 2101, 210102]); // 广东省 -> 广州市 -> 天河区 -> 石牌街道
      
      // 其他示例:
      // setDefaultSelected(2, [21, 2101, 210101]); // 浙江省 -> 杭州市 -> 西湖区 -> 灵隐街道
    });
  </script>
</body>
</html>

评论

发表新评论

此内容将保密,不会被其他人看见。
点击刷新验证码
  • 可用的 UBB 标签:
  • 留言最长字数:1000。