马丁传奇

导航

jQuery之ajax的跨域获取数据

如果获取的数据文件存放在远程服务器上(域名不同,也就是跨域获取数据),则需要使用jsonp类型。使用这种类型的话,会创建一个查询字符串参数 callback=? ,这个参数会加在请求的URL后面。服务器端应当在JSON数据前加上回调函数名,以便完成一个有效的JSONP请求。意思就是远程服务端需要对返回的数据做下处理,根据客户端提交的callback的参数,返回一个callback(json)的数据,而客户端将会用script的方式处理返回数据,来对json数据做处理。JQuery.getJSON也同样支持jsonp的数据方式调用。下面演示关于jQuery处理跨域请求ajax的方式:

服务器端(PHP为例):

<?php
$data = array('name'=>' 张三','age'=>22,'city'=>'newYork');
sleep(3);            //人为设置一个等待(用于观察什么是ajax的同步与异步)
responseAJAX($data); //响应请求返回数据


/**
 * 返回处理后的ajax请求数据
 * @author martinzhang
 * @param  $data 待返回的数据
 * @return none
 */
function responseAJAX($data){    
    $data = json_encode($data);
    $getCallBackName = $_REQUEST['callback'];   //获取callback调用的function函数名
    if($getCallBackName != ''){
        //使用了jsonp跨域请求
        $data = $getCallBackName.'('.$data.')'; //返回格式形如:callbackFunName({"name":" \u5f20\u4e09","age":22,"city":"newYork"})
        die($data);
    }else{
        //未跨域
        die($data);
    }    
}


客户端:

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
<title>jsonp跨域</title>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<script type="text/javascript" language="javascript" src="../jquery-1.8.2.js"></script> 
</head> 
<body> 
<form id="form1" runat="server"> 
<div> 
<input type="button" id="btn1" onclick="BtnClick()" value="jsonp" style="width:55px; height:20px;" /> 
<input type="button" id="btn1" onclick="BtnClick2()" value="getJSON" style="width:55px; height:20px;" /> 
</div>
<p></p>
<div id="dd"> 
sd......
</div> 
<div> 
<script type="text/javascript" language="javascript">
//方式一:
function BtnClick() {    
    $.ajax({ 
        url: 'http://others.com/0_module/0/jQuery/ajax_jsonp/serverAPI.php',
        //async: false,                     //ture表示异步(默认);false表示同步;
        type: 'get', 
        dataType : 'jsonp',                 //返回数据类型:需要显式指定
        jsonp: 'callback',                  //服务端用于接收callback调用的function名的参数名(变量名)
        //jsonpCallback: 'callbackFunName', //可以显式地指定callback的函数名【如果不设置此项jquery会使用一个随机的含时间串的名称做为callback的函数名】
        success: function(data){
            //alert(data);
            $('#dd').html(data.name); 
        }
    }); 

    alert('什么是异步?就是js不会等ajax何时请求回数据,程序顺序向下执行它下面的其它程序,ajax何时候请求回数据就何时处理');
}

//方式二:
function BtnClick2() {
    $.ajaxSettings.async = false;           //显式声明此次请求为同步
    $.getJSON("http://others.com/0_module/0/jQuery/ajax_jsonp/serverAPI.php?callback=?",null,function(data){
        $('#dd').html(data.name); 
    });

    alert('何谓同步?就是必须等ajax请求回来数据之后,js才会顺序向下执行它下面的程序');
}

</script> 
</div> 
</form> 
</body> 
</html>

 


 

 

posted on 2013-12-05 15:54  马丁传奇  阅读(1076)  评论(0编辑  收藏  举报