跨域请求的方式有很多种,
1,iframe
2,document.domain
3,window.name
4,script
5,XDomainRequest (IE8+)
6,XMLHTTPRequest (Firefox3.5+)
7,postMessage (HTML5)
8,后台代理
...

1.jsonp
其实 jsonp 是个很简单的一个东西。
主要是利用了 <script/> 标签对 javascript 文档的动态解析来实现。(其实也可以用eval函数)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
    <title>Test Jsonp</title>
    <script type="text/javascript">
            function jsonpCallback(result)
            {
            alert(result.msg);
            }
        </script>
    <script type="text/javascript" src="http://uefirst.com/jsonServerResponse?jsonp=jsonpCallback"></script>
</head>
<body>
</body>
</html>

其中 jsonCallback 是客户端注册的,获取跨域服务器上的json数据后,回调的函数。 uefirst.com/jsonServerResponse?jsonp=jsonpCallback 这个 url 是跨域服务器取 json 数据的接口,参数为回调函数的名字,返回的格式为

jsonpCallback({msg:'this is json data'})  

Jsonp原理:
首先在客户端注册一个callback, 然后把callback的名字传给服务器。

此时,服务器先生成 json 数据。
然后以 javascript 语法的方式,生成一个function , function 名字就是传递上来的参数 jsonp.
最后将 json 数据直接以入参的方式,放置到 function 中,这样就生成了一段 js 语法的文档,返回给客户端。
客户端浏览器,解析script标签,并执行返回的 javascript 文档,此时数据作为参数,传入到了客户端预先定义好的 callback 函数里.(动态执行回调函数)

2.动态加载js
动态加载js数据
例如数据服务器有个页面a.com/1.php输出数据如下:

var hqs2={
Summary:{pages:1,page:1,total:1,hqtime:"20110422150108"},
Column:{id:0,code:1,name:2,lcp:3,np:4,hlp:5,pl:6,scnt:7,ta:8,tm:9},
HqData:[
  ["1208","1208","黑龙江省",12.48,12.42,-0.06,-0.47,33,2182408,224596.97]
  ]
};

调取页面b.com/1.html

function GetJsData(src,callback){
    var head=document.getElementsByTagName("head")[0];
    var js=document.createElement("script");
    js.setAttribute("src",src);
    js.onload=js.onreadystatechange=function(){
        if(!this.readyState||this.readyState=="loaded"||this.readyState=="complete"){
            head.removeChild(js);
            if(callback) callback();
        }
    }
    head.appendChild(js);
}
GetJsData('http://a.com/1.php',function(){
    //加载完成...
    if(hqs2){
        var total = hqs2.Summary.total;
        alert(hqs2.HqData[0][hqs2.Column.name]);
    }
});
//返回:黑龙江省

3.通过服务器中转

如asp.net服务端1.aspx

public static string getContent(string url)
{
    string strContent = "";
    WebResponse response = null;
    Stream stream = null;
    StreamReader reader = null;
    HttpWebRequest requestiid = null;
    try
    {
    requestiid = (HttpWebRequest)WebRequest.Create(url);
    requestiid.Timeout = 30000;
    response = requestiid.GetResponse();
    stream = response.GetResponseStream();
    reader = new StreamReader(stream, System.Text.Encoding.Default);
    strContent = reader.ReadToEnd().ToString();
    }
    catch (Exception ex)
    {
    //return null;
    }
    finally
    {
    if (reader != null) reader.Close();
    if (stream != null) stream.Close();
    if (response != null) response.Close();
    if (requestiid != null) requestiid.Abort();
    }
    return strContent;
}
Response.Write("http://a.com/1.js");

这样就可以用普通ajax方式读取1.aspx了

posted on 2013-03-01 15:04  狐狸v  阅读(521)  评论(0)    收藏  举报