省市区县三级联动JAVA+MySQL+JQuery

论坛 期权论坛 脚本     
匿名技术用户   2020-12-22 10:36   45   0

场景介绍:

由于项目要求,需要做一个进件(新增)功能,而该功能里要用到车品牌、车系、车型的联动查询,也就是经典的三级联动。

大体思路如下:

进入页面,会把所有的车品牌(第一级)在后台查询出来,放到缓存,页面在循环遍历,当选中车品牌(第一级)的某一项时,会根据此项异步的调用后台的方法,然后渲染到前台页面的车系(第二级),当选中车系(第二级)的某一项时,也会根据此项异步的调用后台的方法,然后渲染到前台页面的车型(第三级)。

当重新选择车品牌(第一级)时,会把车系(第二级)和车型(第三级)置为初始值'请选择车系'、'请选择车型',若车品牌(第一级)不做修改,而只是重新选择车系(第二级)时,则车型(第三级)要置为初始值'请选择车型'。

记录一下其中的难点(我认为的难点):

当重新选择某一级数据时,要把他的下级以及子级都要置为初始值!经过请教同事和搜索引擎,找到了一个叫select2()的插件。

下面就贴出项目中关键代码:

JSP表单代码:

  1. <div class="control-group" style="margin-top:12px;">
  2. <label class="controls-label">品牌名称:</label>
  3. <form:select id="operTypeSelect" path="bannerId" class="input-medium" onchange="getBranchByBrandName()">
  4. <form:option selected="selected" value="">请选择</form:option>
  5. <c:forEach items="${tCdCarBrandList}" var="item" varStatus="status">
  6. <form:option value="${item.id }">${item.brandName }</form:option>
  7. </c:forEach>
  8. </form:select>
  9. <label class="controls-label">车系名称:</label>
  10. <select id="operSelect" name="branchId" class="input-medium" onClick="getModelByBranchName()">
  11. <option selected="selected" value="">请选择</option>
  12. <c:forEach items="${tCdCarBranchList}" var="item" varStatus="status">
  13. </c:forEach>
  14. </select>
  15. <label class="controls-label">车型名称:</label>
  16. <select id="modelsId" name="modelId" class="input-medium" style="width:400px;">
  17. <option selected="selected" value="">请选择</option>
  18. <c:forEach items="${tCdCarModelList}" var="item" varStatus="status">
  19. </c:forEach>
  20. </select>
  21. </div>
JS部分代码:
[javascript] view plain copy
  1. function getBranchByBrandName() {
  2. var operTypeSelect = document.getElementById("operTypeSelect");
  3. var operTypeValue = operTypeSelect.value;
  4. var brandId = operTypeValue;
  5. $("#brandId").val(brandId);
  6. $("#modelsId").empty();
  7. $.ajax({
  8. mode:"abort",
  9. contentType:"application/x-www-form-urlencoded;charset=UTF-8",
  10. data:{"brandId":brandId},
  11. type:"POST",
  12. url:"<span style="font-family: Arial, Helvetica, sans-serif;">你的后台方法访问路径</span>",
  13. cache:false,
  14. async:false,
  15. processData:true,
  16. dataType:"json",
  17. success:function(tCdCarBrandList) {
  18. if (tCdCarBrandList != null && tCdCarBrandList.length > 0) {
  19. var str = "<option value=''> " + "请选择" + "</option>;";
  20. $.each(tCdCarBrandList, function(i, item) {
  21. if (item != "") {
  22. str = str + "<option value="+item.id+"> " + item.branchName + "</option>;";
  23. $("#operSelect").html(str);
  24. } else {
  25. $("#operSelect").html("<option id = oper value=''>请选择</option>");
  26. }
  27. });
  28. } else {
  29. $("#operSelect").html("<option id = oper>请选择</option>");
  30. }
  31. <span style="background-color: rgb(255, 0, 0);">$("#operSelect").select2();</span>
  32. $("#modelsId").html("<option value=''>请选择</option>");
  33. <span style="background-color: rgb(255, 0, 0);">$("#modelsId").select2();</span>
  34. }
  35. });
  36. }
  37. function getModelByBranchName() {
  38. var brandId = $("#operTypeSelect").val();
  39. var branchId = $("#operSelect").val();
  40. $("#bannerId").val(branchId);
  41. $.ajax({
  42. mode:"abort",
  43. contentType:"application/x-www-form-urlencoded;charset=UTF-8",
  44. data:{"brandId":brandId,"branchId":branchId},
  45. type:"POST",
  46. url:"你的后台方法访问路径",
  47. cache:false,
  48. async:true,
  49. processData:true,
  50. dataType:"json",
  51. success:function(tCdCarModelList) {
  52. if (tCdCarModelList != null && tCdCarModelList.length > 0) {
  53. var str = "<option value=''> " + "请选择" + "</option>;";
  54. $.each(tCdCarModelList, function(i, item) {
  55. if (item != "") {
  56. str = str + "<option value="+item.id+"> " + item.modelName + "</option>;";
  57. $("#modelsId").html(str);
  58. } else {
  59. $("#modelsId").html("<option value=''>请选择</option>");
  60. }
  61. });
  62. } else {
  63. $("#operSelect").html("<option value=''>请选择</option>");
  64. }
  65. <span style="background-color: rgb(255, 0, 0);">$("#modelsId").select2();</span>
  66. }
  67. });
  68. }
后台JAVA部分查询代码:
  1. @ResponseBody
  2. @RequestMapping(value="findBranchByBrandName")
  3. public List<TCdCarBranch> findBranchByBrandName(TCdCarBranch tCdCarBranch,
  4. HttpServletRequest request, HttpServletResponse response, Model model) {
  5. // SQL中只用到了ajax中data的brandId,brandId与tCdCarBranch里的brandId字段对应
  6. List<TCdCarBranch> tCdCarBranchList = tCdCarBranchService.findList(tCdCarBranch);
  7. model.addAttribute("tCdCarBranchList", tCdCarBranchList);
  8. return tCdCarBranchList;
  9. }
  10. @ResponseBody
  11. @RequestMapping(value="findModel")
  12. public List<TCdCarModel> findModel(TCdCarModel tCdCarModel, HttpServletRequest request,
  13. HttpServletResponse response, Model model) {
  14. // SQL中只用到了ajax中data的brandId和branchId
  15. // brandId和branchId与tCdCarModel里的brandId和branchId字段分别对应
  16. List<TCdCarModel> tCdCarModelList = tCdCarModelService.findList(tCdCarModel);
  17. model.addAttribute("tCdCarModelList", tCdCarModelList);
  18. return tCdCarModelList;
  19. }

其中JS部分代码中背景为红色高亮代码即是可以将其下级以及子级置为初始化的关键代码,当初就是这行代码困扰了很少时间,

JS高亮代码加入之前的演示:



JS高亮代码加入之后的演示:



至此堪称完美的效果已出,考虑到可能有些朋友可能会感觉到云里雾绕,所以博主自己搭建了一个spring、springmvc、Mybatis框架的demo,是省市区县的三级联动。

此demo中有源码和SQL脚本,脚本有两套,其中原版脚本文件夹里的脚本,博主觉得有不妥之处,因为每个省份下的城市里有初始化的值'市辖区',每个城市对应的区县里也有初始化的值'市辖区',这样的结果会导致当你切换省份信息时,城市和区县的两个下拉菜单的首选项是从数据库里取出来的,而不是JS控制的。所以我在原有的基础上进行了优化,把每个省份对应的城市以及每个城市对应的区县的初始化值删除了。

项目源码以及脚本位置

演示如下:





分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP