zoukankan      html  css  js  c++  java
  • jquery实现ajax联动框 二

    另一种形式的联动框,右边的联动框用jquery生成

    这是仿照上篇的js方法修改的

    先看下页面代码:

    <tr id="sfqySelect">
            <td width="100" class="t_r prten field_c">事发区域:</td>
            <td width="131">
                <select class="building"></select>
            </td>
            <td width="10"></td>
            <td width="131">
                <input id="choose_floor" class="text_k choose_floor" type="text" value="点击选择楼层">
                <input class="choose_floor_hidden FL {validate:{required:true}}" type="hidden" name="geoareaid" value="">
                <div id="floorNum" class='floorNum'></div>
            </td>
          </tr>

    页面调用的js:

    <script type="text/javascript" src="${rc.contextPath}/js/jquery.building.js"></script>
    <script type="text/javascript">    
      $(document).ready(function(){
          $("#sfqySelect").building({
          nodata:"none",
          required:true,
          buildingUrl:'${rc.contextPath}/repair/loadBuildings',
          floorUrl:'${rc.contextPath}/repair/loadFloors',
          clickCallback:function(value,text,other){
               moveGis(other);
           }
          }); 
      });
      </script>

    对应的 jquery.building.js 文件如下:

    /*
    Ajax 三级联动
    日期:2013-2-26
    
    settings 参数说明
    -----
    buildingUrl:大楼下拉数据获取URL,josn返回
    buildingValue:默认大楼下拉value
    floorUrl:楼层数据获取URL,josn返回
    floorValue:默认楼层value
    nodata:无数据状态
    required:必选项
    clickCallback:点击时的回调函数
    ------------------------------ */
    (function($){
        $.fn.building=function(settings){
            if($(this).size()<1){return;};
            // 默认值
            settings=$.extend({
                buildingUrl:"js/city.min.js",
                floorUrl:"js/city.min.js",
                buildingValue:null,
                floorValue:null,
                nodata:null,
                required:true,
                clickCallback:function(){}
            },settings);
    
            var box_obj=this;
            var building_obj=box_obj.find(".building");
            var floor_obj=box_obj.find(".choose_floor");
            var floorHidden_obj=box_obj.find(".choose_floor_hidden");
            var floorPanel_obj=box_obj.find("#floorNum");
            var select_prehtml=(settings.required) ? "" : "<option value=''>请选择</option>";
    
            var prepareSelectHtml=function(jsonArray){
                var temp_html=select_prehtml;
                $.each(jsonArray,function(index,row){
                    temp_html+="<option value='"+row.value+"'>"+row.text+"</option>";
                });    
                return temp_html;
            };
            var prepareFloorPanelHtml=function(jsonArray){
                var temp_html='<table id="floor_table" cellpadding="0" cellspacing="0">';
                var count=0;
                $.each(jsonArray,function(index,row){
                    if(count==0){
                        temp_html+='<tr>';
                    }
                    var otherAttr="";
                    if(row.other){
                        otherAttr="other="+row.other+"";
                    }
                    temp_html+='<td '+otherAttr+' floorId='+row.value+'>'+row.text+'</td>';
                    if(count>0&&count%3==0){
                        temp_html+='</tr>';
                        count=-1;
                    }
                    count=count+1;
                });    
                temp_html+='</table>';
                return temp_html;
            };
            // 赋值二级下拉框函数
            var createFloorPanel=function(){
                floor_obj.val('点击选择楼层');
                floorHidden_obj.val('');
                //floorPanel_obj.empty();
                if(building_obj.val()==''){
                    return;
                }
                $.getJSON(settings.floorUrl, { buildingId: building_obj.val(), time: new Date().getTime() }, function(jsonResult){
                    if(!jsonResult.success){
                        if(settings.nodata=="none"){
                            floorPanel_obj.css("display","none");
                        }else if(settings.nodata=="hidden"){
                            floorPanel_obj.css("visibility","hidden");
                        };
                        return;
                    }
                    // 遍历赋值二级下拉列表
                    floorPanel_obj.html(prepareFloorPanelHtml(jsonResult.data));
                    floorPanel_obj.find('td').click(function(){
                        //hide
                        var text = $(this).html();
                        var value = $(this).attr("floorId");
                        var other =$(this).attr("other");
                        floor_obj.val(text);
                        floorHidden_obj.val(value);
                        floorPanel_obj.css("display","none");
                        settings.clickCallback(value,text,other);
                    });
                    /*$('body').filter('.choose_floor').click(function(){
                        alert(1)
                        floorPanel_obj.css("display","none");
                    });    */
                });
                
    
            };
    
    
            var init=function(){
                // 遍历赋值一级下拉列表
                $.getJSON(settings.buildingUrl, {time: new Date().getTime() }, function(jsonResult){
                    if(!jsonResult.success){
                        return;
                    }
                    // 遍历赋值一级下拉列表
                    building_obj.html(prepareSelectHtml(jsonResult.data));    
                    createFloorPanel();
                    // 若有传入大楼与楼层的值,则选中。(setTimeout为兼容IE6而设置)
                    setTimeout(function(){
                        if(settings.buildingValue && settings.buildingValue.length>0){
                            building_obj.val(settings.buildingValue);
                            createFloorPanel();
                            setTimeout(function(){
                                if(settings.floorValue!=null){
                                    floor_obj.val(settings.floorValue);
                                };
                            },1);
                        };
                    },1);
                });
    
                // 选择一级时发生事件
                building_obj.bind("change",function(){
                    createFloorPanel();
                });
    
                floor_obj.click(function(){
                    //show
                    //alert(floorPanel_obj.html())
                    //floorPanel_obj.css("height","100px");
                    //floorPanel_obj.css("width","100px");
                    //floorPanel_obj.css('floorNum');
                    floorPanel_obj.css("display","block");
                });
            };
    
            // 初始化第一个下拉框
            init();
        };
    })(jQuery);

    后台处理请求及返回json数据:

    @RequestMapping("loadBuildings")
        @ResponseBody
        public Map<String, Object> loadBuildings(ModelMap model){
               String msg = "";
                boolean isSuccess = false;
                List<Map<String, String>> maps=new ArrayList<Map<String,String>>();
                try {
                    List<GeoArea> buildings= geoAreaService.findBuildings();
                    for (GeoArea building : buildings) {
                        Map<String,String> map=new HashMap<String, String>();
                        map.put("value", building.getId().toString());
                        map.put("text", building.getName());
                        maps.add(map);
                    }
                    msg = "查找大楼成功。";
                    isSuccess=true;
                } catch (Exception e) {
                    msg = "查找大楼失败。";
                    log.error("查找大楼失败:" + e.getMessage(), e);
                } 
               
            return buildAjaxResult(isSuccess, msg,maps);
        }
        @RequestMapping("loadFloors")
        @ResponseBody
        public Map<String, Object> loadFloors(@RequestParam("buildingId")Integer buildingId,ModelMap model){
            String msg = "";
            boolean isSuccess = false;
            List<Map<String, String>> maps=new ArrayList<Map<String,String>>();
            try {
                List<GeoArea> floors= geoAreaService.findFloorById(buildingId);
                for (GeoArea floor : floors) {
                    Map<String,String> map=new HashMap<String, String>();
                    map.put("value", floor.getId().toString());
                    map.put("text", floor.getName());
                    map.put("other", floor.getCode());
                    maps.add(map);
                }
                msg = "查找楼层成功。";
                isSuccess=true;
            } catch (Exception e) {
                msg = "查找楼层失败。";
                log.error("查找楼层失败:" + e.getMessage(), e);
            } 
            
            return buildAjaxResult(isSuccess, msg,maps);
        }
    
    protected Map<String, Object> buildAjaxResult(boolean isSuccess, String msg, Object data) {
            Map<String, Object> resultMap = new HashMap<String, Object>();
            resultMap.put("success", isSuccess);
            resultMap.put("msg", msg);
            resultMap.put("data", data);
            return resultMap;
        }

    搞定!

  • 相关阅读:
    关于lockkeyword
    关于多层for循环迭代的效率优化问题
    Android 面试精华题目总结
    Linux基础回想(1)——Linux系统概述
    linux源代码编译安装OpenCV
    校赛热身 Problem C. Sometimes Naive (状压dp)
    校赛热身 Problem C. Sometimes Naive (状压dp)
    校赛热身 Problem B. Matrix Fast Power
    校赛热身 Problem B. Matrix Fast Power
    集合的划分(递推)
  • 原文地址:https://www.cnblogs.com/winkey4986/p/2949487.html
Copyright © 2011-2022 走看看