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;
    }

搞定!

posted @ 2013-03-08 10:57  人生如若初见  阅读(2304)  评论(0编辑  收藏  举报