重构之美 -- 函数封装十四式 第二式: js实现三级目录联动统一ajax请求


一. 拆招

今天笔者在操作 三级联动查询的时候 感受到了被自己支配的恐惧: 故事是这样的(先闷一口酒, 心里苦)

一开始并没有想到封装js的三级联动, 本着解决眼下问题的心态去写 (一个人敲代码 容易自嗨) , 起初,我只考虑到三级联动查询的情况 (本宝宝还是年轻啊) 这个时候问题还不是很大, 也就是一个三级联动占100行左右代码

后面 我在修改,新增的时候 本能的光速快捷键(你懂的) 移植代码 发现情况不对劲首先, 无法重用

比如修改 应该是 界面已经帮我们做了一次三级联动的选择 所以我们看到的 是每个下拉框有默认选中的值 然后才会响应三级联动

当时我的心态崩了, 一个三级联动, 充斥了我好几个js 实在忍无可忍, 所幸凭借着多年闯荡江湖的经验 咱来统一重构一哈


二. 修炼

下面这个代码 , 花了老夫3个小时 不停的打磨, 才大功告成(不到100行), 便宜你们了
注: 整体重构在一个js 页面通过两个函数实现

使用时: 需要注意 必须保证你所操作的三级目录所在的select标签中有
id 并且id值就是下面levelName

/**
 * 目录列表查询的 统一实现
 * 包括设置默认选中值
 * @param levelName 下拉列表的标识(可以是id,name属性值)
 * @param pid 父级目录Id
 * @param selectId 选中的Id值
 * @returns
 */
function generalAjaxV2(levelName, pid, selectId) {
 if (levelName == null) {
  layer.msg(levelName+"目录不存在", {icon: 6, time:1500});
  return;
 }
 
 $.ajax({
  type: "GET",
  url: "listOtherCategory.json", //请求后台的路径
  data: {"pid" : pid},
  dataType: "json",
  success: function(res) {
   $("#"+levelName).html("");
   var options = "<option>--请选择--</option>"
   for(var i = 0; i < res.length; i++) {
    if(selectId !=null && selectId != undefined && selectId == res[i].id) {
     options += "<option selected='selected' value="+res[i].id+">"+res[i].categoryName+"</option>";
    } else {
     options += "<option value="+res[i].id+">"+res[i].categoryName+"</option>";
    }
   }
   $("#"+levelName).html(options);
  },
  error: function(res) {
   window.location.href = "list";
   layer.msg("目录查询失败", {icon: 6, time:1500});
  }
 });
}



/**
 * 三级联动 动态查询
 * @param Lv1Name 
 * @param Lv2Name
 * @param Lv3Name
 * @param selectId
 * @returns
 */
function categoryChange(Lv1Name, Lv2Name, Lv3Name, selectId) {
 //触发change函数的name值
 var name = null;
 //响应联动的目录 name值
 var ajaxName = null;
 if (Lv1Name != null) {
  name = Lv1Name;
  ajaxName = Lv2Name;
  
 } else if (Lv1Name == null) {
  name = Lv2Name;
  ajaxName = Lv3Name;
 } else {
  layer.msg("没有对应的子目录列表!", {icon: 6, time:1500});
  return;
 }
 
 $("#"+name).change(function(){
  var index = $(this).prop("selectIndex");
  var pid = $(this).val();
  if (pid.indexOf("请选择") ==-1 && pid != "" && 
    null != pid && index != 0) {
   
   generalAjaxV2(ajaxName, pid, null);
   
  } else {
   //如果未选择或者选中第一项  那么刷新待响应的目录
   $("#"+ajaxName).html("");
   var options = "<option></option>";
   $("#"+ajaxName).html(options);
  }
  //如果一级目录触发 ,那么三级必然需要刷新
  if(Lv1Name != null) {
   $("#"+Lv3Name).html("");
   var options = "<option></option>";
   $("#"+Lv3Name).html(options);
  }
 });
}


调用注意事项:

  • 对于查询 新增页面所用的三级联动 直接在jquery初始化中调用下面的代码:
//立刻加载一级目录
 generalAjaxV2("appLevel1", null, null);
 //动态加载二级
 categoryChange("appLevel1", "appLevel2", "appLevel3", null);
 //动态加载三级
 categoryChange(null, "appLevel2", "appLevel3", null);
  • 对于修改页面 ,由于一个初始值 所以需要多两行代码

 var Lv1Value = $("#level1Id").val();	//要初始化的选项id
 var Lv2Value = $("#level2Id").val();
 var Lv3Value = $("#level3Id").val();
 
 //立刻加载所选中的目录
 generalAjaxV2("appLevel1", null, Lv1Value);
 generalAjaxV2("appLevel2", Lv1Value, Lv2Value);
 generalAjaxV2("appLevel3", Lv2Value, Lv3Value);
 //动态加载二级
 categoryChange("appLevel1", "appLevel2", "appLevel3", null);
 //动态加载三级
 categoryChange(null, "appLevel2", "appLevel3", null);
  • 至于回调的参数看你心情修改一下都是可以的,

三. 江湖再会

下一招: 函数封装十四式 – 第三式: 待续

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值