原生JavaScript实现的简单省市县三级联动功能示例

yizhihongxing

下面是详细的攻略:

简介

本攻略讲解的是如何用原生 JavaScript 实现简单的省市县三级联动功能。本文示例展示了如何根据选择的省市联动获取该市所有的区县,并支持手动模拟触发省市变化的事件以更新区县列表。

实现

HTML 结构

首先,我们需要定义一个 HTML 结构来展示省市县三级联动:

<!--省份-->
<select id="province">
  <option>Select Province</option>
</select>

<!--城市-->
<select id="city">
  <option>Select City</option>
</select>

<!--区县-->
<select id="county">
  <option>Select County</option>
</select>

其中,三个 select 元素分别用 id 为 province、city、county 进行了标识,这里的 option 默认选项用于展示初始状态。

数据源

再来,我们需要定义一份数据源,包含全国各个省市县的信息,这里为了方便示例,我们只定义几个数据项:

var provinceList = [{
  province_name: '广东省',
  city_list: [{
    city_name: '广州市',
    county_list: [{
      county_name: '荔湾区'
    }, {
      county_name: '海珠区'
    }]
  }, {
    city_name: '深圳市',
    county_list: [{
      county_name: '南山区'
    }, {
      county_name: '福田区'
    }]
  }]
}, {
  province_name: '湖南省',
  city_list: [{
    city_name: '长沙市',
    county_list: [{
      county_name: '岳麓区'
    }, {
      county_name: '开福区'
    }]
  }, {
    city_name: '株洲市',
    county_list: [{
      county_name: '天元区'
    }, {
      county_name: '荷塘区'
    }]
  }]
}];

这里定义了两个省份(广东、湖南),每个省份中包含若干个城市及其对应的区县。

事件绑定

接下来,我们需要定义一个函数用于根据选择的省市,更新县区列表,同时需要在 HTML 结构初始化完成后,初始化省份列表。

// 获取数据源中某一省份的城市列表
function getCityListByProvince(province_name) {
  var cityList = [];
  for (var i = 0; i < provinceList.length; i++) {
    if (provinceList[i].province_name === province_name) {
      cityList = provinceList[i].city_list;
      break;
    }
  }
  return cityList;
}

// 获取数据源中某一城市的区县列表
function getCountyListByCity(province_name, city_name) {
  var countyList = [];
  for (var i = 0; i < provinceList.length; i++) {
    if (provinceList[i].province_name === province_name) {
      for (var j = 0; j < provinceList[i].city_list.length; j++) {
        if (provinceList[i].city_list[j].city_name === city_name) {
          countyList = provinceList[i].city_list[j].county_list;
          break;
        }
      }
      break;
    }
  }
  return countyList;
}

// 根据省份更新城市列表
function updateCityList() {
  var province = document.getElementById('province');
  var city = document.getElementById('city');
  var province_name = province.options[province.selectedIndex].value;
  var cityList = getCityListByProvince(province_name);
  // 清空城市列表
  city.options.length = 0;
  // 添加城市选项
  for (var i = 0; i < cityList.length; i++) {
    var option = document.createElement('option');
    option.text = cityList[i].city_name;
    option.value = cityList[i].city_name;
    city.appendChild(option);
  }
  // 更新区县列表
  updateCountyList();
}

// 根据城市更新区县列表
function updateCountyList() {
  var province = document.getElementById('province');
  var city = document.getElementById('city');
  var county = document.getElementById('county');
  var province_name = province.options[province.selectedIndex].value;
  var city_name = city.options[city.selectedIndex].value;
  var countyList = getCountyListByCity(province_name, city_name);
  // 清空区县列表
  county.options.length = 0;
  // 添加区县选项
  for (var i = 0; i < countyList.length; i++) {
    var option = document.createElement('option');
    option.text = countyList[i].county_name;
    option.value = countyList[i].county_name;
    county.appendChild(option);
  }
}

// 初始化省份列表
function initProvinceList() {
  var province = document.getElementById('province');
  for (var i = 0; i < provinceList.length; i++) {
    var option = document.createElement('option');
    option.text = provinceList[i].province_name;
    option.value = provinceList[i].province_name;
    province.appendChild(option);
  }
  // 绑定省份列表选择事件
  province.onchange = function () {
    updateCityList();
  };
  // 初始化城市列表
  updateCityList();
}

// 手动模拟触发省份变化事件(仅作演示用)
function changeProvince() {
  var province = document.getElementById('province');
  var city = document.getElementById('city');
  var county = document.getElementById('county');
  // 选中广东省
  province.selectedIndex = 1;
  var event = new Event('change');
  province.dispatchEvent(event);
  // 选中深圳市
  city.selectedIndex = 2;
  city.dispatchEvent(event);
}

// 初始化省份列表
initProvinceList();

其中,updateCityList 函数根据选中的省份,更新城市列表,清空城市 select 的 options 按钮,重新添加城市选项;updateCountyList 函数根据选中的城市,更新区县列表,清空区县 select 的 options 按钮,重新添加区县选项;initProvinceList 函数初始化省份列表,为省份 select 添加 option ,并绑定 onchange 事件;changeProvince 函数手动模拟触发省份变化事件(仅作演示用)。

示例说明

示例一

假设用户先选择了省份 “广东省”,则该页面上的城市列表会随着选择的省份变化而更新,城市列表中将显示该省份下的所有城市(其中默认选项为“Select City”)。当用户选中一个城市后,区县列表将更新为该城市下的所有区县(其中默认选项为“Select County”):

1. 在页面刚加载完成后:
省份: [Select Province]
城市: [Select City]
区县: [Select County]

2. 选择省份"广东省"后:
省份: 广东省
城市: [Select City] 下拉菜单中显示:广州市、深圳市
区县: [Select County]

3. 选择广州市后:
省份: 广东省
城市: 广州市
区县: [Select County] 下拉菜单中显示:荔湾区、海珠区

示例二

当用户手动模拟触发省份变更事件时,城市、区县列表也会跟随变化,因为触发省份变更事件后会自动触发城市列表的更新:

1. 在页面刚加载完成后同上

2. 手动模拟触发广东省省份变更事件:
页面更新与示例一步骤2中一致

3. 手动触发深圳市城市变更事件:
页面更新与示例一步骤3中一致

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:原生JavaScript实现的简单省市县三级联动功能示例 - Python技术站

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

相关文章

  • 通过history解决ajax不支持前进/后退/刷新的问题

    当使用 Ajax 时,页面中的 URL 并不会被改变,这样 user-agent 在使用后退和前进功能时,就会失效。为此可以通过 history 对象来处理这个问题。 window.history 对象允许 JavaScript 访问浏览器的历史记录。其中最常用的方法是 pushState() 和 replaceState(),它们允许添加和修改当前历史记录…

    jquery 2023年5月27日
    00
  • jQWidgets jqxTextArea items 属性

    jQWidgets是一个面向现代web应用程序的高性能Javascript UI框架。jqxTextArea是jQWidgets中的一个文本输入控件,允许多行文本输入。其中,items属性指定输入框中的行数。在本文中,我们将详细讲解jqxTextArea的items属性。 1. items属性的语法 jqxTextArea的items属性语法为: $(sel…

    jquery 2023年5月12日
    00
  • jQWidgets jqxResponsivePanel toggleButtonSize属性

    jQWidgets jqxResponsivePanel toggleButtonSize属性 简介 jqxResponsivePanel是jQWidgets提供的一个响应式面板控件,能够根据不同的屏幕尺寸自动调整布局,提供好的用户体验。其中toggleButtonSize属性用于设置面板展开/折叠按钮的尺寸大小。 属性值 toggleButtonSize属…

    jquery 2023年5月11日
    00
  • Query中click(),bind(),live(),delegate()的区别

    针对“Query中click(),bind(),live(),delegate()的区别”,我会提供完整的攻略,包括含义、用法、区别,以及举例说明。 概述 首先让我们来看一下这四个方法的含义: click(): 绑定一个点击事件到一个元素上 bind(): 为指定元素添加一个或多个事件处理程序 live(): 为匹配选择器的元素绑定事件处理函数,即对动态添加…

    jquery 2023年5月28日
    00
  • jQWidgets jqxChart padding属性

    以下是关于“jQWidgets jqxChart padding属性”的完整攻略,包含两个示例说明: 简介 jqxChart 控件的 padding 属性是一个非常有用的,它可以图表的内边距。使用 padding 属性,可以方便地调整图表的布局和样式。 细攻略 以下是 jqChart 控件 padding 属性的详细攻略: padding 属性 paddin…

    jquery 2023年5月11日
    00
  • jQWidgets jqxListBox incrementalSearchDelay属性

    jQWidgets jqxListBox incrementalSearchDelay属性详解 jQWidgets是一个基于jQuery的UI组件库,提供了丰富UI组件工具包。jqxListBox是其中之一。本文将详细介绍jqxListBox的incrementalSearchDelay属性,包括定义、语法和示例。 incrementalSearchDela…

    jquery 2023年5月10日
    00
  • jQuery wrapAll()的应用实例

    当涉及到DOM元素的操作时,jQuery是一个非常常用且实用的JavaScript库。其中,wrapAll()是一种方法,可以将所有匹配的元素用指定的HTML结构包裹起来。 下面,我们将讲解jQuery wrapAll()的应用实例,包括两条示例说明。 一、基本语法 在使用这种方法进行元素包装时,我们需要指定想要用来包裹元素的HTML结构。这个结构可以是一个…

    jquery 2023年5月13日
    00
  • jQuery实现简单的抽奖游戏

    下面是jQuery实现简单的抽奖游戏的完整攻略: 一、思路概述 首先明确抽奖的基本功能:1. 显示所有奖品,并根据中奖情况改变状态2. 抽奖按钮的点击事件,获取随机中奖结果3. 奖品图片滚动效果,增强用户体验 根据以上要求,我们可以分为以下几个步骤来实现抽奖游戏的功能: 创建HTML骨架, 初步展示所有奖品 集成轮播插件,实现奖品图片滚动效果 根据奖项的中奖…

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