<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    李威 さぽている

    小說(shuō)翻譯,日語(yǔ)相關(guān)轉(zhuǎn)移至http://blog.hjenglish.com/liwei

    JSONP 跨域原理小解

    最近看一些代碼時(shí),邊看邊改代碼,發(fā)現(xiàn)getJSON這個(gè)方法沒(méi)法正常使用。

    1 var sURL= "http://api.xxxxxx.com/services/feeds/   
    2    xxxxxxx?format=json&callback=?";
    3 $.getJSON(sURL, function(data) {
    4 // do something with the JSON data returned
    5 }); // end get

    究其原因,發(fā)現(xiàn)url里有個(gè)callback,這里使用的是JSONP,一種跨域技術(shù)。
    網(wǎng)上搜了下JSONP,多數(shù)都是在講如何使用,而沒(méi)有說(shuō)明為什么它能跨域,且沒(méi)有說(shuō)明url服務(wù)器端的代碼時(shí)如何生成的。
    http://www.west-wind.com/weblog/posts/2007/Jul/04/JSONP-for-crosssite-Callbacks
    這方面,上面的文章里有比較詳細(xì)的描述。

     1 function jsonp(url,callback,name, query)
     2 {                
     3     if (url.indexOf("?"> -1)
     4         url += "&jsonp=" 
     5     else
     6         url += "?jsonp=" 
     7     url += name + "&";
     8     if (query)
     9         url += encodeURIComponent(query) + "&";   
    10     url += new Date().getTime().toString(); // prevent caching        
    11     
    12     var script = document.createElement("script");        
    13     script.setAttribute("src",url);
    14     script.setAttribute("type","text/javascript");                
    15     document.body.appendChild(script);
    16 }

    客戶端的javascript代碼會(huì)有如上的操作,代碼不難,很容易理解,也就是加了一個(gè)script標(biāo)簽。

    而服務(wù)器端會(huì)返回
    callbackFunction( { "x": 10, "y": 15} );
    這樣的數(shù)據(jù)。這其實(shí)是一段javascript代碼,
    callbackFunction是方法名,
    { "x": 10, "y": 15}是參數(shù)??蛻舳舜a里必須要有
    callbackFunction方法的定義。

     1 public partial class JSONP : System.Web.UI.Page
     2 {
     3     protected void Page_Load(object sender, EventArgs e)
     4     {
     5         if (!string.IsNullOrEmpty(Request.QueryString["jsonp"]) )
     6             this.JsonPCallback();
     7     }
     8 
     9     public void JsonPCallback()
    10     {
    11         string Callback = Request.QueryString["jsonp"];
    12         if (!string.IsNullOrEmpty(Callback))
    13         {
    14             // *** Do whatever you need
    15             Response.Write(Callback + "( {\"x\":10 , \"y\":100} );");
    16         }
    17 
    18         Response.End();
    19     }
    20 }

    之后客戶端會(huì)調(diào)用callbackFunction
    使用JQuery的getJSON方法后,callback部分會(huì)變成如下形式。
    callback=jQuery1710461701650187642_1326201333794&_=1326201356534
    callbackFunction自然就是
    jQuery1710461701650187642_1326201333794部分了。
    返回來(lái)的數(shù)據(jù)也會(huì)是jQuery1710461701650187642_1326201333794( { "x": 10, "y": 15} ) 這種形式。

    最后JQuery會(huì)調(diào)用匿名函數(shù)
    function(data),data即為json數(shù)據(jù)。

    JQuery已經(jīng)將客戶端部分實(shí)現(xiàn)了,服務(wù)器端也得遵循同樣的規(guī)則才能實(shí)現(xiàn)跨域。


    *這里有一點(diǎn),JQuery如何將匿名函數(shù)換名字的?有哪位大俠知道的,請(qǐng)用簡(jiǎn)單的語(yǔ)言講解下。

    posted on 2012-01-10 21:30 李威 閱讀(353) 評(píng)論(0)  編輯  收藏


    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 亚洲一区二区三区免费观看| 亚洲AV无码一区二区三区牲色 | 亚洲成人福利网站| 日本一道本不卡免费| 亚洲国产成人一区二区精品区| 亚洲一级毛片在线观| 亚洲中文字幕乱码一区| 夜夜爽妓女8888视频免费观看| 免费人成网站在线播放| 国产精品亚洲一区二区三区| 无码国产亚洲日韩国精品视频一区二区三区 | 人人狠狠综合久久亚洲88| 日韩电影免费在线观看| 亚洲国产午夜电影在线入口| 国语成本人片免费av无码| 亚洲成AV人片在WWW| 久久久久免费看黄a级试看| 国产真实伦在线视频免费观看| 亚洲AV电影天堂男人的天堂| 四虎精品亚洲一区二区三区| 国产免费A∨在线播放| 亚洲AV无码久久精品蜜桃| www视频免费看| 久久亚洲精品高潮综合色a片| 亚洲日韩人妻第一页| 日韩中文字幕免费视频| 精品日韩99亚洲的在线发布| 免费大学生国产在线观看p| 免费网站观看WWW在线观看| 亚洲免费观看在线视频| 免费一级毛片在线播放不收费| 成人免费777777被爆出| 亚洲校园春色小说| 亚洲А∨精品天堂在线| 三年片在线观看免费观看大全一| 亚洲激情视频图片| 最新国产AV无码专区亚洲| 国产精品爱啪在线线免费观看| 亚洲成年人在线观看| 高清国语自产拍免费视频国产| 国产无遮挡又黄又爽免费网站|