jQuery之ajax的跨域获取数据

时间:2023-11-23 09:42:02

如果获取的数据文件存放在远程服务器上(域名不同,也就是跨域获取数据),则需要使用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>