關(guān)于JSONP的概念以及為什么要使用JSONP您可以參考JSONP教程,本文的重點(diǎn)在于演示下在JQUERY中的Ajax方法怎樣通過(guò)JSONP進(jìn)行遠(yuǎn)程調(diào)用。
首先介紹下$.ajax的參數(shù):
服務(wù)器端我們采用MVC的ACTION來(lái)返回?cái)?shù)據(jù)
public class HomeController : Controller
{
//
// GET: /Home/
public ActionResult Index()
{
returnView();
}
public ActionResult ReturnJson()
{
string callback = Request.QueryString["callback"];
string json = "{'name':'張三','age':'20'}";
string result = string.Format("{0}({1})", callback, json);
returnContent(result);
}
}
客戶(hù)端使用jsonp來(lái)傳輸數(shù)據(jù)
@{ ViewBag.Title = "Index"; Layout = "~/Views/Shared/_Layout.cshtml"; }
<script src="~/Scripts/jquery-1.7.1.min.js"type="text/javascript"> </script>
<script type="text/javascript">
functionSendData()
{
$.ajax({
type: "get",
async: false,
url: "/home/ReturnJson",
dataType: "jsonp",
success: function(data){
alert(data.name);
},
error: function(){
alert('fail');
}
});
}
</script>
<input type="button" value="提交" onclick="SendData();"/>
點(diǎn)擊提交按鈕后,發(fā)現(xiàn)服務(wù)器端的Request.QueryString["callback"]返回一個(gè)隨機(jī)函數(shù)名。這樣就被設(shè)置成JSONP格式來(lái)傳遞數(shù)據(jù)了
可以在傳遞過(guò)程中自定義函數(shù)名,只要使用jsonpCallback參數(shù)就可以了。
<script type="text/javascript">
functionSendData() {
$.ajax({
type: "get",
async: false,
url: "/home/ReturnJson",
dataType: "jsonp",
jsonp: "callback",//傳遞給請(qǐng)求處理程序或頁(yè)面的,用以獲得jsonp回調(diào)函數(shù)名的參數(shù)名(一般默認(rèn)為:callback)
jsonpCallback: "receive",//自定義的jsonp回調(diào)函數(shù)名稱(chēng),默認(rèn)為jQuery自動(dòng)生成的隨機(jī)函數(shù)名,也可以寫(xiě)"?",jQuery會(huì)自動(dòng)為你處理數(shù)據(jù)
success: function(data) {
alert(data.name);
},
error: function() {
alert('fail');
}
});
}
functionreceive(data) {
alert(data.age);
}
</script>
Add1: 使用AJAX訪問(wèn)aspx頁(yè)面和asmx使用方法是一樣的,區(qū)別在于aspx頁(yè)面中的方法必須為靜態(tài)方法,而asmx不需要.
1.新建demo.aspx頁(yè)面。
2.首先在該頁(yè)面的后臺(tái)文件demos.aspx.cs中添加引用。
using System.Web.Services;
3.無(wú)參數(shù)的方法調(diào)用.
大家注意了,這個(gè)版本不能低于.net framework 2.0。2.0已下不支持的。后臺(tái)代碼:
[WebMethod] public static string SayHello() { //一定是要靜態(tài)方法,并且聲明為[WebMethod] 前端才可以訪問(wèn) return "Hello Ajax!";
JS代碼:
$(function() { $("#btnOK").click(function() { $.ajax({ //要用post方式 type: "Post", //方法所在頁(yè)面和方法名 url: "Demo.aspx/SayHello", //沒(méi)有參數(shù)也一定要傳一個(gè)空參數(shù) data: "{}", contentType: "application/json; charset=utf-8", dataType: "json", success: function(data) { //返回的數(shù)據(jù)用data.d獲取內(nèi)容 alert(data.d); }, error: function(err) { alert(err); } }); //禁用按鈕的提交 return false; }); });
頁(yè)面代碼:
<form id="form1" runat="server"> <div> <%--<asp:Button ID="btnOK" runat="server" Text="驗(yàn)證用戶(hù)" />--%> <%--因?yàn)槭钱惒剑灾荒苁褂胔tml,上面的服務(wù)器控件是錯(cuò)誤的 可以測(cè)試下--%> <input id="btnOK" type="button" value="button" /> </div> </form>
運(yùn)行效果如下:
3.有參數(shù)方法調(diào)用后臺(tái)代碼:
[WebMethod] public static string GetStr(string str, string str2) { return str + str2; }
JS代碼:
$(function() { $("#btnOK").click(function() { $.ajax({ type: "Post", url: "demo.aspx/GetStr", //方法傳參的寫(xiě)法一定要對(duì),str為形參的名字,str2為第二個(gè)形參的名字 data: "{'str':'我是','str2':'XXX'}", contentType: "application/json; charset=utf-8", dataType: "json", success: function(data) { //返回的數(shù)據(jù)用data.d獲取內(nèi)容 alert(data.d); }, error: function(err) { alert(err); } }); //禁用按鈕的提交 return false; }); });
運(yùn)行效果如下:
4.返回?cái)?shù)組方法
后臺(tái)代碼:
[WebMethod] public static List<string> GetArray() { List<string> li = new List<string>(); for (int i = 0; i < 10; i++) li.Add(i + ""); return li; }
JS代碼:
$(function() { $("#btnOK").click(function() { $.ajax({ type: "Post", url: "demo.aspx/GetArray", contentType: "application/json; charset=utf-8", dataType: "json", success: function(data) { //插入前先清空ul $("#list").html(""); //遞歸獲取數(shù)據(jù) $(data.d).each(function() { //插入結(jié)果到li里面 $("#list").append("<li>" + this + "</li>"); }); alert(data.d); }, error: function(err) { alert(err); } }); //禁用按鈕的提交 return false; }); });
頁(yè)面代碼:
<form id="form1" runat="server">
<div>
<asp:Button ID="btnOK" runat="server" Text="驗(yàn)證用戶(hù)" />
</div>
<ul id="list">
</ul>
</form>
運(yùn)行結(jié)果圖:
下面是Jquery中AJAX參數(shù)詳細(xì)列表:
參數(shù)名 | 類(lèi)型 | 描述 |
url | String | (默認(rèn): 當(dāng)前頁(yè)地址) 發(fā)送請(qǐng)求的地址。 |
type | String | (默認(rèn): "GET") 請(qǐng)求方式 ("POST" 或 "GET"), 默認(rèn)為 "GET"。注意:其它 HTTP 請(qǐng)求方法,如 PUT 和 DELETE 也可以使用,但僅部分瀏覽器支持。 |
timeout | Number | 設(shè)置請(qǐng)求超時(shí)時(shí)間(毫秒)。此設(shè)置將覆蓋全局設(shè)置。 |
async | Boolean | (默認(rèn): true) 默認(rèn)設(shè)置下,所有請(qǐng)求均為異步請(qǐng)求。如果需要發(fā)送同步請(qǐng)求,請(qǐng)將此選項(xiàng)設(shè)置為 false。注意,同步請(qǐng)求將鎖住瀏覽器,用戶(hù)其它操作必須等待請(qǐng)求完成才可以執(zhí)行。 |
beforeSend | Function | 發(fā)送請(qǐng)求前可修改 XMLHttpRequest 對(duì)象的函數(shù),如添加自定義 HTTP 頭。XMLHttpRequest 對(duì)象是唯一的參數(shù)。
function (XMLHttpRequest) { this; // the options for this ajax request } |
cache | Boolean | (默認(rèn): true) jQuery 1.2 新功能,設(shè)置為 false 將不會(huì)從瀏覽器緩存中加載請(qǐng)求信息。 |
complete | Function | 請(qǐng)求完成后回調(diào)函數(shù) (請(qǐng)求成功或失敗時(shí)均調(diào)用)。參數(shù): XMLHttpRequest 對(duì)象,成功信息字符串。
function (XMLHttpRequest, textStatus) { this; // the options for this ajax request } |
contentType | String | (默認(rèn): "application/x-www-form-urlencoded") 發(fā)送信息至服務(wù)器時(shí)內(nèi)容編碼類(lèi)型。默認(rèn)值適合大多數(shù)應(yīng)用場(chǎng)合。 |
data | Object,
String |
發(fā) 送到服務(wù)器的數(shù)據(jù)。將自動(dòng)轉(zhuǎn)換為請(qǐng)求字符串格式。GET 請(qǐng)求中將附加在 URL 后。查看 processData 選項(xiàng)說(shuō)明以禁止此自動(dòng)轉(zhuǎn)換。必須為 Key/Value 格式。如果為數(shù)組,jQuery 將自動(dòng)為不同值對(duì)應(yīng)同一個(gè)名稱(chēng)。如 {foo:["bar1", "bar2"]} 轉(zhuǎn)換為 '&foo=bar1&foo=bar2'。 |
dataType | String |
預(yù)期服務(wù)器返回的數(shù)據(jù)類(lèi)型。如果不指定,jQuery 將自動(dòng)根據(jù) HTTP 包 MIME 信息返回 responseXML 或 responseText,并作為回調(diào)函數(shù)參數(shù)傳遞,可用值: "xml": 返回 XML 文檔,可用 jQuery 處理。 "html": 返回純文本 HTML 信息;包含 script 元素。 "script": 返回純文本 JavaScript 代碼。不會(huì)自動(dòng)緩存結(jié)果。 "json": 返回 JSON 數(shù)據(jù) 。 "jsonp": JSONP 格式。使用 JSONP 形式調(diào)用函數(shù)時(shí),如 "myurl?callback=?" jQuery 將自動(dòng)替換 ? 為正確的函數(shù)名,以執(zhí)行回調(diào)函數(shù)。 |
error | Function | (默認(rèn): 自動(dòng)判斷 (xml 或 html)) 請(qǐng)求失敗時(shí)將調(diào)用此方法。這個(gè)方法有三個(gè)參數(shù):XMLHttpRequest 對(duì)象,錯(cuò)誤信息,(可能)捕獲的錯(cuò)誤對(duì)象。
function (XMLHttpRequest, textStatus, errorThrown) { // 通常情況下textStatus和errorThown只有其中一個(gè)有值 this; // the options for this ajax request } |
global | Boolean | (默認(rèn): true) 是否觸發(fā)全局 AJAX 事件。設(shè)置為 false 將不會(huì)觸發(fā)全局 AJAX 事件,如 ajaxStart 或 ajaxStop 。可用于控制不同的Ajax事件 |
ifModified | Boolean | (默認(rèn): false) 僅在服務(wù)器數(shù)據(jù)改變時(shí)獲取新數(shù)據(jù)。使用 HTTP 包 Last-Modified 頭信息判斷。 |
processData | Boolean | (默認(rèn): true) 默認(rèn)情況下,發(fā)送的數(shù)據(jù)將被轉(zhuǎn)換為對(duì)象(技術(shù)上講并非字符串) 以配合默認(rèn)內(nèi)容類(lèi)型 "application/x-www-form-urlencoded"。如果要發(fā)送 DOM 樹(shù)信息或其它不希望轉(zhuǎn)換的信息,請(qǐng)?jiān)O(shè)置為 false。 |
success | Function | 請(qǐng)求成功后回調(diào)函數(shù)。這個(gè)方法有兩個(gè)參數(shù):服務(wù)器返回?cái)?shù)據(jù),返回狀態(tài)
function (data, textStatus) { // data could be xmlDoc, jsonObj, html, text, etc... this; // the options for this ajax request } |
代碼:
$(document).ready(function() {
jQuery("#clearCac").click(function() {
jQuery.ajax({
url: "/Handle/Do.aspx",
type: "post",
data: { id: '0' },
dataType: "json",
success: function(msg) {
alert(msg);
},
error: function(XMLHttpRequest, textStatus, errorThrown) {
alert(XMLHttpRequest.status);
alert(XMLHttpRequest.readyState);
alert(textStatus);
},
complete: function(XMLHttpRequest, textStatus) {
this; // 調(diào)用本次AJAX請(qǐng)求時(shí)傳遞的options參數(shù)
}
});
});
});
一、error:function (XMLHttpRequest, textStatus, errorThrown) { }
(默 認(rèn): 自動(dòng)判斷 (xml 或 html)) 請(qǐng)求失敗時(shí)調(diào)用時(shí)間。參數(shù)有以下三個(gè):XMLHttpRequest 對(duì)象、錯(cuò)誤信息、(可選)捕獲的錯(cuò)誤對(duì)象。如果發(fā)生了錯(cuò)誤,錯(cuò)誤信息(第二個(gè)參數(shù))除了得到null之外,還可能是"timeout", "error", "notmodified" 和 "parsererror"。
textStatus:
"timeout", "error", "notmodified" 和 "parsererror"。
二、error事件返回的第一個(gè)參數(shù)XMLHttpRequest有一些有用的信息:
XMLHttpRequest.readyState:
狀態(tài)碼
0 - (未初始化)還沒(méi)有調(diào)用send()方法
1 - (載入)已調(diào)用send()方法,正在發(fā)送請(qǐng)求
2 - (載入完成)send()方法執(zhí)行完成,已經(jīng)接收到全部響應(yīng)內(nèi)容
3 - (交互)正在解析響應(yīng)內(nèi)容
4 - (完成)響應(yīng)內(nèi)容解析完成,可以在客戶(hù)端調(diào)用了
三、data:"{}", data為空也一定要傳"{}";不然返回的是xml格式的。并提示parsererror.
四、parsererror的異常和Header 類(lèi)型也有關(guān)系。及編碼header('Content-type: text/html; charset=utf8');
五、XMLHttpRequest.status:
更多建議: