原文地址:http://suchso.com/UIweb/jquery_ajax_kuayujiejue.html
最近開發中,設計到智能手機項目,給領導做幾個demo。主要是用jquery和jqeury mobile。
越來越發現jq jqm是太強大了。由衷的佩服開發和維護團隊。哈哈
在開發中,設計多個平台,其中我負責的管理中心,需要提供接口給網站B進行驗證和返回一堆html代碼。
為了盡量減少網站B的開發工作量,我想到了類似百度廣告聯盟、搜狗聯盟的引用js代碼的方式。
說干就干。
先學習一下搜狗聯盟的做法:
進入搜狗聯盟的獲取代碼:(為啥我能進去那?因為我有備案的網站了。www.360yi.net)
<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>
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解析類,大家可以看看: