首页
学习
活动
专区
圈层
工具
发布

js城市级联菜单通用

城市级联菜单是一种常见的前端交互组件,用于展示具有层级关系的数据,例如国家、省份、城市等。在JavaScript中实现城市级联菜单,通常涉及以下几个基础概念:

基础概念

  1. DOM操作:用于动态创建、修改和删除HTML元素。
  2. 事件监听:用于响应用户的交互行为,如点击事件。
  3. 异步请求:用于从服务器获取数据,常见的有XMLHttpRequestfetch API。
  4. JSON数据格式:轻量级的数据交换格式,易于人阅读和编写,也易于机器解析和生成。

优势

  • 用户体验:提供直观的选择方式,减少用户输入错误。
  • 数据维护:便于后台管理和更新层级数据。
  • 灵活性:可以根据需求自定义样式和交互逻辑。

类型

  • 静态级联菜单:数据直接写在前端代码中。
  • 动态级联菜单:数据通过异步请求从服务器获取。

应用场景

  • 注册页面:选择国家、省份、城市等信息。
  • 物流系统:选择配送地址。
  • 数据分析工具:按地理位置筛选数据。

实现示例

以下是一个简单的动态城市级联菜单的实现示例:

HTML结构

代码语言:txt
复制
<select id="country">
  <option value="">请选择国家</option>
</select>
<select id="province">
  <option value="">请选择省份</option>
</select>
<select id="city">
  <option value="">请选择城市</option>
</select>

JavaScript代码

代码语言:txt
复制
document.addEventListener('DOMContentLoaded', function() {
  const countrySelect = document.getElementById('country');
  const provinceSelect = document.getElementById('province');
  const citySelect = document.getElementById('city');

  // 模拟从服务器获取国家数据
  const countries = [
    { id: '1', name: '中国' },
    { id: '2', name: '美国' }
  ];

  // 填充国家选项
  countries.forEach(country => {
    const option = document.createElement('option');
    option.value = country.id;
    option.textContent = country.name;
    countrySelect.appendChild(option);
  });

  // 国家选择变化时加载省份数据
  countrySelect.addEventListener('change', function() {
    const countryId = this.value;
    provinceSelect.innerHTML = '<option value="">请选择省份</option>';
    citySelect.innerHTML = '<option value="">请选择城市</option>';

    if (countryId) {
      // 模拟从服务器获取省份数据
      const provinces = getProvincesByCountryId(countryId);
      provinces.forEach(province => {
        const option = document.createElement('option');
        option.value = province.id;
        option.textContent = province.name;
        provinceSelect.appendChild(option);
      });
    }
  });

  // 省份选择变化时加载城市数据
  provinceSelect.addEventListener('change', function() {
    const provinceId = this.value;
    citySelect.innerHTML = '<option value="">请选择城市</option>';

    if (provinceId) {
      // 模拟从服务器获取城市数据
      const cities = getCitiesByProvinceId(provinceId);
      cities.forEach(city => {
        const option = document.createElement('option');
        option.value = city.id;
        option.textContent = city.name;
        citySelect.appendChild(option);
      });
    }
  });

  // 模拟获取省份数据的函数
  function getProvincesByCountryId(countryId) {
    // 这里应该是异步请求,为了示例简单直接返回静态数据
    if (countryId === '1') {
      return [
        { id: '101', name: '广东省' },
        { id: '102', name: '湖南省' }
      ];
    }
    return [];
  }

  // 模拟获取城市数据的函数
  function getCitiesByProvinceId(provinceId) {
    // 这里应该是异步请求,为了示例简单直接返回静态数据
    if (provinceId === '101') {
      return [
        { id: '1001', name: '广州市' },
        { id: '1002', name: '深圳市' }
      ];
    }
    return [];
  }
});

常见问题及解决方法

  1. 数据加载延迟:使用异步请求时,可能会出现数据还未加载完成就进行操作的情况。可以通过设置加载状态或使用Promise来解决。
  2. 数据格式不一致:确保前后端数据格式一致,通常使用JSON格式,并进行必要的验证和转换。
  3. 性能问题:对于大数据量的级联菜单,可以考虑使用虚拟滚动技术或分页加载来优化性能。

通过上述方法,可以实现一个功能完善且用户体验良好的城市级联菜单。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

js多级联动示例(省份和城市二级联动)

本文描述的省份和城市二级联动下拉菜单,在js部分设置省份和城市信息,当然也可以将数据保存在数据库中,当需要使用的时候在读取。...这里用的是js原生代码 在html文件中设置省份、城市下拉列表如下: 菜单(省份)时,二级菜单(城市)显示对应城市列表信息: //获取点击的省份的下标 function getIndex(){   for(var i=0;i<province.length...;i++)     if(province[i]==pro.value)       return i; } //根据获取的省份下标,更改二级列表为对应下标的城市列表,此即二级联动 function ...var i = 0; i < city[index].length; i++)         e.add(new Option(city[index][i])); } 二级联动的应用在日常

11.9K50
  • 【学生管理系统】element ui级联菜单bug

    级联后端 通过父id来进行查询 @GetMapping("/{parentId}") public BaseResult findAllByParentId(@PathVariable(..."parentId") String parentId){ //1 根据父id查询所有城市 QueryWrapper queryWrapper = new...tbCityService.list(queryWrapper); //2 返回结果 return BaseResult.ok("查询成功", list); } bug element ui级联在渲染的时候才触发...ajax 后面再将数据给它的时候 它没有触发ajax进行查询 原因: 只有渲染的时候才触发ajax查询  解决方案 定义变量 隐藏级联 点编辑的时候 查询到学生的信息 再把变量为true 这样就可以重新渲染...加载上 如果现在直接取消showCityCascader还是true 后面再点编辑级联ajax就触发不了  定义一个方法 取消的时候把隐藏级联的控制变量为false 顺便关联弹框

    82210

    城市三级联动功能实现

    blog.csdn.net/u011415782/article/details/74586762 背景: 最近在进行商品购买流程的开发,需要用户填写自己的收货地址,为了保证地址的准确性,需要使用到全国城市的三级联动功能...其中可以有三个思路: 1.使用 js 直接加载城市信息; 2.自己建立数据库,然后使用 ajax 异步加载城市数据; 3.借用第三方城市接口,例如阿里接口,获取数据。...一.html 触发点击事件,直接获取js中的城市数据 首先,这个功能在实现上最简单,本人参考了度娘搜索的纯 js 实现网页,需要提醒的源代码适用的 jQuery 版本已经过低,建议可参考其网页下面的网友回复...我将代码做了处理整合到 ThinkPHP 框架中,下面介绍一下实现效果: 1.正确引用 area.js 文件 ?...,此处提供之前所写的类似功能数据库三级分类,敬请指摘 三.第三方城市接口 网上看到一篇文章—中国城市三级联动数据获取方法现,值得推荐…

    6.1K30

    excel中实现二级联动菜单

    在Excel中,我们经常会有类似下面这样的二级联动的需求。比如说:选择某个省份了以后,“城市”所对应的列表根据所选城市而变化。...OFFSET($N$2,1,(1),(2)):返回所选省份下的所有城市。如果C2选择的是山西省,则返回O3到O6的城市的范围。 各个参数的意义如下: N2:数据区域的原点。...该值为所选省份下城市的个数。再看(1) 和(2)(1):MATCH($C$2,$N$2:$P$2,)-1 在N2到P2的范围内,匹配到C2的值的列数。...如果一个省超过10个城市的话,10个以后的城市将取不到了。这个值可以取大一些。这个不完美的地方,另文再议。 (2)的整个公式的意思是省份的列中,从第一个城市往下取10个单元格中,不为空的个数。...比如O列的山西省下,不为空的城市个数为4。这样就可以实现了。但是1)由上面(2)的不完美的地方。2)另外有个方法,另文再叙。

    3K30

    Fabric.js 右键菜单

    ---- PK创意闹新春,我正在参加「春节创意投稿大赛」,详情请看:春节创意投稿大赛 本文简介 Fabric.js 默认**没提供 鼠标右键事件**,只有 鼠标按键点击 、鼠标按键抬起 、鼠标移动 等事件...本文主要关注 Fabric.js 的主要 api 有: fireRightClick:允许右键点击 stopContextMenu:禁用默认右键菜单 mouse:down:鼠标点击事件 如果不知道 Fabric.js...的同学,可以看 《Fabric.js 从入门到___》 本案例是使用原生方式开发,不基于 Vue 、React 等框架,所以不用太担心运行环境等问题。...案例代码放了在文末~ 环境和版本 Chrome浏览器版本:96.0.4664.45 Fabric.js版本:4.6.0 思路 先说说需求: 右键单击元素,弹出菜单; 弹出菜单分4种情况(菜单在鼠标右侧...初始化画布,并生成图形 // 文档加载后执行 window.onload = function() { // 输出当前 fabric 版本 console.log(`Facrib.js

    9.9K10
    领券