JS实现省市县三级下拉联动

yizhihongxing

JS实现省市县三级下拉联动是前端开发中比较常见的需求,可以让用户更方便地选择地址信息。下面我将分享一下我对于这个需求的实现思路和具体操作步骤。

实现思路

省市县三级下拉联动的实现思路其实比较简单,大体可以分为以下几个步骤:

  1. 创建一个包含省市县的地址数据,这个数据可以是JSON格式的对象,也可以是从后台接口获取的数据。
  2. 给省份下拉列表绑定change事件,当省份选项发生变化时,根据省份获取该省份下所有的城市,并动态生成城市下拉列表。
  3. 给城市下拉列表绑定change事件,当城市选项发生变化时,根据城市获取该城市下所有的县区,并动态生成县区下拉列表。
  4. 将用户选择的省市县信息进行合并处理,可以通过隐藏域等方式将其提交给后台。

具体操作步骤

下面是我编写的一个简单示例程序,来实现简单的省市县三级下拉联动效果。

  1. HTML结构

首先,我们需要编写HTML结构,这里我写了三个下拉列表,分别用于选择省份、城市和县区,还有一个隐藏的文本框用于存储用户选择的地址信息。

<select id="province">
  <option value="">请选择省份</option>
</select> 
<select id="city">
  <option value="">请选择城市</option>
</select>
<select id="county">
  <option value="">请选择县区</option>
</select>
<input type="hidden" id="address" name="address" value="">
  1. JS代码

接下来,我们需要编写JS代码来实现下拉列表的联动效果。代码中首先定义了一个包含省份、城市和县区信息的JSON对象,然后根据这个对象生成省份选项,当用户选择省份时,动态生成对应城市的选项,当用户选择城市时,动态生成对应县区的选项。

// 地址数据(省份、城市、县区)
var addressData = [
  {
    name: '湖南省',
    cities: [
      {
        name: '长沙市',
        counties: ['芙蓉区', '天心区', '岳麓区', '开福区', '雨花区', '望城区']
      },
      {
        name: '株洲市',
        counties: ['荷塘区', '芦淞区', '石峰区', '天元区', '醴陵市']
      },
      {
        name: '湘潭市',
        counties: ['雨湖区', '岳塘区', '湘乡市', '韶山市']
      }
    ]
  },
  {
    name: '广东省',
    cities: [
      {
        name: '广州市',
        counties: ['荔湾区', '越秀区', '海珠区', '天河区', '白云区']
      },
      {
        name: '深圳市',
        counties: ['罗湖区', '福田区', '南山区', '宝安区', '龙岗区']
      },
      {
        name: '珠海市',
        counties: ['香洲区', '斗门区', '金湾区']
      }
    ]
  }
];

// 获取省份下拉框
var provinceSelect = document.getElementById('province');
// 动态生成省份选项
for (var i = 0; i < addressData.length; i++) {
  var provinceOption = document.createElement('option');
  provinceOption.innerHTML = addressData[i].name;
  provinceSelect.appendChild(provinceOption);
}

// 城市下拉框的change事件处理函数
function citySelectChange() {
  // 获取省份和城市选项
  var provinceValue = provinceSelect.value;
  var citySelect = document.getElementById('city');
  var cityValue = citySelect.value;
  // 去掉之前生成的选项
  var countySelect = document.getElementById('county');
  countySelect.innerHTML = '<option value="">请选择县区</option>';
  // 根据省份和城市生成县区选项
  for (var i = 0; i < addressData.length; i++) {
    if (addressData[i].name === provinceValue) {
      for (var j = 0; j < addressData[i].cities.length; j++) {
        if (addressData[i].cities[j].name === cityValue) {
          var counties = addressData[i].cities[j].counties;
          for (var k = 0; k < counties.length; k++) {
            var countyOption = document.createElement('option');
            countyOption.innerHTML = counties[k];
            countySelect.appendChild(countyOption);
          }
          break;
        }
      }
      break;
    }
  }
  // 更新隐藏域的值
  document.getElementById('address').value = provinceValue + '-' + cityValue + '-' + countySelect.value;
}

// 省份下拉框的change事件处理函数
function provinceSelectChange() {
  // 获取省份选项
  var provinceSelect = this;
  var provinceValue = provinceSelect.value;
  // 去掉之前生成的选项
  var citySelect = document.getElementById('city');
  citySelect.innerHTML = '<option value="">请选择城市</option>';
  var countySelect = document.getElementById('county');
  countySelect.innerHTML = '<option value="">请选择县区</option>';
  // 根据省份生成城市选项
  for (var i = 0; i < addressData.length; i++) {
    if (addressData[i].name === provinceValue) {
      var cities = addressData[i].cities;
      for (var j = 0; j < cities.length; j++) {
        var cityOption = document.createElement('option');
        cityOption.innerHTML = cities[j].name;
        citySelect.appendChild(cityOption);
      }
      break;
    }
  }
  // 更新隐藏域的值
  document.getElementById('address').value = provinceValue + '-' + citySelect.value + '-' + countySelect.value;
  // 给城市下拉框绑定change事件
  citySelect.onchange = citySelectChange;
}

// 给省份下拉框绑定change事件
provinceSelect.onchange = provinceSelectChange;
  1. 示例说明

下面我来介绍一下两个具体的示例。

示例1:使用JSON数据生成省份、城市和县区选项

在这个示例中,我直接使用一个包含省份、城市和县区信息的JSON对象,根据这个对象生成省份、城市和县区选项。

// 地址数据(省份、城市、县区)
var addressData = [
  {
    name: '湖南省',
    cities: [
      {
        name: '长沙市',
        counties: ['芙蓉区', '天心区', '岳麓区', '开福区', '雨花区', '望城区']
      },
      {
        name: '株洲市',
        counties: ['荷塘区', '芦淞区', '石峰区', '天元区', '醴陵市']
      },
      {
        name: '湘潭市',
        counties: ['雨湖区', '岳塘区', '湘乡市', '韶山市']
      }
    ]
  },
  {
    name: '广东省',
    cities: [
      {
        name: '广州市',
        counties: ['荔湾区', '越秀区', '海珠区', '天河区', '白云区']
      },
      {
        name: '深圳市',
        counties: ['罗湖区', '福田区', '南山区', '宝安区', '龙岗区']
      },
      {
        name: '珠海市',
        counties: ['香洲区', '斗门区', '金湾区']
      }
    ]
  }
];

// 获取省份下拉框
var provinceSelect = document.getElementById('province');
// 动态生成省份选项
for (var i = 0; i < addressData.length; i++) {
  var provinceOption = document.createElement('option');
  provinceOption.innerHTML = addressData[i].name;
  provinceSelect.appendChild(provinceOption);
}

// 城市下拉框的change事件处理函数
function citySelectChange() {
  // 获取省份和城市选项
  var provinceValue = provinceSelect.value;
  var citySelect = document.getElementById('city');
  var cityValue = citySelect.value;
  // 去掉之前生成的选项
  var countySelect = document.getElementById('county');
  countySelect.innerHTML = '<option value="">请选择县区</option>';
  // 根据省份和城市生成县区选项
  for (var i = 0; i < addressData.length; i++) {
    if (addressData[i].name === provinceValue) {
      for (var j = 0; j < addressData[i].cities.length; j++) {
        if (addressData[i].cities[j].name === cityValue) {
          var counties = addressData[i].cities[j].counties;
          for (var k = 0; k < counties.length; k++) {
            var countyOption = document.createElement('option');
            countyOption.innerHTML = counties[k];
            countySelect.appendChild(countyOption);
          }
          break;
        }
      }
      break;
    }
  }
  // 更新隐藏域的值
  document.getElementById('address').value = provinceValue + '-' + cityValue + '-' + countySelect.value;
}

// 省份下拉框的change事件处理函数
function provinceSelectChange() {
  // 获取省份选项
  var provinceSelect = this;
  var provinceValue = provinceSelect.value;
  // 去掉之前生成的选项
  var citySelect = document.getElementById('city');
  citySelect.innerHTML = '<option value="">请选择城市</option>';
  var countySelect = document.getElementById('county');
  countySelect.innerHTML = '<option value="">请选择县区</option>';
  // 根据省份生成城市选项
  for (var i = 0; i < addressData.length; i++) {
    if (addressData[i].name === provinceValue) {
      var cities = addressData[i].cities;
      for (var j = 0; j < cities.length; j++) {
        var cityOption = document.createElement('option');
        cityOption.innerHTML = cities[j].name;
        citySelect.appendChild(cityOption);
      }
      break;
    }
  }
  // 更新隐藏域的值
  document.getElementById('address').value = provinceValue + '-' + citySelect.value + '-' + countySelect.value;
  // 给城市下拉框绑定change事件
  citySelect.onchange = citySelectChange;
}

// 给省份下拉框绑定change事件
provinceSelect.onchange = provinceSelectChange;

示例2:使用AJAX从后台获取省份、城市和县区数据

在这个示例中,我通过AJAX请求从后台获取省份、城市和县区数据,然后根据这个数据生成省份、城市和县区选项。

// 获取省份下拉框
var provinceSelect = document.getElementById('province');

// 根据地址获取省份、城市、县区数据
function getAddressData(callback) {
  // AJAX请求
  var xhr = new XMLHttpRequest();
  xhr.onreadystatechange = function() {
    if (xhr.readyState === 4) {
      if (xhr.status === 200) {
        var result = JSON.parse(xhr.responseText);
        callback(result);
      }
    }
  };
  xhr.open('GET', '/getAddressData', true);
  xhr.send();
}

// 动态生成省份选项
getAddressData(function(data) {
  var provinces = data.provinces;
  for (var i = 0; i < provinces.length; i++) {
    var provinceOption = document.createElement('option');
    provinceOption.innerHTML = provinces[i];
    provinceSelect.appendChild(provinceOption);
  }
});

// 城市下拉框的change事件处理函数
function citySelectChange() {
  // 获取省份和城市选项
  var provinceValue = provinceSelect.value;
  var citySelect = document.getElementById('city');
  var cityValue = citySelect.value;
  // AJAX请求,根据省份和城市获取县区数据
  var xhr = new XMLHttpRequest();
  xhr.onreadystatechange = function() {
    if (xhr.readyState === 4) {
      if (xhr.status === 200) {
        var result = JSON.parse(xhr.responseText);
        var counties = result.counties;
        var countySelect = document.getElementById('county');
        countySelect.innerHTML = '<option value="">请选择县区</option>';
        for (var i = 0; i < counties.length; i++) {
          var countyOption = document.createElement('option');
          countyOption.innerHTML = counties[i];
          countySelect.appendChild(countyOption);
        }
      }
    }
  };
  xhr.open('GET', '/getCountyData?province=' + encodeURIComponent(provinceValue) + '&city=' + encodeURIComponent(cityValue), true);
  xhr.send();
  // 更新隐藏域的值
  document.getElementById('address').value = provinceValue + '-' + cityValue + '-' + countySelect.value;
}

// 省份下拉框的change事件处理函数
function provinceSelectChange() {
  // 获取省份选项
  var provinceSelect = this;
  var provinceValue = provinceSelect.value;
  // AJAX请求,根据省份获取城市数据
  var xhr = new XMLHttpRequest();
  xhr.onreadystatechange = function() {
    if (xhr.readyState === 4) {
      if (xhr.status === 200) {
        var result = JSON.parse(xhr.responseText);
        var cities = result.cities;
        var citySelect = document.getElementById('city');
        var countySelect = document.getElementById('county');
        citySelect.innerHTML = '<option value="">请选择城市</option>';
        countySelect.innerHTML = '<option value="">请选择县区</option>';
        for (var i = 0; i < cities.length; i++) {
          var cityOption = document.createElement('option');
          cityOption.innerHTML = cities[i];
          citySelect.appendChild(cityOption);
        }
        // 给城市下拉框绑定change事件
        citySelect.onchange = citySelectChange;
      }
    }
  };
  xhr.open('GET', '/getCityData?province=' + encodeURIComponent(provinceValue), true);
  xhr.send();
  // 更新隐藏域的值
  document.getElementById('address').value = provinceValue + '-' + document.getElementById('city').value + '-' + document.getElementById('county').value;
}

// 给省份下拉框绑定change事件
provinceSelect.onchange = provinceSelectChange;

以上就是我对于JS实现省市县三级下拉联动的完整攻略,希望对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS实现省市县三级下拉联动 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • jQuery的attr与prop使用介绍

    当使用 jQuery 操作 HTML 元素时,有时需要改变 HTML 元素的属性值或者属性。那么这时候就需要使用 attr 或 prop 来获取或设置元素属性的值。然而,这两个方法有时候使用有些疑惑,下面将详细讲解 jQuery 的 attr 与 prop 的使用方法。 attr 方法 获取属性值 使用 attr 方法获取元素属性值,可以使用以下语法: $(…

    jquery 2023年5月28日
    00
  • jQuery UI Dialog的最大高度选项

    以下是关于 jQuery UI Dialog 最大高度选项的详细攻略: jQuery UI Dialog 最大高度选项 最大高度选项用于指定对话框的最大高度。可以使用该选项来控制对话框的大小。 语法 $(selector).dialog({ maxHeight: 400 }); 参数 maxHeight: 一个数字,指示对话框的最大高度。默认为 “none”…

    jquery 2023年5月11日
    00
  • jQuery UI Sortable sort事件

    jQuery UI 的 Sortable 组件提供了一个 sort 事件,该事件在 Sortable 实例中的项目排序发生更改时触发。在本教程中,我们将详细介绍 Sortable 的 sort 事件的使用方法。 sort 事件基本语法如下: $( ".selector" ).sortable({ sort: function( event…

    jquery 2023年5月11日
    00
  • jQWidgets jqxComboBox enableSelection属性

    以下是关于“jQWidgets jqxComboBox enableSelection属性”的完整攻略,包含两个示例说明: 简介 jqxComboBox 控件的 enableSelection 属性用于启用或禁用下拉列表中的选项选择。 完整攻略 以下是 jqxComboBox 控件 enableSelection 属性的完整攻略: 定义 enableSele…

    jquery 2023年5月11日
    00
  • jQuery attribute^=value 选择器

    以下是关于jQuery attribute^=value选择器的完整攻略: 什么是jQuery attribute^=value选择器? jQuery attribute^=value选择器是一种用于选择具有特定属性值开头的HTML元素的语法。使用这个选择器可以轻松地选择具有特定属性开头的HTML元素,并对其进行操作。 如何使用jQuery attribut…

    jquery 2023年5月12日
    00
  • jQuery Mobile pageinit事件

    以下是关于jQuery Mobile pageinit事件的完整攻略: pageinit事件是什么? pageinit事件是jQuery Mobile中的一个事件,它在页面初始化时触发。这个事件通用于在页面加载时执行一些初始化代码,例如绑定事件处理程序或设置默认值。 如何使用pageinit事件? 可以使用以下代码来绑定pageinit事件: $(docum…

    jquery 2023年5月11日
    00
  • jQuery form插件之ajaxForm()和ajaxSubmit()的可选参数项对象

    jQuery form插件是一个非常强大的表单提交插件,可以使表单的提交和验证变得非常简单和优雅。其中,ajaxForm()和ajaxSubmit()是该插件最强大的两个方法之一,具有非常多的可选参数项,可以满足绝大多数的需求。 ajaxForm()方法 beforeSubmit:该函数在表单提交前被调用,可以在这里进行表单的验证和数据的处理。如果该函数返回…

    jquery 2023年5月27日
    00
  • jquery代码规范让代码越来越好看

    下面是关于jQuery代码规范的完整攻略: 1. 编码风格 为了让代码看起来更加清晰易懂,我们在编写jQuery代码时,应当遵循一定的编码风格。 1.1 缩进 在缩进方面,我们可以使用2个或4个空格来进行缩进,但是不能混用。 下面是一个使用2个空格缩进的例子: $(document).ready(function() { $("button&quo…

    jquery 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部