JS封装的三级联动菜单(使用时只需要一行js代码)

为了实现“JS封装的三级联动菜单”,我们需要使用以下技术:

  • HTML和CSS
  • JavaScript编程语言
  • Ajax技术

下面就介绍如何实现这个菜单:

1. 编写HTML和CSS

首先我们需编写一个select菜单,选择项分别是省份、城市、区域,菜单与菜单之间有“省份”、“城市”、“区域”的文字提示。

HTML代码如下:

<div class="address-select">
  <select id="province" name="province">
    <option value="">请选择省份</option>
  </select>
  <select id="city" name="city">
    <option value="">请选择城市</option>
  </select>
  <select id="area" name="area">
    <option value="">请选择区域</option>
  </select>
</div>

这里我们使用了一个div标签包裹了三个select标签,用class属性设置样式。

然后编写CSS代码:

.address-select select {
  width: 150px;
  height: 35px;
  margin-right: 10px;
  font-size: 14px;
  border-radius: 5px;
}

这里设置了select标签的样式,包括宽度、高度、字体大小和圆角半径等。

2. 获取数据

我们需要获取省市区数据来填充我们的菜单,这里我们使用Ajax技术来异步获取数据。

function getJson(url, callback) {
  var xhr = new XMLHttpRequest();
  xhr.open('GET', url, true);
  xhr.setRequestHeader('Content-type', 'application/json');
  xhr.onreadystatechange = function() {
    if (xhr.readyState == 4) {
      if (xhr.status == 200) {
        var data = JSON.parse(xhr.responseText);
        callback(data);
      } else {
        console.log('获取数据失败!');
      }
    }
  }
  xhr.send();
}

getJson('data.json', function(data) {
  console.log(data);
});

这里我们编写了一个getJson函数来获取JSON格式的数据,该函数接收两个参数:数据文件的URL和回调函数。回调函数用来处理我们异步获取到的数据。

在调用getJson函数时,我们传递的参数是data.json文件的URL和一个回调函数,以打印出获取的数据为例。

3. 封装三级联动菜单

根据上面的两步,我们就可以封装我们的三级联动菜单了。

function AddressSelector(element) {
  // 获取省市区数据
  function getJson(url, callback) {
    var xhr = new XMLHttpRequest();
    xhr.open('GET', url, true);
    xhr.setRequestHeader('Content-type', 'application/json');
    xhr.onreadystatechange = function() {
      if (xhr.readyState == 4) {
        if (xhr.status == 200) {
          var data = JSON.parse(xhr.responseText);
          callback(data);
        } else {
          console.log('获取数据失败!');
        }
      }
    }
    xhr.send();
  }

  // 创建select菜单
  function createSelect(data, parent, defaultOption) {
    var select = document.createElement('select');
    select.innerHTML = defaultOption;

    for (var i = 0, len = data.length; i < len; i++) {
      var option = document.createElement('option');
      option.value = data[i].value;
      option.innerText = data[i].text;
      select.appendChild(option);
    }

    parent.appendChild(select);
    return select;
  }

  // 级联菜单
  function cascadeSelect(parent, data, defaultOption) {
    parent.innerHTML = '';
    var select = createSelect(data, parent, defaultOption);

    select.onchange = function(e) {
      if (this.nextSibling) {
        cascadeSelect(this.nextSibling, data[this.selectedIndex - 1].children, defaultOption);
      }
    }
  }

  getJson('data.json', function(data) {
    cascadeSelect(element, data, '<option value="">请选择</option>');
  });
}

var addressSelector = document.querySelector('.address-select');
new AddressSelector(addressSelector);

上面的代码中,我们定义了一个AddressSelector的构造函数,该函数接收一个参数,即表示要以哪个元素为父元素来创建三级联动菜单。

  • 在构造函数内部,我们首先要获取省市区数据。
  • 然后创建select菜单,用来放置省、市、区的选项,这里我们使用了createSelect函数来创建菜单,并将其附加到指定的父元素上。
  • 最后,我们定义了cascadeSelect函数,用来处理级联关系,也就是当省份选项改变后,城市选项和区域选项要做出相应的改变。在cascadeSelect函数内部,我们清空父元素、创建一个新的select菜单、设置默认选项,并添加选项。当省份选项改变时,我们就创建新的子菜单。

最后,在构造函数的最后一行,我们调用了前面定义的AddressSelector构造函数,来创建一个三级联动菜单并附加到指定的父元素上。

示例说明

以使用jQuery框架实现三级联动菜单为例,代码如下:

$(function() {
  function initAddress() {
    $('#province').change(function() {
      var pid = $(this).val();
      if (pid) {
        $.getJSON('data.json', {pid: pid}, function(data) {
          var cityOptions = '<option value="">请选择城市</option>';
          var areaOptions = '<option value="">请选择区域</option>';

          $.each(data, function(index, item) {
            cityOptions += '<option value="' + item.value + '">' + item.text + '</option>';
          });

          $('#city').html(cityOptions);
          $('#area').html(areaOptions);
        });
      } else {
        $('#city').html('<option value="">请选择城市</option>');
        $('#area').html('<option value="">请选择区域</option>');
      }
    });

    $('#city').change(function() {
      var cid = $(this).val();
      if (cid) {
        $.getJSON('data.json', {cid: cid}, function(data) {
          var areaOptions = '<option value="">请选择区域</option>';

          $.each(data, function(index, item) {
            areaOptions += '<option value="' + item.value + '">' + item.text + '</option>';
          });

          $('#area').html(areaOptions);
        });
      } else {
        $('#area').html('<option value="">请选择区域</option>');
      }
    });
  }

  initAddress();
});

这里我们使用了jQuery框架,首先创建了一个initAddress函数,用来初始化省市区菜单。在该函数内部,我们首先监听省份选项的改变事件,当省份选项改变后,我们通过Ajax异步获取城市数据,并将城市选项添加到城市菜单中,同时清除区域选项。当城市选项改变后,我们同样根据城市的id异步获取区域数据,并将其添加到区域菜单中。

我们还可以使用Vue框架来实现三级联动菜单,代码如下:

<template>
  <div class="address-select">
    <select v-model="province" @change="updateCity">
      <option value="">请选择省份</option>
      <option v-for="(item, index) in provinces" :value="item.value">{{ item.text }}</option>
    </select>

    <select v-model="city" @change="updateArea" v-if="cities.length">
      <option value="">请选择城市</option>
      <option v-for="(item, index) in cities" :value="item.value">{{ item.text }}</option>
    </select>

    <select v-model="area" v-if="areas.length">
      <option value="">请选择区域</option>
      <option v-for="(item, index) in areas" :value="item.value">{{ item.text }}</option>
    </select>
  </div>
</template>

<script>
export default {
  data() {
    return {
      // 省份选项
      provinces: [],
      // 当前选中的省份
      province: '',
      // 城市选项
      cities: [],
      // 当前选中的城市
      city: '',
      // 区域选项
      areas: [],
      // 当前选中的区域
      area: '',
    };
  },

  created() {
    this.loadProvinces();
  },

  methods: {
    // 加载省份列表
    loadProvinces() {
      axios.get('data.json').then(response => {
        this.provinces = response.data;
      });
    },

    // 更新城市列表
    updateCity() {
      axios.get('data.json', { params: { pid: this.province } }).then(response => {
        this.cities = response.data;
        this.areas = [];
        this.city = '';
        this.area = '';
      });
    },

    // 更新区域列表
    updateArea() {
      axios.get('data.json', { params: { cid: this.city } }).then(response => {
        this.areas = response.data;
        this.area = '';
      });
    },
  },
};
</script>

在该示例中,我们使用了Vue框架,通过声明式渲染来创建三级联动菜单。在data方法中定义了四个变量:provinces,province,cities和areas,分别表示省份、当前选中的省份、城市和区域。在created方法中,我们调用了loadProvinces方法来获取省份数据。在loadProvinces方法中,我们使用axios库来发起异步请求,并将返回的数据赋值给provinces变量。在updateCity和updateArea方法中,我们更新城市和区域的选项,同样使用axios库来发起异步请求,并将返回的数据赋值给相应的变量。其中,updateCity方法用来更新城市选项,同时清空区域选项和当前选中的城市,而updateArea方法只需要更新区域选项即可。在template标签中,我们使用了v-model指令来绑定选项的值,以及v-for指令来循环渲染选项。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS封装的三级联动菜单(使用时只需要一行js代码) - Python技术站

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

相关文章

  • Bootstrap table右键功能实现方法

    Bootstrap table右键功能实现方法 在Bootstrap table中实现右键菜单功能,需要借助一些第三方工具。下面是详细的实现方法: (1)引入bootstrap-table-contextmenu插件。 <!– 引入bootstrap-table-contextmenu插件 –> <script src="pa…

    other 2023年6月27日
    00
  • 农业银行总是提示安装安全控件无法登陆的解决方法

    下面是针对“农业银行总是提示安装安全控件无法登陆”的解决方法的完整攻略: 问题背景 农业银行是中国大型国有银行之一,在进行网上银行操作时,多数用户会遇到要求安装安全控件的提示,如果安装不成功就无法正常登录进入网上银行。这一情况困扰着很多用户,以下是解决办法的详细说明。 解决方法 方法一:卸载原有的安全控件,重新安装新版控件 在计算机中打开控制面板,找到“已安…

    other 2023年6月27日
    00
  • Excel鲜为人知的二十五个技巧

    Excel鲜为人知的二十五个技巧攻略 Excel是一款功能强大的电子表格软件,但是其中有一些鲜为人知的技巧可以帮助用户更高效地使用它。本攻略将详细介绍Excel鲜为人知的二十五个技巧,并提供两个示例说明。 技巧一:使用快捷键 快捷键可以大大提高Excel的使用效率。以下是一些常用的快捷键: Ctrl + C:复制选定的单元格或区域。 Ctrl + V:粘贴复…

    other 2023年8月18日
    00
  • win10补丁KB4587587推送 win10预览版20236.1005更新内容汇总

    Win10补丁KB4587587推送及Win10预览版20236.1005更新内容汇总攻略 1. Win10补丁KB4587587推送 Win10补丁KB4587587是微软最新推送的补丁,以下是该补丁的详细说明: 补丁名称: KB4587587 发布日期: 2023年7月27日 适用系统: Windows 10 适用版本: 所有版本 更新类型: 安全性更新…

    other 2023年7月27日
    00
  • mac安装mysql数据库及配置环境变量的图文教程

    以下是“mac安装mysql数据库及配置环境变量的图文教程”的完整攻略: 准备工作 在安装mysql之前,需要先确认macOS系统已经安装了Homebrew包管理器。如果没有安装,可以通过终端执行以下命令进行安装: /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebr…

    other 2023年6月27日
    00
  • iOS12.3测试版新特性与升降级方法 iOS12.3 beta1更新内容

    iOS 12.3测试版新特性与升降级方法 iOS 12.3测试版是苹果公司发布的最新测试版本,其中包含了一些新的特性和改进。本攻略将详细介绍iOS 12.3测试版的新特性,并提供升级和降级的方法。 iOS 12.3测试版新特性 以下是iOS 12.3测试版的一些新特性和改进: Apple TV App 更新:iOS 12.3测试版引入了全新的Apple TV…

    other 2023年8月3日
    00
  • 重启路由器ip会变换怎么解决?

    针对“重启路由器IP会变换怎么解决?”这个问题,我们可以分为以下几个步骤来进行解决: 步骤一:设置静态IP地址 由于路由器在重启之后会重新分配IP地址,因此我们可以通过设置静态IP的方式来保证重启后IP地址不变。 在设置静态IP之前,我们需要先了解一下本地网络的IP地址段以及网关地址。通常情况下,本地网段的IP地址为192.168.0.0/16或者172.1…

    other 2023年6月27日
    00
  • FTP上传文件经常中断或超时的解决方案[完整篇]

    FTP上传文件经常中断或超时的解决方案 在进行FTP上传文件时,经常会出现中断或超时的情况,这可能是由于网络、服务器或客户端等多个方面因素引起的。本文将为您提供一些可能的解决方案。 方案一:调整FTP客户端参数 FTP客户端是进行FTP上传文件的工具,我们可以通过调整FTP客户端的参数来提高上传成功率。 增加FTP客户端上传缓冲区大小。 # 示例:FileZ…

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