使用AJAX实现省份和城市的级联显示

各位大神求救啊。告诉我该怎么做

数据是从数据库中获取,测试获取正常。

框架使用的是springMVC
前台代码
function changePro(pro) {
var pro_id = pro;
//异步请求查询ci列表的方法并返回json数组
$.ajax({
url : "/crm/info/findcity",
type : "post",
data :{pro_id:pro_id},
dataType:"json",
async:false,
success : function (ci) {
var txt = request.getAttribute("ci");
var citys = txt.parseJSON();
document.getElementById('ci').innerHTML='';
for(i=0;i<citys.length;i++){
var op = new Option(citys[i].city_id,citys[i].city_name);
document.getElementById('ci').options[i]=op;
}
}
});
}

服务端代码
@RequestMapping(value="/findcity", method = RequestMethod.POST)
public @ResponseBody String findCity(@RequestParam("pro") String pro_id,HttpServletRequest request) throws Exception{
System.out.println(pro_id);
System.out.println("--------");
List<City> ci = dao.findCityByPro(pro_id);
JSONArray obj = JSONArray.fromObject(ci);
String str = obj.toString();
System.out.println(str);
request.setAttribute("ci", str);
return null;
}

一直无法成功,在浏览器的控制台发现,每次选择省份的时候都是提示
[HTTP/1.1 400 Bad Request 23ms]

各位大神求救啊。

你后台把json数组转字符串之后不输出放进request对象中干嘛呢?我用的另一种方法实现的三级联动,省市区的:

<script type="text/javascript">
     jQuery(document).ready(function($){
         $("#province").change(function(){
             var pid=$("#province").val();
             var sectionObj=document.getElementById("section");
             sectionObj.length=0;
             sectionObj.options[0]=new Option("请选择区县",-1);
            sectionObj.value=-1;
             if(pid!=-1){
                 var url="/service_order/getCity.htm";
                 var data={"provinceId":pid};
                  $.post(url,data,function(result){
                      var cityObj=document.getElementById("city");
                      cityObj.length=0;
                      var aryData=null;
                      if(!!(window.attachEvent && !window.opera)){ 
                      //ie 
                         aryData=execScript(result); 
                       }else
                      { //not ie 
                         aryData=eval(result);
                       }
                      cityObj.options[0]=new Option("请选择城市",-1);
                      for(var i=0;i<aryData.length;i++){
                          var city=aryData[i];
                          cityObj.options[i+1]=new Option(city.name,city.id);
                      }
                  });
             }else{
                 var cityObj=document.getElementById("city");
                 cityObj.length=0;
                 cityObj.options[0]=new Option("请选择城市",-1);
                 cityObj.value=-1;
             }
               
         });
         $("#city").change(function(){
             var cid=$("#city").val();
             if(cid!=-1){
                 var url="/service_order/getSection.htm";
                 var data={"cityId":cid};
                  $.post(url,data,function(result){
                      var sectionObj=document.getElementById("section");
                      sectionObj.length=0;
                      var aryData=null;
                      if(!!(window.attachEvent && !window.opera)){ 
                      //ie 
                         aryData=execScript(result); 
                       }else
                      { //not ie 
                         aryData=eval(result);
                       }
                      sectionObj.options[0]=new Option("请选择区县",-1);
                      for(var i=0;i<aryData.length;i++){
                          var section=aryData[i];
                          sectionObj.options[i+1]=new Option(section.name,section.id);
                      }
                  });
             }else{
                 var sectionObj=document.getElementById("section");
                 sectionObj.length=0;
                 sectionObj.options[0]=new Option("请选择区县",-1);
                 sectionObj.value=-1;
             }
               
         });
     });
 </script>

服务端

public void getCity() throws Exception {
        HttpServletResponse res = ServletActionContext.getResponse();
        PrintWriter out = res.getWriter();
        try {
            Map<String, Object> searchMap = new HashMap<String, Object>();
            searchMap.put("provinceId", Long.parseLong(provinceId));
            cityList = som.getObjectsByParams(CodeoemBncCity.class, searchMap,
                    null);
            if (cityList != null) {
                Gson gson = new Gson();
                String result = gson.toJson(cityList);
                out.print(result);
            } else {
                System.out.println("没有获取到城市信息:no citys");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            out.flush();
            out.close();
        }
    }

上次一家伙要三级联动我给贴上去了,谁知道没通过规范没发出去,刚好给你贴过来,注意交互部分就好了

追问

选择省份后出现400错误是怎么回事呢?传递参数有问题?section是什么啊?

追答

请求有问题,把dataType的json改成JSON,data的参数格式我记得是{"":""}这样的吧,记不大清除了,你可以试试

温馨提示:内容为网友见解,仅供参考
无其他回答

请问用什么方式可以实现省市级联的效果呀 省市的数据是从数据库中查出 ...
1)、页面初始化时,首先加载所有的省;2)、选择省,ajax传送编码至服务器,服务器根据选中的省编码,返回省下所有的市。这样就能动态实现了省市级联的效果了。

使用AJAX实现省份和城市的级联显示
cityObj.options[0]=new Option("请选择城市",-1); cityObj.value=-1; } }); $("#city").change(function(){ var cid=$("#city").val(); if(cid!=-1){ var url="\/service_order\/getSection.htm"; var data={"cityId":cid}; ...

跪求:怎么在选择省份后,在第二个控件里显示所选省里的城市,前提是在数...
简单的下拉列表级联更新。选择省份后会有SelectedValue,通过这个Value去数据库中查找城市,绑定你的城市下拉列表。注意把IsPostBack设置成true.想做无刷新效果最简单的办法就是楼上说的用.net自带的AJAX的控件。

ajax 省市区多级联动(在struts2中),有人能做出个简单的吗??
1.获取省份的列表值,有2种方式:一是返回List集合,在页面进行迭代;二是在业务类中将下拉列表封装好,页面通过JQuery方法写入。 这里暂时采用第二种方法。 2.前台JQuery:①数据库里面需要存的值,三者都有可能,三选一(判断是否选中了下面的级联项,按选中的最低级项为准值); ②将三个下拉框的name属性设置为变量,便...

asp.net 查询 省市级联, 市级用JQuery赋值, Form表单提交后, 市级中的...
表单一提交页面就刷新了,你用ajax实现的显示市肯定就没有了,你可以在表单提交的时候记录下省和市的ID或者索引,当提交表单之后,根据省的ID重新查询市的列表,并默认选择到用户选择的城市

jsp做级联下拉菜单
(这里有两个下拉菜单. 1:所有省 2:省下的区县市)操作: 先把所有的省级单位查出来 显示到第一个下拉菜单中 在第一个下来菜单的onchange事件中 通过选择省份的ID 去查询(通过ajax查询并且返回该ID下的区县)把返回的区县在页面中遍历 显示到第二个下拉菜单中 关键 : 会使用ajax ...

如何实现选择省份自动跳出相关城市的,有代码吗请发至laiqiansheng@qq.co...
代码发不了,不过可以给你参考资料的方向:第一种:js实现省市级联 第二种:使用ajax,选中省份时用ajax将省份的id或其他信息发送到后台,然后根据这个条件查找出相关城市集合,再关联到页面就OK了。第一种是在页面的js中写死的,第二种可以从数据库中获取,灵活性较好。希望能帮到你。

我现在也是在做级联,我要实现省市级联,用的是 标签?
这个省呢是页面加载时用struts直接填充过来的。用不到ajax。市的获取要写prov函数了。function prov(o){ var provId = o.value;var url = "http:\/\/localhost:8080\/Web\/Pos#getCity.action?id="+provId; \/\/我这里假设你是这个url \/\/ajax提交在网上自已找吧。太多了。。} ...

JAVA EE 使用SSH框架如何实现下图的三个单选框
1. 一次性加载所有省份,及它们包含的市县,组织成JSON或者XML。使用javascript操作。2.使用Ajax

请问如何实现:在网页中选择了国家,下面自动出现该国家的省名供选择
\/\/得到对应省份的城市数组 var provinceCity=city[sltProvince.selectedIndex - 1];\/\/清空城市下拉框,仅留提示选项 sltCity.length=1;\/\/将城市数组中的值填充到城市下拉框中 for(var i=0;i<provinceCity.length;i++){ sltCity[i+1]=new Option(provinceCity[i],provinceCity[i]);} } ...

相似回答