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

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

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

    李威 さぽている

    小說翻譯,日語相關轉移至http://blog.hjenglish.com/liwei

    JSONP 跨域原理小解

    最近看一些代碼時,邊看邊改代碼,發現getJSON這個方法沒法正常使用。

    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

    究其原因,發現url里有個callback,這里使用的是JSONP,一種跨域技術。
    網上搜了下JSONP,多數都是在講如何使用,而沒有說明為什么它能跨域,且沒有說明url服務器端的代碼時如何生成的。
    http://www.west-wind.com/weblog/posts/2007/Jul/04/JSONP-for-crosssite-Callbacks
    這方面,上面的文章里有比較詳細的描述。

     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代碼會有如上的操作,代碼不難,很容易理解,也就是加了一個script標簽。

    而服務器端會返回
    callbackFunction( { "x": 10, "y": 15} );
    這樣的數據。這其實是一段javascript代碼,
    callbackFunction是方法名,
    { "x": 10, "y": 15}是參數。客戶端代碼里必須要有
    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 }

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

    最后JQuery會調用匿名函數
    function(data),data即為json數據。

    JQuery已經將客戶端部分實現了,服務器端也得遵循同樣的規則才能實現跨域。


    *這里有一點,JQuery如何將匿名函數換名字的?有哪位大俠知道的,請用簡單的語言講解下。

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


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 亚洲精品日韩专区silk | 亚洲免费视频网站| 国产午夜亚洲精品国产成人小说| 亚洲一本到无码av中文字幕| 成年女人色毛片免费看| 亚洲日韩亚洲另类激情文学| 国内一级一级毛片a免费| 亚洲人成网站在线在线观看| 免费毛片在线播放| 国产精品亚洲色婷婷99久久精品| 日韩免费高清视频网站| 青青草97国产精品免费观看| 亚洲中文字幕视频国产| 两个人看的www免费视频中文| 亚洲国产成人高清在线观看 | 久久精品国产亚洲av麻豆图片| 大学生一级毛片免费看| 无码色偷偷亚洲国内自拍| 亚洲欧洲中文日韩av乱码| 中文字幕免费在线看电影大全| 亚洲AV日韩AV永久无码久久| 黄色网址免费观看| 色噜噜噜噜亚洲第一| 久久久久久A亚洲欧洲AV冫| 无码囯产精品一区二区免费| 欧洲 亚洲 国产图片综合| 免费人成网站在线播放| 丁香花在线视频观看免费| 亚洲一本之道高清乱码| 免费人成在线观看网站品爱网日本 | 色欲国产麻豆一精品一AV一免费| 亚洲ts人妖网站| 亚洲VA综合VA国产产VA中| 久久er国产精品免费观看2| 亚洲一区精彩视频| 国产av无码专区亚洲av果冻传媒| 91香焦国产线观看看免费| 亚洲AV综合色区无码一二三区| 亚洲欧洲日产国码无码久久99| 噼里啪啦免费观看高清动漫4| 男女交性无遮挡免费视频|