(轉)jquery ajax使用及跨域訪問解決辦法


原文地址:http://suchso.com/UIweb/jquery_ajax_kuayujiejue.html

最近開發中,設計到智能手機項目,給領導做幾個demo。主要是用jquery和jqeury mobile。

越來越發現jq jqm是太強大了。由衷的佩服開發和維護團隊。哈哈
 
在開發中,設計多個平台,其中我負責的管理中心,需要提供接口給網站B進行驗證和返回一堆html代碼。
為了盡量減少網站B的開發工作量,我想到了類似百度廣告聯盟、搜狗聯盟的引用js代碼的方式。
說干就干。
 
先學習一下搜狗聯盟的做法:
<script type="text/javascript">
var sogou_ad_id=209344;
var sogou_ad_height=90;
var sogou_ad_width=728;
</script>
<script language='JavaScript' type='text/javascript' src='http://images.sohu.com/cs/jsfile/js/c.js'></script>
 
我們可以看到,明顯2塊代碼:
1.是全局變量,是確認網站的廣告編號、配置寬高。
2.廣告邏輯代碼
 
按照這個思路,我需要提供一個外鏈的js文件,而對於需要配置的參數,可以通過定義全局變量來實現(后來我自己做了參數分析,就不用全局變量了)。
 
小小的js文件背后,隱藏着很深的邏輯。
思路:
1.接收到調用方的參數數據,調用我的js函數處理((document).ready加載后默認處理);
2.(document).ready函數調用后台邏輯代碼。我后台是aspx的,所以做了一個Apsx頁面處理這個請求。
這里有個問題,讓我走了彎路。
js是不能跨域訪問的,歷史原因就悠久。
 
 

什么是跨域

JavaScript出於安全方面的考慮,不允許跨域調用其他頁面的對象。但在安全限制的同時也給注入iframe或是ajax應用上帶來了不少麻煩。首先什么是跨域,簡單地理解就是因為JavaScript同源策略的限制,a.com 域名下的js無法操作b.com或是c.a.com域名下的對象。

 
實現:
如果碰到什么問題,我們都會google一下(這里說一下,搜索技術問題,google最強的了,baidu就是浮雲了)。然后找代碼,下代碼,
博主不提供下載還得罵娘。唉,天下沒有免費的午餐,已經共享知識了,不要強求了。
 
jquery實現ajax訪問很多方式,同時也支持post和get,但是只有get方式才能實現跨域訪問。
 
Post方式代碼:
 
       $.ajax({
          //要用post方式     com_id=135
           type: "Post",
          //方法所在頁面和方法名    
           url: "http://localhost:3101/Image.aspx?id=" +s_id,
           contentType: "application/json; charset=utf-8" ,
           dataType: "json",
           data: "{s_id:'"+s_id+"'}" ,       //這里是要傳遞的參數,格式為 data: "{paraName:paraValue}",下面將會看到    
           success: function (data) {
              //返回的數據用data.d獲取內容    
              var adas = data.d;
               $( "#divShowtwo").html(adas );
           },
           error: function (err) {
               alert(err.toString);
           }
       });
 實現get方式 $.ajax函數也可以,jquery封裝的 $.getJSON函數更簡單一些。
  var AjaxUrl = "http://localhost:3101/Image.aspx?id=" +s_id+"&jsoncallback=?";
           $.getJSON(AjaxUrl, function (Json) {
               $( "#divShowtwo").html(Json.html);
             });

jQuery.getJSON( url, [data], [callback] ) 跨域加載JSON數據。

  • url: 發送請求的地址

  • data : (可選) 待發送key/value參數

  • callback: (可選) 載入成功時的回調函數

支持的時間和$.ajax是一樣的。
注意:jsoncallback=?為必須參數,其它參數可以正常URL傳參方式使用。例如 ?ID=23&Name=test&
 
后台代碼:
Image.aspx頁面要實現resposne一段json。
string jsoncallback = Request.QueryString[ "jsoncallback"];    
         Response.ContentEncoding = Encoding.UTF8;
         Response.ContentType = "application/json";  
        HttpContext.Current.Response.ContentType = "text/json" ;
      string rehtml = "" ;
      try
       {
          StringBuilder sb = new StringBuilder();
          if (id.Length > 0)
           {                
                  string imgurl = GetPicURL(model.QRcodeURL);
                   sb.Append( "<p>www.360yi.net</p>" );
                  rehtml = Cleaner(sb.ToString());
           }
       }
      catch (Exception ex)
       {
           rehtml = "";
       }
       Response.Write(jsoncallback + "({\"html\":\"" + rehtml + "\"})");
       Response.End();
 
注意:
服務端接口頁面
1、string jsoncallback = Request.QueryString["jsoncallback"]; 這個為必須獲取的參數
2、輸出是必須jsoncallback +輸出JSON串
 
Json傳遞html的處理:
json對<> / \ 等關鍵字是需要轉義的。這里大家都看到一個函數Cleaner()。就是實現json html轉義的。
 
    /// <summary>
  /// json html字符串轉義
  /// </summary>
  /// <param name="_s"></param>
  /// <returns></returns>
  public static string Cleaner( string _s)
   {
      if (_s == null ) return "";
       System.Text. StringBuilder sb = new System.Text.StringBuilder(_s);
       sb.Replace( @"\", @"\\" );
       sb.Replace( @"'", @"\'" );
       sb.Replace( @"""", @"\""" );
       sb.Replace( Environment.NewLine, @"\n" );   //替換連在一起的\r\n
       sb.Replace( "\n", @"\n" );               //單個替換
       sb.Replace( "\r", @"\n" );
      return sb.ToString();
   }
 
另外,C# json解析類,大家可以看看:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM