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日

相关文章

  • 安卓/iPhone手机qq5.0内测申请地址 安卓/iPhoneQQ5.0体验版申请下载地址

    安卓/iPhone手机QQ5.0内测申请地址攻略 1. 了解内测申请地址 在申请安卓/iPhone手机QQ5.0内测之前,我们需要了解内测申请地址。内测申请地址是指我们可以提交申请以获取内测版本的QQ5.0的网址或应用商店链接。 2. 寻找内测申请地址 2.1 安卓手机QQ5.0内测申请地址 对于安卓手机用户,我们可以通过以下步骤找到安卓手机QQ5.0内测申…

    other 2023年8月4日
    00
  • 开机还原软件哪个比较好用?几款免费好用的开机还原软件下载推荐

    开机还原软件是一种非常实用的工具,可以帮助用户轻松地还原系统到初始状态。本文将详细讲解如何选择一款好用的开机还原软件,并推荐几款免费好用的开机还原软件供读者参考。 如何选择一款好用的开机还原软件 稳定性和兼容性:选择一款开机还原软件时,首先要考虑其稳定性和兼容性。软件要能够兼容用户的操作系统,而且不能因为软件本身的问题导致系统崩溃,否则会造成严重后果。 功能…

    other 2023年6月27日
    00
  • C++中 ‘=default ’及‘ =delete ’的使用

    C++中 “=default” 及 “=delete” 的使用 在 C++11 中,我们可以使用 “=default” 和 “=delete” 来精确地控制类的默认函数成员的生成情况,从而提高代码性能和可读性。下面将对 “=default” 和 “=delete” 的使用进行详细讲解。 “=default” 在 C++11 中,对于类的默认函数成员,可以使用…

    other 2023年6月26日
    00
  • 移动WEB像素相关知识

    移动WEB像素相关知识 前言 在设计和开发移动WEB页面时,我们经常会遇到一个问题,那就是像素的概念。像素是一个非常基础的概念,但它对于移动WEB的开发者来说却非常重要。在本文中,我们将介绍关于移动WEB像素的相关知识,帮助读者更好地理解移动WEB的开发。 为什么需要了解像素 首先,我们需要了解的是,像素是测量屏幕上空间大小的基本单位,屏幕上的所有内容都是由…

    其他 2023年3月28日
    00
  • beyondcompare4密钥

    beyondcompare4密钥 什么是Beyond Compare 4? Beyond Compare 4是一款非常好用的文件和文件夹对比工具软件,可以帮助我们比较和合并文件和文件夹,以及查找和删除重复的文件等等。它支持FTP、SFTP和WebDAV等文件传输协议,可以快速地比较两个文件夹之间的差异,是一款非常实用的跨平台对比工具。 Beyond Comp…

    其他 2023年3月28日
    00
  • sqlserver判断null和空值

    当然,我很乐意为您提供有关“SQL Server判断NULL和空值”的完整攻略。以下是详细的步骤和两个示例: 1 判断NULL和空值 在SQL Server中,可以使用IS NULL和IS NOT NULL运算符来判断NULL值。而对于空值,可以使用空字符串”或者使用LEN函数来判断。 2 示例 以下是两个判断NULL和空值的示例: 2.1 判断NULL值…

    other 2023年5月6日
    00
  • 如何得到数据库中所有表名 表字段及字段中文描述

    获取数据库中所有表名、表字段及字段中文描述的攻略可以分为以下几步: 1. 连接数据库 首先,需要使用Python中的数据库连接工具连接到数据库。最常用的数据库连接工具是pymysql,可以使用pip进行安装。具体的连接方式如下: import pymysql # 填写数据库连接信息 host = ‘localhost’ port = 3306 usernam…

    other 2023年6月25日
    00
  • mssql 30万条数据 搜索文本字段的各种方式对比

    针对“mssql 30万条数据 搜索文本字段的各种方式对比”的攻略,可以从以下几个方面进行讲解: 1. 文本搜索的基本概念 在进行文本搜索之前,需要了解一些基本概念。在MSSQL中,文本字段可以使用VARCHAR()、NVARCHAR()、TEXT、NTEXT等数据类型定义,这些类型之间的差异在存储内容的长度上有所区别。在查询中,我们通常会使用LIKE、CO…

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