下拉选择框 多级联动 动态显示

JavaScript解析Json实现动态修改多级下拉选择列表控件Select 最终效果: 根据上级菜单所选,决定下级菜单的列表项内容 数据源 首先读取数据库中的数据得到数据,由于数据库中的数据是分散的几个二维表格,查询出来的数据是Map键值对的List集合,不能直接拿来用,需要先进行处理:一级菜单封装为String类型菜单项的List集合,二级菜单封装为键名为一级分类项名称,键值为对应二级分类项的List集合的Map。三级菜单是同二级菜单类似的Map。 阅读详情

1、涉及知识内容

1、js

2、jquery

3、js

4、bootstrap样式

2、效果图

3、数据库

CREATE TABLE `area` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `parent_id` int(11) NOT NULL DEFAULT '0',
  `area_level` int(11) NOT NULL,
  `area_name` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of area
-- ----------------------------
INSERT INTO `area` VALUES ('1', '0', '1', '安徽省');
INSERT INTO `area` VALUES ('2', '0', '1', '北京市');
INSERT INTO `area` VALUES ('3', '0', '1', '上海市');
INSERT INTO `area` VALUES ('4', '1', '2', '合肥市');
INSERT INTO `area` VALUES ('5', '1', '2', '宿州市');
INSERT INTO `area` VALUES ('6', '4', '3', '瑶海区');
INSERT INTO `area` VALUES ('7', '4', '3', '包山区');
INSERT INTO `area` VALUES ('8', '3', '2', '浦东新区');
INSERT INTO `area` VALUES ('9', '3', '2', '徐汇区');
INSERT INTO `area` VALUES ('10', '3', '2', '杨浦区');
INSERT INTO `area` VALUES ('11', '3', '2', '松江区');
INSERT INTO `area` VALUES ('12', '3', '2', '宝山区');

4、Result.java

结果封装类

package com.lemon.pojo;/**
 * @Author lemon
 * @Date 2019/11/13 0013
 */

import java.util.List;

/**
 * 结果封装类
 * @Author lemon
 * @Date 2019/11/13 0013
 */
public class Result {

    //状态值
    private Integer code;
    //错误信息
    private String err;
    //结果
    private List<Area> dataList;


    //构造函数
    public Result(Integer code, String err, List<Area> dataList) {
        this.code = code;
        this.err = err;
        this.dataList = dataList;
    }


    //成功时的构造函数
    public Result(Integer code, List<Area> dataList) {
        this.code = code;
        this.dataList = dataList;
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getErr() {
        return err;
    }

    public void setErr(String err) {
        this.err = err;
    }

    public List<Area> getDataList() {
        return dataList;
    }

    public void setDataList(List<Area> dataList) {
        this.dataList = dataList;
    }
}

5、SelectController.java

package com.lemon.controller;/**
 * @Author lemon
 * @Date 2019/11/12 0012
 */

import com.lemon.pojo.Area;
import com.lemon.pojo.Result;
import com.lemon.service.SelectService;
import org.apache.commons.collections.map.HashedMap;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;


import java.util.HashMap;
import java.util.List;
import java.util.Map;


/**
 * 多级联动
 * @Author lemon
 * @Date 2019/11/12 0012
 */
@Controller
@RequestMapping("/select")
public class SelectController {

    @Autowired
    SelectService selectService = new SelectService();

    //查询区域信息
    @RequestMapping("/findarea")
    @ResponseBody
    public Result findArea(Integer level_id, Integer parent_id){

        //查找区域列表
        List<Area> areaList = null;

        areaList = selectService.findAreaByLevelOrParentId(level_id, parent_id);
        return new Result(100,areaList);
    }


    //保存区域信息
    @ResponseBody
    @RequestMapping("/saveArea")
    public Object saveProSub() {

        Map<String,Integer> map = new HashMap<>();

        //这里假设保存成功 返回100
        map.put("code",100);
        return map;
    }
}

5、select.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>多级联动</title>
    <link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/css/bootstrap.min.css">
    <script src="https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script>
    <script src="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script></head>
</head>
<body>
<div class="col-md-2">
    <select class="form-control" name="sheng" id="sheng">
        <option value="-1">请选择省</option>
    </select>

    <select class="form-control" name="shi" id="shi">
        <option value="-1">请选择市</option>
    </select>

    <select class="form-control" name="qu" id="qu">
        <option value="-1">请选择区</option>
    </select>
    <button class="btn btn-primary" id="saveArea">提交</button>
</div>


<!-- Modal -->
<div class="modal fade" id="errorModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
    <div class="modal-dialog" role="document">
        <div class="modal-content">
            <div class="modal-header">
                <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
                <h4 class="modal-title">区域选择</h4>
            </div>
            <div class="modal-body">
                <div class="status-inline">
                    <i class="iconfont icon-error" id="i_icon"></i>
                    <span class="title" id="span_error">

                        </span>
                </div>
            </div>
            <div class="modal-footer">
                <button type="button" class="btn btn-secondary" data-dismiss="modal">关闭</button>
            </div>
        </div>
    </div>
</div>


</body>

<script>
    $(document).ready(function (){

        // //清空省市区下拉框内容
        // $("#sheng").text("");
        // $("#shi").text("");
        // $("#qu").text("");

        //自动加载所有一级省下拉框内容
        $.ajax({

            url: "/select/findarea",
            type: "POST",
            data:{
                level_id: 1
            },
            dataType: 'json',
            success: function (data) {

                // console.log(data.dataList);

                var html = "";
                var len = data.dataList.length;
                for(var i = 0; i < len; i++){
                    html = '<option value=' + data.dataList[i].id + '>' + data.dataList[i].area_name + '</option>';
                    //将内容追加到省级下拉框里
                    $("#sheng").append(html);
                }
            }
        });

        //市级下拉框内容
        //改变省 下拉框内容时 执行
        $("#sheng").change(function () {
            // alert($(this).val());

            //清空市区下拉框内容
            $("#shi").text("");
            $("#qu").text("");
            //追加 第一个提示框
            $("#shi").append('<option value="-1">请选择市</option>');
            $("#qu").append('<option value="-1">请选择区</option>');
            //一级下拉框选择的内容
            var parent_id = $(this).val();
            //加载二级市
            $.ajax({

                url: "/select/findarea",
                type: "POST",
                data:{
                    level_id: 2,
                    parent_id: parent_id
                },
                dataType: 'json',
                success: function (data) {
                    // console.log(data.dataList);

                    var html = "";
                    var len = data.dataList.length;
                    for(var i = 0; i < len; i++){
                        html = '<option value=' + data.dataList[i].id + '>' + data.dataList[i].area_name + '</option>';
                        //将内容追加到市级下拉框里
                        $("#shi").append(html);
                    }
                }
            });

        });


        //区级下拉框内容
        //改变市 下拉框内容时 执行
        $("#shi").change(function () {
            // alert($(this).val());

            //清空区级下拉框内容
            $("#qu").text("");
            //追加 第一个提示框
            $("#qu").append('<option value="-1">请选择区</option>');

            //一级下拉框选择的内容
            var parent_id = $(this).val();
            //加载二级市
            $.ajax({

                url: "/select/findarea",
                type: "POST",
                data:{
                    level_id: 3,
                    parent_id: parent_id
                },
                dataType: 'json',
                success: function (data) {
                    // console.log(data.dataList);

                    var html = "";
                    var len = data.dataList.length;
                    for(var i = 0; i < len; i++){
                        html = '<option value=' + data.dataList[i].id + '>' + data.dataList[i].area_name + '</option>';
                        //将内容追加到区级下拉框里
                        $("#qu").append(html);
                    }
                }
            });

        });


        //报警提示弹出的提示
        function errorModal(tipText){
            $('#i_icon').removeClass('icon-error');
            $('#i_icon').removeClass('icon-success');
            $('#i_icon').addClass('icon-error');
            $('#span_error').text(tipText);
            $('#errorModal').modal('show');
        }


        //点击提交 保存区域信息
        $("#saveArea").click(function () {
            // alert($("#sheng").val() == -1)

            var sheng = $("#sheng").val();
            var shi = $("#shi").val();
            var qu = $("#qu").val();

            //是否选择省
            if(sheng == -1){
                errorModal("请选择省");
                return;
            }

            //是否选择市
            if(shi == -1){
                errorModal("请选择市");
                return;
            }

            //是否选择区
            if(qu == -1){
                errorModal("请选择区");
                return;
            }

            //保存区域信息
            $.ajax({
                url: "/select/saveArea",
                type: "POST",
                data:{
                    sheng: sheng,
                    shi: shi,
                    qu: qu
                },
                dataType: 'json',
                success: function (data) {

                    if(data.code == 100){
                        errorModal("保存区域成功!");
                    }else{
                        errorModal("保存失败!");

                    }
                }
            });

        });



    });
</script>
</html>

6、总结:

掌握了js、jquery、bootstrp基本用法。

js真的太重要了!!!

js真的太重要了!!!

js真的太重要了!!!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

实现Web页面中级联菜单的设计/实现动态加载列表框/实现自动刷新页面/实现Web页面的局部动态更新/实现自动完成功能 在Web页面中经常需要实现如图5-2所示的级联菜单的效果。即根据用户的选择,动态展开并显示出对应选项子菜单中的内容。本例中是根据用户所选择的商品类别信息,在子菜单中显示对应的商品名称。图5-2  级联菜单的效果在传统的Web实现方式中,一般是在页面初始化时动态获取到服务器端数据库中对应所有子菜单中的信息,放置页面中对应的位置,然后在结合CSS层叠样式表动态控制对应子菜单的显示或者隐藏。 阅读详情

相关推荐

Bootstrap实现下拉菜单多级联动

主要为大家详细介绍了Bootstrap实现下拉菜单多级联动,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

bootstrap3学习笔记

1.工具bootstrap 可视化编辑器 bootstrap v3中文网 下载bootstrap 3.3.0

Jsonkim的博客 1253

Python实战:3分钟搞定A股K线数据抓取(附东方财富/腾讯API完整代码)

本文为量化交易初学者提供了一份快速获取A股K线数据的实战指南。通过对比东方财富与腾讯财经两大免费API的优劣,并附上可直接运行的完整Python代码,帮助读者在3分钟内搭建起自己的数据抓取管道,为构建量化交易系统奠定坚实的数据基础。

weixin_29062255的博客 2913

动态级联下拉框构件

3 3动态级联下拉框构件 3.1 设计背景 动态下拉列表框指的是在页面输入或选中某一个条件后,页面通过局部刷新机制向后台请求符合条件的数据,使用返回的数据来填充另一个空白下拉框。产生这个需求的背景有两点: 1. 是增加可用性,可以动态改变一个下拉框中的数据,而不是静态的使用几个下拉框来表示一些互斥的数据,使页面臃肿并且难于操作。 2. 是减少页面的数据量,提高性能,由于电信业务的特点,经...

iteye_15466的博客 198

ElementUI中的el-table解决宽度问题 - 根据内容自动撑开

在使用element-ui中,会发现表格组件el-table在未指定宽度情况下,会自动计算并给表格宽度赋值。但实际开发中,有时需要根据内容实际长度自动撑开显示,由内容的多少而决定表格的宽度,而不是默认宽度为100%。在默认情况下表格宽度为100%显示,并且列项未指定宽度情况下,剩余部分会平均分配宽度,本案例实际需求是由内容自动撑开显示。componentUpdated

觉醒法师的专栏 1万+

从.har文件到Postman集合:一键转换的完整教程(附避坑指南)

本文详细介绍了如何将.har文件高效转换为Postman集合的完整教程,涵盖基础操作到高级技巧,包括认证信息处理、环境变量提取等痛点问题的解决方案。通过抓包工具记录的.har文件,开发者可以快速生成Postman集合,提升API调试与测试效率,特别适合前后端分离开发模式下的团队协作。

weixin_26795617的博客 384

下拉列表多级联动前端实现

一 获取一级分类 1 组件数据定义 添加在Info.vue的data中 subjectList: [], // 一级分类 subjectLevelTwoList: [] // 二级分类 2 组件脚本 表单初始化时获取一级分类嵌套列表,引入subject api import subjectApi from '@/api/subject' 定义方法 // 获取课程分类列表 initSubjectList() { subjectApi.g

实践求真知 2284

3个国产AI大模型实战:如何用DeepSeek+豆包+千问批量生成高质量测试用例(附完整代码)

本文详细介绍了如何利用DeepSeek、豆包和千问三大国产AI大模型批量生成高质量测试用例的实战方法。通过Python环境配置、多模型SDK安装和统一接口封装,实现高效测试用例生成,并结合结构化提示词设计和多模型结果对比分析,显著提升测试效率和覆盖率。

weixin_29197699的博客 710

下拉选择框 多级联动动态显示实例 Ajax+redis+mysql+java后台

下拉选择框 多级联动动态显示实例 Ajax+redis+mysql+java后台 我的实现思路是:前台在选择一级下拉框就发一次Ajax请求到后台,后台把查询结果放到一个map容器里面返回,并存到缓存中。 前台在请求成功后回填下拉框,选择二级或其他下级不用再发请求,直接再前端全局变量容器里面去获取就行了,拿到数据直接进行onchang里面的回填方法。 HTML 代码部分: <div class="clearfix" style="margin-bottom: 10px;"> <l

qq_43024430的博客 573

从零开始:手把手教你检查并更新英伟达GPU驱动和CUDA版本(Windows/Linux双平台)

本文详细指导如何在Windows和Linux系统上检查并更新英伟达GPU驱动和CUDA版本,解决版本不匹配导致的常见问题。涵盖驱动更新、CUDA Toolkit安装、版本冲突排解及性能优化技巧,帮助开发者高效管理GPU计算环境。

weixin_29237635的博客 701

C#图像处理:OpenCVSharp实现简单人脸识别

人脸识别是计算机视觉领域中的一个重要研究方向,它可以通过分析和比对人脸图像,实现识别和验证的功能。希望通过这篇文章的学习,你对OpenCVSharp和人脸识别有了初步的了解,并能够运用这些知识进行自己的项目开发。当我们运行程序时,它会加载人脸识别模型并读取待识别的图像,然后进行人脸检测并在图像上标记出检测到的人脸位置。当然,这只是一个入门级的示例,实际的人脸识别系统还需要更加复杂的算法和大量的训练数据来提高准确性和鲁棒性。最后,我们遍历检测到的人脸,并在原始图像上绘制矩形框,标记出检测到的人脸位置。

WELL_CODER的博客 1129

163----三级联动---实际开发中if嵌套过多,很少使用

$(document).ready(function(){ $("#select1").change( function() { var id = $("#select1").val(); if(id == 1){ $.get('index.php', null, function(data){ $("#two").empty(); $("#two").appen

一份耕耘 一份收货 664

【AI面试】 Python 的装饰器

Python装饰器是一种高阶函数,用于在不修改原函数代码的情况下增强其功能。它通过@语法糖接收目标函数作为参数,并返回一个包含额外逻辑(如日志、缓存、权限验证等)的新函数。装饰器的核心价值在于代码复用和解耦,符合开闭原则,典型应用包括性能分析、权限控制等场景。例如,@timer_decorator可自动为函数添加耗时统计功能。本质上,@decorator等价于func = decorator(func),实际调用的是装饰器返回的包装函数。进阶技巧包括使用@functools.wraps保留原函数元信息。装饰

钱多多先森 184

JQ中多级联动下拉选择框

html代码不多说,贴图出来! 效果如下: 下拉效果如下: 重点来了,js代码是重重之重: $(function () { $(&quot;.formOption&quot;).click(function () { //点击外层,下拉出现 $(this).siblings('.formList').show(); }) $(&quot;.form...

豆豆熊博客 3664

Spring AI Alibaba实战训练营-28 手把手教你用SAA+ Nacos 构建分布式 MCP 应用

本文介绍如何使用Spring AI Alibaba和Nacos构建分布式MCP应用,实现AI模型与工具服务的动态发现和调用。主要内容包括:1) 项目架构设计,包含MCP Server、Nacos注册中心和MCP Client三个核心组件;2) 环境准备要求,如Java 17+、Maven 3.6+、Nacos 3.1.0+等;3) 详细实施步骤:启动Nacos服务、注册MCP服务端、配置MCP网关聚合服务、设置MCP客户端发现机制。通过这种架构,开发者可以轻松扩展新工具服务,无需修改客户端代码,实现服务动态

program哲学 311

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

两种方法实现下拉框及级联效果

第一种:普通方法 比如说var message为后台传递到前端的一个数组(一般来说,后台传递到前端的是JSON类型的数据,此数据包含很多其他的成分,我们可以通过console.log()方法打印出该数据包含的具体成分,在从中拿到自己需要的数据) //首先,我们需要遍历该数组(message为该数组,) $.each(message,function(index.item){ //获取到了数...

qq_736986237的博客 8910

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Vue2级联选择(Cascader)

Vue2以 VueAmazingSelect 选择框为基础封装的级联选择框组件。

Vue Amazing UI(Vue3 + TypeScript + Vite)组件库唯一开发维护者 9545

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

使用ivx实现多级下拉菜单联动效果的经验总结

在实际案例中经常会有这样的场景,我们需要对一些信息进行选择,同时这些数据之间还有明确的层级关系,比如选择省市区或者组织部门,当前一个下拉菜单选项固定后下一层级的下拉菜单选项是要随之改变的。今天就说一说如何实现这种多级下拉菜单联动的效果。 1.下拉菜单 下拉菜单是拓展组件的一种,选中下拉菜单再点击拓展组件可以添加下拉菜单选项和下拉菜单选择组两种子组件,下拉菜单选择组内也可以添加下拉菜单选项,它主要...

VXLab的博客 1266

【vue组件】使用element-ui 实现三级联动下拉选择

实现的思路是第一个下拉选择在选择了选项后将该选项的信息传递到接口请求下一个选项的内容,依次类推。然后在清除了上一级选择的选项后要将其次级和子孙级的选项都清除(包括选择里的列表内容)

loyd3的博客 4508

Vue中如何进行表单联动与级联选择?

在Vue.js中实现表单联动和级联选择,可以使用计算属性、watcher和自定义指令等技术。表单联动可以使用计算属性和watcher来实现,计算属性适用于简单的场景,而watcher适用于复杂的场景。级联选择可以使用watcher和计算属性来实现,watcher适用于少量级联选择,而计算属性适用于多级级联选择。在实际应用中,我们需要根据具体的场景和需求来选择合适的实现方式。同时,我们还需要注意代码的可维护性和可读性,避免出现冗长和复杂的代码。

徐师兄的博客 3557

多级联动下拉列表

第一次写博客,记录自己学习~ 在项目中用到多级联动功能,为了相对灵活运用在网上也找了很多了例子,下面就是一个相当好用的多联动分级 //HTML部分 选择类型 //第一个下拉框根据后台循环出来 (document).ready(function(){&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;...

F1418251998的博客 1069

JSP动态网页技术

一 、实验内容 创建JSP动态网页以及页面请求的处理 二、 实验目的 1、掌握JSP页面的基本结构和创建方法  2、 理解JSP页面运行机制  3、熟练掌握JSP中变量和方法的声明,脚本元素用法  4、理解JSP指令、动作和自定义标记的基本要点 三、 实验过程 1、使用 Eclipse 新建web工程,首先创建三个页面:登录页面(login.jsp)、登录成功页面(success.jsp)、登录登陆失败页(failure.jsp),再创建处理页面请求服务端程序(process.jsp)。

H-rosy的博客 602

form表单实现下拉框联动

想实现在选择系统名称的时候,上面的系统编号随着发生变化,但是不允许编辑。

段王爷的博客 494

bootstrap-select动态加载数据和多级联动

最近使用bootstrap-select在做了一个地址的联动,效果图如下 环境相关 bootstrap 3.3.7 jquery 3.3.1 bootstrap-select 1.13.9 1、数据表结构如下 -- 地址配置表(address_config) create table address_config ( option_value varchar(20) not null comm...

q283614346的博客 1万+

前端js递归

此文来自转载 假设后端数据: treeData:[ {id:001,name:'一级菜单',parentId:'0'}, {id:002,name:'二级菜单',parentId:'1'}, {id:003,name:'三级菜单',parentId:'2'}, {id:004,name:'二级菜单',parentId:'1'}, {id:005,name:'二级菜单',parentId:'1'}, {id:006,name:'一级菜单',parentId:'0'}, ]

weixin_459417989的博客 768
上一篇: springboot实现在浏览器上点击打印,自动读取数据库数据生成Excel文件
下一篇: IDEA 创建springboot+maven+mybatis
LemonSnm
博客等级 码龄8年 66粉丝 168原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值