[Ajax] 案例 -- 三级联动

案例 – 三级联动

什么是三级联动呢?

三个级别,联动代表这三个级别相互依赖与嵌套,唯有这样才能实现三级联动.

三级联动简单理解可以理解为两个二级联动,

  • 只有点击才能出现下一级的

在这里插入图片描述

  • 只有点击才能出现下一级的

在这里插入图片描述
 
 

在正式写之前,要先了解一下json,可以观看原来的内容

首先要创建三级联动(或者二级联动),那必不可少的就是数据库了,写的比较随意,主要测试效果

[
  {
    "province": "吉林省",
    "cities": [
      {
        "city": "长春市",
        "counties": ["朝阳区", "经济开发区", "高新区"]
      },
      {
        "city": "吉林市",
        "counties": ["东城区", "经济开发区", "老城区"]
      },

      {
        "city": "白山市",
        "counties": ["二道区", "河东区", "高新区"]
      }
    ]
  },
  {
    "province": "辽宁省",
    "cities": [
      {
        "city": "沈阳市",
        "counties": ["朝阳区", "经济开发区", "高新区"]
      },
      {
        "city": "大连市",
        "counties": ["东城区", "经济开发区", "老城区"]
      },
      {
        "city": "铁岭市",
        "counties": ["二道区", "河东区", "高新区"]
      }
    ]
  },
  {
    "province": "山东省",
    "cities": [
      {
        "city": "青岛市",
        "counties": ["朝阳区", "经济开发区", "高新区"]
      },
      {
        "city": "济南市",
        "counties": ["东城区", "经济开发区", "老城区"]
      },
      {
        "city": "威海市",
        "counties": ["二道区", "河东区", "高新区"]
      }
    ]
  }
]

 
 

三级联动,肯定要有三个选择列表,所以,先创建三个<select>,为之后的能够点击省市区县的选择列表做准备,命名为'province','city','county'

  • < option > 与 < option /> 之间的值是浏览器显示在下拉列表中的内容,而 value 属性中的值是表单被提交时被发送到服务器的值,使其不为空。

在这里插入图片描述

<select id="province">
    <option value="none">--请选择省--</option>
</select>
<select id="city">
    <option value="none">--请选择市--</option>
</select>
<select id="county">
    <option value="none">--请选择县或区--</option>
</select>
  • 创建一个固定的js文件,适用于Chrome, Firefox, Safari, …/IE浏览器/IE 7+/IE 6-
function createXMLHttpRequest(){
    var httpReguest;
    if (window.XMLHttpRequest) {//适用于Chrome, Firefox, Safari, ..
        httpRequest = new XMLHttpRequest();
    } else if(window.ActiveXObject) {//适用于IE浏览器
        try {
            httpRequest = new ActiveXObiect("Msxml2.XMLHTTP");//IE 7+
        } catch(e){
            try {
                httpRequest = new ActiveXObject("Microsoft.XMLHTTP");// IE 6-
            } catch(e){}
        }
    }
    return httpRequest;
}

 
 

之后写js,前面说到,要做到三级联动,首先需要完成两级联动,也就是说要完成省和市的联动以及市和县区的联动

  • 为了完成省市联动和市区联动,首先要获取到省市区三个的下拉列表
var provinceElement = document.getElementById("province");
var cityElement = document.getElementById("city");
var countyElement = document.getElementById("county");
  • 首先在页面加载完毕的时候,要确保能够动态的获取到省份的信息
    • 得到服务器返回的数据
    • 将JSON字符串转换为JSON对象
    • 将数据更新带HTML页面中
var xhr = createXMLHttpRequest();
xhr.onreadystatechange = function () {
    if (xhr.readyState === 4 && xhr.status === 200) {
        // 得到服务器端返回的数据
        var response = xhr.responseText;
        // 将JSON字符串转换成JSON对象
        datas = JSON.parse(response);
        for (var i = 0; i < datas.length; i++) {
            var data = datas[i];
            var province = data.province;
            // 将数据更新到HTML页面中
            var opt = document.createElement("option");
            opt.setAttribute("value", province);
            opt.textContent = province;
            provinceElement.appendChild(opt);
        }
    }
};
  • 在获取信息的时候,需要用到xhr.open('get','data/server1.json')xhr.send(null)

  • 省和市的联动
    • 之后为省份的下拉列表去绑定change事件
      • 首先先将城市下拉列表的选项清空
      • 使用户能够选择省份的信息
      • 在根据用户所选择的省份信息来获取到对应的城市信息
        • 确保每一次在页面中选择的省市都是空白的
        • 判断使其获取到的server1.json里的名字等于下拉列表的名字
        • 获取到对用的城市信息
        • 将获取到的数据更新到HTML页面中
provinceElement.addEventListener("change", function () {
    // 将城市下拉列表的选项清空
    var cityOpts = cityElement.options;
    for (var k = 1; k < cityOpts.length; k++) {
    	cityElement.removeChild(cityOpts[k]);
    	k--;
    }

    // 1. 用户选择的省份信息
    var opts = provinceElement.options; // 获取指定下拉列表所有选项
    var index = provinceElement.selectedIndex; // 被选中<option>的索引值
    var opt = opts.item(index);
    var provinceName = opt.getAttribute("value");
    // 2. 根据省份信息获取对应的城市信息
    for (var i = 0; i < datas.length; i++) {
        var data = datas[i];
        var province = data.province;
        if (provinceName === province) {
            // 获取对应的城市信息
            var cities = data.cities;
            for (var j = 0; j < cities.length; j++) {
                var city = cities[j].city;
                // 将数据更新到HTML页面中
                var opt = document.createElement("option");
                opt.setAttribute("value", city);
                opt.textContent = city;
                cityElement.appendChild(opt);
            }
        }
    }
});
  • 市和区的联动
    • 之后为城市的下拉列表去绑定change事件
      • 首先先将市区下拉列表的选项清空
      • 使用户能够选择城市的信息,但是要保证前面的省市联动的部分不变化
      • 在根据用户所选择的省份信息来获取到对应的市区信息
        • 确保每一次在页面中选择的市区都是空白的
        • 判断使其获取到的server1.json里的名字等于下拉列表的名字
        • 获取到对用的市区信息
        • 将获取到的数据更新到HTML页面中
cityElement.addEventListener("change", function () {
    // 将区级下拉列表的选项清空
    var countyOpts = countyElement.options;
    for (var k = 1; k < countyOpts.length; k++) {
        countyElement.removeChild(countyOpts[k]);
        k--;
    }

    // 1. 用户选择的城市信息
    var opts = cityElement.options; // 获取指定下拉列表所有选项
    var index = cityElement.selectedIndex; // 被选中<option>的索引值
    var opt = opts.item(index);
    var cityName = opt.getAttribute("value");
    // 2. 根据城市信息获取对应的区级信息
    for (var i = 0; i < datas.length; i++) {
        var cities = datas[i].cities;
        for (var x = 0; x < cities.length; x++) {
            var city = cities[x].city;
            if (cityName === city) {
                var counties = cities[x].counties;
                for (var y = 0; y < counties.length; y++) {
                    var county = counties[y];
                    // 将数据更新到HTML页面中
                    var opt = document.createElement("option");
                    opt.setAttribute("value", county);
                    opt.textContent = county;
                    countyElement.appendChild(opt);
                }
            }
        }
    }
});
  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
JS三级联动表单 <!-- var arrText = new Array(5); var arrValue = new Array(arrText.length); function objSetOption(select1, select2, select3) { this.select1 = select1; this.select2 = select2; this.select3 = select3; } arrText[0]= new objSetOption("选择1:", "选择2_1:,选择2_2:", "选择3_1:,选择3_2:"); arrText[1] = new objSetOption("论文:1", "语文:1,数学:2,英语:3", "初中:2,高中:3"); arrText[2] = new objSetOption("例题:2", "显示b2_1:值b2_1,显示b2_2:值b2_2", "显示b3_1:值b3_1,显示b3_2:值b3_2"); arrText[3] = new objSetOption("显示c:值c", "显示c2_1:值c2_1,显示c2_2:值c2_2", "显示c3_1:值c3_1,显示c3_2:值c3_2"); arrText[4] = new objSetOption("显示d:值d", "显示d2_1:值d2_1,显示d2_2:值d2_2", "显示d3_1:值d3_1,显示d3_2:值d3_2"); arrText[5] = new objSetOption("显示e:值e", "显示e2_1:值e2_1,显示e2_2:值e2_2", "显示e3_1:值e3_1,显示e3_2:值e3_2"); function select() { var eltSelect1 = document.test.select1; var eltSelect2 = document.test.select2; var eltSelect3 = document.test.select3; var arrSelect1, arrSelect2, arrSelect3; var arrData1, arrData2, arrData3; with(eltSelect1) { var strSelect = options[selectedIndex].value; } for(i = 0;i < arrText.length;i ++) { arrSelect1 = arrText[i].select1; arrData1 = arrSelect1.split(":"); if (arrData1[1] == strSelect) { arrSelect2 = (arrText[i].select2).split(","); for(j = 0;j < arrSelect2.length;j++) { arrData2 = arrSelect2[j].split(":"); with(eltSelect2) { length = arrSelect2.length; options[j].text = arrData2[0]; options[j].value = arrData2[1]; } } arrSelect3 = (arrText[i].select3).split(","); for(j = 0;j < arrSelect3.length;j++) { arrData3 = arrSelect3[j].split(":"); with(eltSelect3) { length = arrSelect3.length; options[j].text = arrData3[0]; options[j].val
实现省市区三级联动的关键是建立好数据库,并且编写好对应的 SQL 语句。以下是一个简单的数据库设计: - 省份表 province,包括字段 id 和 name。 - 城市表 city,包括字段 id、name 和省份的外键 province_id。 - 区县表 district,包括字段 id、name 和城市的外键 city_id。 接下来是建表语句: ```sql -- 省份表 CREATE TABLE `province` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 城市表 CREATE TABLE `city` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) NOT NULL, `province_id` int(11) NOT NULL, PRIMARY KEY (`id`), KEY `province_id` (`province_id`), CONSTRAINT `city_ibfk_1` FOREIGN KEY (`province_id`) REFERENCES `province` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 区县表 CREATE TABLE `district` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) NOT NULL, `city_id` int(11) NOT NULL, PRIMARY KEY (`id`), KEY `city_id` (`city_id`), CONSTRAINT `district_ibfk_1` FOREIGN KEY (`city_id`) REFERENCES `city` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ``` 接下来是查询省份、城市、区县的 SQL 语句: ```sql -- 查询所有省份 SELECT id, name FROM province; -- 查询某个省份下的所有城市 SELECT id, name FROM city WHERE province_id = ?; -- 查询某个城市下的所有区县 SELECT id, name FROM district WHERE city_id = ?; ``` 在 Java Web 项目中,可以使用 AjaxJSON 技术实现省市区三级联动。前端页面发送 Ajax 请求,后端通过 JDBC 连接数据库,查询对应的省份、城市、区县信息,并以 JSON 格式返回给前端页面。前端页面再解析 JSON 数据,更新页面的省份、城市、区县下拉框选项。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值