前端使用lbs云地图补全详细地址搜素功能(涉及跨域请求)

跨域请求_专题讲解

在Java中,我们可以通过WebClient或HttpClient直接进行跨域远程访问, 但是在前端页面中通过js却存在着限制

 

1.什么是跨域访问?  http://localhost:8080/xxx/xxx

协议,端口,域名任一不同即跨域, 浏览器由于自身限制默认所有文件都不支持跨域访问,例如:

$.post( "域外地址", {}, function(data){

 

});

 

但是也有例外,如果网页上通过<scriptsrc="域外js"></script>,<imgsrc=”域外图片”/>以及<link href=”域外样式”/>这样的标签来引用域外的资源是可以的

 

2.如何实现跨域访问?

我们可以在远程服务器上把json数据装进js文件里,然后把该js文件输出给客户端, 客户端通过<script>标签来接收, 这就是jsonp(JSON with Padding)

 

 

3.演示jsonp的实现原理(参考代码在最后一天的项目源码中)

运行http://localhost:9001/bos_management/TestJSONP.html

l  bos_management项目中的TestJSONP.html

l  bos_fore项目中的JSONPAction.java

 

 

4.getJSON方法的实现原理

jQuery给我们提供了一个getJSON函数用来实现跨域访问, 打开”getJSON方法实现跨域请求原理分析.bmp”


如果只是简单生成自动搜索补全只需要

var ac = new BMap.Autocomplete( //建立一个”自动完成”类的对象

        {

                 "input": "sendAddress"     //input是固定参数名, 值是下面网页中"详细地址"文本框的ID

        });

代码如下:


效果图:




代码进阶:输入详细地址后,会自动更改省市区信息

<scripttype="text/javascript">  

        varac = new BMap.Autocomplete( //建立一个”自动完成”类的对象

        {

                 "input": "sendAddress"     //input是固定参数名, 值是下面网页中"详细地址"文本框的ID

        });

//其实上面的代码就已经实现了自动补全功能,下面的代码是为了获取云地理编码数据,解决详细地址跟省市区不一致的bug

        varmyValue;

        ac.addEventListener("onconfirm",  function(e) { //鼠标点击下拉列表某一项的事件

                                                  var_value = e.item.value;  //得到选中项的值

                                                  myValue= _value.province + _value.city  //从选中项的值中分别把省市区街道商户名等详细信息取出来

                                                                   +_value.district + _value.street

                                                                   +_value.business;

                                                  console.log(myValue);                                     

                                                  //得到详细地址后,远程调用百度地图获取云地理编码数据

                                                  varaddress = encodeURIComponent(myValue);  //转码处理

                                                  console.log(address);

                                                  $.getJSON("http://api.map.baidu.com/cloudgc/v1?ak=zbLsuDDL4CS2U0M4KezOZZbGUY9iWtVf&address="

                                                                                                   +address + "&callback=?",

                                                                                    function(data){

                                                                                            console.log(data);

                                                                                            if(data.status == 0 && data.result.length > 0) {

                                                                                                    $('#sendAreaInfo').citypicker('reset');

                                                                                                    $('#sendAreaInfo').citypicker('destroy');

                                                                                                    $('#sendAreaInfo').citypicker(

                                                                                                                      {

                                                                                                                                      province :data.result[0].address_components.province,

                                                                                                                                     city: data.result[0].address_components.city,

                                                                                                                                      district :data.result[0].address_components.district,

                                                                                                                      });

                                                                                            }

                                                                                    });

                                          });

</script>

 



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值