JavaScript实现城市选择控件的效果

实现城市选择控件的效果可以分为以下几个步骤:

1. 编写HTML代码

通过HTML代码,我们可以创建城市选择控件需要的元素。示例代码如下:

<input type="text" id="city-picker" placeholder="请选择省/市/区" readonly>
<div class="city-picker-container">
  <div class="city-picker-tab">
    <div class="tab-item active">省份</div>
    <div class="tab-item">城市</div>
    <div class="tab-item">区县</div>
  </div>
  <div class="city-picker-content">
    <div class="content-item active">
      <ul class="province-list">
        <li data-code="110000">北京市</li>
        <li data-code="120000">天津市</li>
        <li data-code="310000">上海市</li>
        <li data-code="440000">广东省</li>
        <li data-code="330000">浙江省</li>
        <li data-code="420000">湖北省</li>
        <li data-code="410000">河南省</li>
        <li data-code="320000">江苏省</li>
        <li data-code="130000">河北省</li>
        <li data-code="210000">辽宁省</li>
      </ul>
    </div>
    <div class="content-item">
      <ul class="city-list"></ul>
    </div>
    <div class="content-item">
      <ul class="district-list"></ul>
    </div>
  </div>
</div>

在上面的代码中,我们定义了一个文本输入框和一个城市选择控件的容器,容器中包含两部分内容:标签栏和内容区域。标签栏用于切换各个选项卡,内容区域显示省、市、区的列表。

2. 编写CSS代码

编写CSS代码用于美化页面,使城市选择控件更加美观。示例代码如下:

.city-picker-container {
  position: relative;
  margin-top: 5px;
  width: 300px;
}

.city-picker-tab {
  display: flex;
  justify-content: space-between;
  border: 1px solid #ccc;
}

.tab-item {
  padding: 10px;
  width: 33.33333%;
  text-align: center;
  font-size: 14px;
  cursor: pointer;
}

.tab-item.active {
  background-color: #f7f7f7;
}

.city-picker-content {
  position: absolute;
  top: 38px;
  left: 0;
  right: 0;
  z-index: 999;
  border: 1px solid #ccc;
  border-top: none;
  display: none;
}

.content-item {
  display: none;
}

.content-item.active {
  display: block;
}

.province-list,
.city-list,
.district-list {
  list-style: none;
  padding: 10px;
  margin: 0;
}

.province-list li,
.city-list li,
.district-list li {
  padding: 10px 5px;
  cursor: pointer;
}

.province-list li:hover,
.city-list li:hover,
.district-list li:hover {
  background-color: #f7f7f7;
}

在上面的代码中,我们定义了容器、标签栏、内容区域的样式以及省、市、区列表的样式。

3. 添加交互逻辑

接下来,我们需要添加JavaScript代码以实现控件的交互逻辑。首先,我们需要监听文本输入框的点击事件,当点击文本输入框时,显示城市选择控件。

var cityPicker = document.querySelector('#city-picker');
var container = document.querySelector('.city-picker-container');
var tabs = document.querySelectorAll('.tab-item');
var contents = document.querySelectorAll('.content-item');
var provinceList = document.querySelector('.province-list');
var cityList = document.querySelector('.city-list');
var districtList = document.querySelector('.district-list');

cityPicker.onclick = function() {
  container.style.display = 'block';
};

在上面的代码中,我们通过querySelector方法获取了城市选择控件需要的各个元素,并监听文本输入框的点击事件。当点击文本输入框时,设置城市选择控件的容器可见。

接着,我们需要监听标签栏的点击事件,当点击不同的标签时,切换到对应的内容区域。

for (var i = 0; i < tabs.length; i++) {
  tabs[i].index = i;
  tabs[i].onclick = function() {
    for (var j = 0; j < tabs.length; j++) {
      tabs[j].classList.remove('active');
      contents[j].classList.remove('active');
    }
    this.classList.add('active');
    contents[this.index].classList.add('active');
  }
}

在上面的代码中,我们遍历了标签栏的所有元素,并监听每个标签的点击事件。当点击某个标签时,移除所有标签和内容区域的active类,然后给当前标签和对应的内容区域添加active类。

最后,我们需要填充省、市、区列表的数据,并实现联动效果。例如,当选中某个省份时,刷新城市列表并显示城市列表。示例代码如下:

var cityData = {
  110000: [
    {
      code: 110100,
      name: '北京市'
    }
  ],
  120000: [
    {
      code: 120100,
      name: '天津市'
    }
  ],
  310000: [
    {
      code: 310100,
      name: '上海市'
    }
  ],
  440000: [
    {
      code: 440100,
      name: '广州市'
    },
    {
      code: 440200,
      name: '韶关市'
    },
    {
      code: 440300,
      name: '深圳市'
    },
    {
      code: 440400,
      name: '珠海市'
    },
    {
      code: 440500,
      name: '汕头市'
    }
  ],
  330000: [
    {
      code: 330100,
      name: '杭州市'
    },
    {
      code: 330200,
      name: '宁波市'
    },
    {
      code: 330300,
      name: '温州市'
    },
    {
      code: 330400,
      name: '嘉兴市'
    },
    {
      code: 330500,
      name: '湖州市'
    }
  ],
  420000: [
    {
      code: 420100,
      name: '武汉市'
    },
    {
      code: 420200,
      name: '黄石市'
    },
    {
      code: 420300,
      name: '十堰市'
    },
    {
      code: 420400,
      name: '宜昌市'
    },
    {
      code: 420500,
      name: '襄阳市'
    }
  ],
  410000: [
    {
      code: 410100,
      name: '郑州市'
    },
    {
      code: 410200,
      name: '开封市'
    },
    {
      code: 410300,
      name: '洛阳市'
    },
    {
      code: 410400,
      name: '平顶山市'
    },
    {
      code: 410500,
      name: '安阳市'
    }
  ],
  320000: [
    {
      code: 320100,
      name: '南京市'
    },
    {
      code: 320200,
      name: '无锡市'
    },
    {
      code: 320300,
      name: '徐州市'
    },
    {
      code: 320400,
      name: '常州市'
    },
    {
      code: 320500,
      name: '苏州市'
    }
  ],
  130000: [
    {
      code: 130100,
      name: '石家庄市'
    },
    {
      code: 130200,
      name: '唐山市'
    },
    {
      code: 130300,
      name: '邯郸市'
    },
    {
      code: 130400,
      name: '邢台市'
    },
    {
      code: 130500,
      name: '保定市'
    }
  ],
  210000: [
    {
      code: 210100,
      name: '沈阳市'
    },
    {
      code: 210200,
      name: '大连市'
    },
    {
      code: 210300,
      name: '鞍山市'
    },
    {
      code: 210400,
      name: '抚顺市'
    },
    {
      code: 210500,
      name: '本溪市'
    }
  ]
};

function refreshCityList(provinceCode) {
  cityList.innerHTML = '';
  var cities = cityData[provinceCode];
  for (var i = 0; i < cities.length; i++) {
    var city = cities[i];
    var li = document.createElement('li');
    li.innerHTML = city.name;
    li.setAttribute('data-code', city.code);
    cityList.appendChild(li);
  }
}

provinceList.onclick = function(e) {
  if (e.target.tagName.toLowerCase() === 'li') {
    var provinceCode = e.target.getAttribute('data-code');
    e.target.parentNode.querySelector('.active').classList.remove('active');
    e.target.classList.add('active');
    refreshCityList(provinceCode);
    tabs[0].classList.remove('active');
    tabs[1].classList.add('active');
    contents[0].classList.remove('active');
    contents[1].classList.add('active');
  }
};

cityList.onclick = function(e) {
  if (e.target.tagName.toLowerCase() === 'li') {
    var cityCode = e.target.getAttribute('data-code');
    e.target.parentNode.querySelector('.active').classList.remove('active');
    e.target.classList.add('active');
    // TODO: 刷新区县列表
    tabs[1].classList.remove('active');
    tabs[2].classList.add('active');
    contents[1].classList.remove('active');
    contents[2].classList.add('active');
  }
};

在上面的代码中,我们定义了城市数据和刷新城市列表的方法。当选中某个省份时,调用refreshCityList方法刷新城市列表并显示城市列表。当选中某个城市时,刷新区县列表并显示区县列表。

至此,我们已经完成了JavaScript实现城市选择控件的效果的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript实现城市选择控件的效果 - Python技术站

(0)
上一篇 2023年6月15日
下一篇 2023年6月15日

相关文章

  • Java计算代码段执行时间的详细过程

    计算代码段执行时间在Java中非常常见,我们可以通过多种方式来实现。下面我将向您详细介绍如何使用Java代码计算代码段执行时间的完整攻略: 步骤一:编写需要计算时间的代码段 首先,我们需要编写需要计算时间的代码段。作为例子,我们假设我们需要计算一个数组排序的时间。这是我们的代码段示例: import java.util.Arrays; public clas…

    Java 2023年5月20日
    00
  • springboot配置druid多数据源的示例代码

    下面是“springboot配置druid多数据源的示例代码”的完整攻略。 目录 准备工作 配置Druid数据源 配置多数据源 测试多数据源 示例代码 准备工作 在开始配置Druid多数据源之前,我们需要先进行一些准备工作: 确认使用的Spring Boot版本,本示例使用的是 2.4.2 版本。 添加相关依赖,包括 spring-boot-starter-…

    Java 2023年5月20日
    00
  • java 输入3个数a,b,c,按大小顺序输出的实例讲解

    首先我们需要编写一个Java程序,实现输入三个数a,b,c,并按照大小顺序输出这三个数。下面是一个示例代码: import java.util.Scanner; public class SortNumbers { public static void main(String[] args) { Scanner scanner = new Scanner(S…

    Java 2023年5月26日
    00
  • Java异常处理 Throwable实现方法解析

    Java 中的异常(Exception)处理机制能够帮助程序员更加优雅地解决程序运行过程中出现的错误,避免了程序的中断和崩溃。而在 Java 的异常处理机制中,核心的接口就是Throwable。在本篇攻略中,我将为大家详细讲解 Java 异常处理中 Throwable 接口的使用方法和实现技巧,同时提供两个示例分别说明如何使用 Throwable 接口进行异…

    Java 2023年5月27日
    00
  • 基于JDBC封装的BaseDao(实例代码)

    基于JDBC封装的BaseDao可以使得我们在操作关系型数据库时更加方便、快捷。下面我将详细讲解BaseDao的使用攻略。 一、什么是BaseDao BaseDao是基于JDBC进行封装的通用数据访问层,提供了基本的CURD方法以便我们进行数据操作。在使用BaseDao的同时,我们也可以轻松地进行扩展和定制,满足复杂查询和特殊需求。 二、BaseDao类的代…

    Java 2023年6月16日
    00
  • hadoop 全面解读自定义分区

    Hadoop 全面解读自定义分区 什么是分区 在 Hadoop 中,分区是指在将数据写入到 HDFS 中时,对数据进行分类以便于管理。在每个分区中,都包含了一部分数据,每个分区都有一个固定的编号。 默认分区 当我们使用 Hadoop 内置的 MR 程序时,所有的数据都将会按照默认的哈希分区规则进行分区。一般情况下,分区的数量是由系统自动计算的。 自定义分区 …

    Java 2023年5月20日
    00
  • win10 64位 jdk1.8的方法教程详解

    Win10 64位 JDK1.8的安装方法教程详解 1. 下载JDK 首先,你需要在Oracle官网下载JDK1.8的安装包。你可以通过以下链接进入下载界面:Java SE Development Kit 8 Downloads。在下载页面中,你需要同意许可协议并选择适合你的操作系统的版本进行下载。 2. 安装JDK 安装JDK很简单。按照以下步骤操作即可:…

    Java 2023年5月30日
    00
  • 浅谈request.getinputstream只能读取一次的问题

    当使用request.getInputStream()方法获取请求数据流时,数据流只能被读取一次,如果多次读取,将无法获取数据。这是一个常见的问题,对于此问题的解决,我们可以使用如下两种方法: 方法一:使用Filter过滤器 通过过滤器来代替直接获取输入流,将获取到的输入流存放在自定义的HttpServletRequestWrapper中并使用缓存将数据流缓…

    Java 2023年6月15日
    00
合作推广
合作推广
分享本页
返回顶部