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日

相关文章

  • 腾讯手游助手一直在加载中怎么办?腾讯手游助手无法加载解决方法

    下面是腾讯手游助手一直在加载中的解决方法。 问题描述 有时候我们在使用腾讯手游助手下载游戏时会出现加载中的情况,但始终无法加载完成,无法正常使用。这个问题可能是由于网络问题、软件版本过低或者其他原因引起的。 解决方法 方法一:检查网络连接状态 首先检查一下您的网络连接是否正常,确保您的电脑或者移动设备以及腾讯手游助手能够正常访问互联网。如果您的网络连接不稳定…

    other 2023年6月25日
    00
  • sqlvarchar转化为int

    当然,我很乐意为您提供有关“将SQL varchar转换为int”的完整攻略。以下是详细的步骤和两个示例: 1 SQL varchar转换为int 在SQL中,可以使用CAST或CONVERT函数将varchar类型的数据转换为int类型的数据。这在需要将字符串类型的数据转换为数字类型的数据时非常有用。 2 使用CAST函数将varchar转换为int 以下…

    other 2023年5月6日
    00
  • sql中identity是什么意思

    当然,我很乐意为您提供有关“SQL中IDENTITY是什么意思”的完整攻略。以下是详细的步骤和两个示例: 1 SQL中IDENTITY是什么意思 IDENTITY是SQL Server中的一个关键字,它用于定义自增长列。当您在表中定义一个IDENTITY列时,SQL Server会自动为该列生成唯一的值。以下是使用IDENTITY的详细步骤: 1.1 定义I…

    other 2023年5月6日
    00
  • springboot多模块中的共用配置文件详解

    “SpringBoot多模块中的共用配置文件详解”是指在SpringBoot多模块项目中,如何将配置文件进行拆分,使不同模块可以共用同一份配置文件。这样可以避免配置文件的重复,提高代码的复用性和可维护性。 本攻略将分为以下几个部分: 1.在多模块项目中配置共用的配置文件 2.解决相对路径问题 3.示例说明 1.在多模块项目中配置共用的配置文件 首先,我们需要…

    other 2023年6月25日
    00
  • 手把手教你labview串口仪器控制——visa驱动下载安装篇

    手把手教你LabVIEW串口仪器控制——VISA驱动下载安装篇 在LabVIEW中,使用串口控制仪器是非常常见的操作。为了实现串口控制,需要安装VISA驱动程序。本文将提供VISA驱动下载安装的完整攻略,包括以下步骤: 下载VISA驱动程序 安装VISA驱动程序 配置VISA驱动程序 同时,本文将提供两个示例说明,以帮助用户更好地理解VISA驱动下载安装的方…

    other 2023年5月9日
    00
  • angular项目中使用antd日历组件

    以下是关于“Angular项目中使用Antd日历组件”的完整攻略,过程中包含两个示例。 背景 Antd是一个基于React的UI组件库但是它也提供了一些Angular组件。其中,Antd的日历组件非常实用,可以帮助我们快速构建日历。本攻略将介绍如何在Angular项目中使用Antd日历组件。 基本原理 在Angular项目中使用Antd日历组,我们需要先安装…

    other 2023年5月9日
    00
  • iOS实现动态的开屏广告示例代码

    实现iOS动态开屏广告需要完成以下步骤: 1. 准备开屏广告图片 首先,需要准备好开屏广告图片,建议图片大小为屏幕大小。因为广告页面需要自动适应不同尺寸的屏幕。 2. 实现广告页面 接着,需要新建一个 UIViewController,作为广告页面。在该 ViewController 中添加广告图片视图,并添加关闭广告的按钮。 示例代码如下: class A…

    other 2023年6月26日
    00
  • Spring Bean生命周期之Bean元信息的配置与解析阶段详解

    接下来我将详细讲解“Spring Bean生命周期之Bean元信息的配置与解析阶段详解”的完整攻略。 Spring Bean的元信息 在Spring中,Bean的元信息是Spring容器在启动时读取配置文件或注解生成的BeanDefinition,它主要包含Bean的定义、Bean的依赖、Bean的作用域、延迟加载等一系列的Bean属性配置。通常情况下,我们…

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