更新時間:2021-07-01 15:50:44 來源:動力節點 瀏覽1298次
今天我們主要介紹ajax數據傳輸方式,結合實例形式較為詳細的分析總結了ajax數據傳輸的原理與傳輸文本、xml及json格式數據的具體實現技巧,具有一定參考借鑒價值,需要的朋友可以參考下:
(1)發送/接收數據:
Code is cheap.看代碼:
testJs.js
// 此函數等價于document.getElementById /document.all
function $(s) { if (document.getElementById) { return eval('document.getElementById("' + s + '")'); } else { return eval('document.all.' + s); } }
// 創建 XMLHttpRequest對象,以發送ajax請求
function createXMLHTTP() {
var xmlHttp = false;
var arrSignatures = ["MSXML2.XMLHTTP.5.0", "MSXML2.XMLHTTP.4.0",
"MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP",
"Microsoft.XMLHTTP"];
for (var i = 0; i < arrSignatures.length; i++) {
try {
xmlHttp = new ActiveXObject(arrSignatures[i]);
return xmlHttp;
}
catch (oError) {
xmlHttp = false; //ignore
}
}
// throw new Error("MSXML is not installed on your system.");
if (!xmlHttp && typeof XMLHttpRequest != 'undefined') {
xmlHttp = new XMLHttpRequest();
}
return xmlHttp;
}
var xmlReq = createXMLHTTP();
// 發送ajax處理請求(這里簡單驗證用戶名和密碼的有效性,默認正確的輸入:用戶名和密碼都是test)
function validatePwd(oTxt) {
var url = "/AjaxOperations.aspx";
xmlReq.open("post", url, true);
xmlReq.setRequestHeader("Content-Length", oTxt.value.length + $("txtUserName").value.length);
xmlReq.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xmlReq.onreadystatechange = callBack;
xmlReq.send("action=chkPwd&userInfos=" + escape(oTxt.value + "/" + $("txtUserName").value)); // 發送文本
}
function callBack() {
if (xmlReq.readyState == 4) {
if (xmlReq.status == 200) {
alert(xmlReq.responseText); // 接收文本
}
else if (xmlReq.status == 404) {
alert("Requested URL is not found.");
} else if (xmlReq.status == 403) {
alert("Access denied.");
} else
alert("status is " + xmlReq.status);
}
}
幾個附加文件源碼:
jsTest.htm
<html>
<head>
<title>js test</title>
<script src="js/testJs.js" type="text/javascript"></script>
</head>
<body>
<form id="form1">
<div>
用戶名:<input id="txtUserName" name="txtUserName" type="text" /> 密碼:<input id="txtPwd" name="txtPwd" type="password" onblur="validatePwd(this)" /></div>
</form>
</body>
</html>
AjaxOperations.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="AjaxOperations.aspx.cs" Inherits="WebTest2008.AjaxOperations" %>
AjaxOperations.aspx.cs
using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace WebTest2008
{
public partial class AjaxOperations : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!string.IsNullOrEmpty(Request["action"]) && Request["action"] == "chkPwd")
{
string responseTxt = "用戶名和密碼不匹配!";
string tempStr = Request["userInfos"];
/* 測試用 實際項目中可以對數據庫進行檢索等等相關操作,這里簡化了 */
if (tempStr.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries)[0] == "test" && tempStr.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries)[1] == "test")
{
responseTxt = "驗證通過!";
}
Response.Write(responseTxt);
}
}
}
}
一一保存文件,ctrl+F5,運行試試看吧。
上面這種方式是最簡單最直接也是最有效的方式。熟練使用最佳。
(1)發送XML數據
testJs.js
// 此函數等價于document.getElementById /document.all
function $(s) { if (document.getElementById) { return eval('document.getElementById("' + s + '")'); } else { return eval('document.all.' + s); } }
// 創建 XMLHttpRequest對象,以發送ajax請求
function createXMLHTTP() {
var xmlHttp = false;
var arrSignatures = ["MSXML2.XMLHTTP.5.0", "MSXML2.XMLHTTP.4.0",
"MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP",
"Microsoft.XMLHTTP"];
for (var i = 0; i < arrSignatures.length; i++) {
try {
xmlHttp = new ActiveXObject(arrSignatures[i]);
return xmlHttp;
}
catch (oError) {
xmlHttp = false; //ignore
}
}
// throw new Error("MSXML is not installed on your system.");
if (!xmlHttp && typeof XMLHttpRequest != 'undefined') {
xmlHttp = new XMLHttpRequest();
}
return xmlHttp;
}
var xmlReq = createXMLHTTP();
// 發送ajax處理請求(這里簡單驗證用戶名和密碼的有效性,默認正確的輸入:用戶名和密碼都是test)
function validatePwd(oTxt) {
var url = "/AjaxOperations.aspx?action=xmlOp";
var xmlStr = "<profile>" +
" <userName>" + escape($("txtUserName").value) + "</userName>" +
" <userPwd>" + escape($("txtPwd").value) + "</userPwd>" +
"</profile>";
xmlReq.open("post", url, true);
// Tell the server you're sending it XML
xmlReq.setRequestHeader("Content-Type", "text/xml"); // 這里注意
xmlReq.onreadystatechange = callBack;
xmlReq.send(xmlStr); // 發送XML
}
function callBack() {
if (xmlReq.readyState == 4) {
if (xmlReq.status == 200) {
alert(xmlReq.responseText); // 接收文本
}
else if (xmlReq.status == 404) {
alert("Requested URL is not found.");
} else if (xmlReq.status == 403) {
alert("Access denied.");
} else
alert("status is " + xmlReq.status);
}
}
jsTest.htm文件不變,AjaxOperations.aspx的HTML文件內容不變,服務器端.CS處理代碼如下:
AjaxOperations.aspx.cs
using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Xml;
namespace WebTest2008
{
public partial class AjaxOperations : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!string.IsNullOrEmpty(Request["action"]) && Request["action"] == "xmlOp") // 處理xml
{
XmlDocument doc = new XmlDocument();
try
{
doc.Load(Request.InputStream); //獲取xml數據(這里需要注意接受xml數據的方法)
}
catch (Exception ex)
{
throw ex;
}
string responseTxt = "";
string tempName = doc.SelectSingleNode("profile/userName").InnerText;
string tempPwd = doc.SelectSingleNode("profile/userPwd").InnerText;
if (tempName == "test" && tempPwd == "test")
{
responseTxt = "驗證通過!";
}
else responseTxt = "驗證失?。?;
Response.Write(responseTxt); // 寫文本
}
}
}
}
很簡單的代碼,運行看看吧。
(2)接收XML數據:
我們看到,上面兩個.js文件里處理返回數據時都用到了xmlReq.responseText的屬性,下面我們試試看xmlReq.responseXML屬性:
testJs.js
// 此函數等價于document.getElementById /document.all
function $(s) { if (document.getElementById) { return eval('document.getElementById("' + s + '")'); } else { return eval('document.all.' + s); } }
// 創建 XMLHttpRequest對象,以發送ajax請求
function createXMLHTTP() {
var xmlHttp = false;
var arrSignatures = ["MSXML2.XMLHTTP.5.0", "MSXML2.XMLHTTP.4.0",
"MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP",
"Microsoft.XMLHTTP"];
for (var i = 0; i < arrSignatures.length; i++) {
try {
xmlHttp = new ActiveXObject(arrSignatures[i]);
return xmlHttp;
}
catch (oError) {
xmlHttp = false; //ignore
}
}
// throw new Error("MSXML is not installed on your system.");
if (!xmlHttp && typeof XMLHttpRequest != 'undefined') {
xmlHttp = new XMLHttpRequest();
}
return xmlHttp;
}
var xmlReq = createXMLHTTP();
// 發送ajax處理請求(這里簡單驗證用戶名和密碼的有效性,默認正確的輸入:用戶名和密碼都是test)
function validatePwd(oTxt) {
var url = "/AjaxOperations.aspx?action=xmlOp";
var xmlStr = "<profile>" +
" <userName>" + escape($("txtUserName").value) + "</userName>" +
" <userPwd>" + escape($("txtPwd").value) + "</userPwd>" +
"</profile>";
xmlReq.open("post", url, true);
// Tell the server you're sending it XML
xmlReq.setRequestHeader("Content-Type", "text/xml");
xmlReq.onreadystatechange = callBack;
xmlReq.send(xmlStr); // 發送XML
}
function callBack() {
if (xmlReq.readyState == 4) {
if (xmlReq.status == 200) {
var xmlDoc = xmlReq.responseXML; // 接收XML
// var nodes = xmlDoc.childNodes;
// alert("文件根標簽的名稱: " + xmlDoc.documentElement.tagName);
// alert("根元素共有子節點個數: " + xmlDoc.documentElement.childNodes.length);
alert(xmlDoc.documentElement.childNodes(0).text);
}
else if (xmlReq.status == 404) {
alert("Requested URL is not found.");
} else if (xmlReq.status == 403) {
alert("Access denied.");
} else
alert("status is " + xmlReq.status);
}
}
同樣,jsTest.htm文件不變,AjaxOperations.aspx的HTML文件內容不變,服務器端.CS處理代碼稍作修改如下:
using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Xml;
namespace WebTest2008
{
public partial class AjaxOperations : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!string.IsNullOrEmpty(Request["action"]) && Request["action"] == "xmlOp") // 處理xml
{
XmlDocument doc = new XmlDocument();
try
{
doc.Load(Request.InputStream); //獲取xml數據
}
catch (Exception ex)
{
throw ex;
}
string responseXmlTxt = "";
string tempName = doc.SelectSingleNode("profile/userName").InnerText;
string tempPwd = doc.SelectSingleNode("profile/userPwd").InnerText;
if (tempName == "test" && tempPwd == "test")
{
responseXmlTxt = "<?xml version=\"1.0\" encoding=\"utf-8\" ?> <msg>驗證通過!</msg>"; // 測試用,簡單的xml文件
}
else responseXmlTxt = "<?xml version=\"1.0\" encoding=\"utf-8\" ?><msg>驗證失??!</msg>";
Response.ContentType = ("text/xml;charset=UTF-8"); // 這里必須要設置,否則客戶端接收不到這里寫好的xml文件
Response.Write(responseXmlTxt); // 寫xml
Response.End();
}
}
}
}
好了,前面兩種方法是大家平時開發中比較熟悉的方式,下面我們來看看第三種方式。
(3)JSON方式
json的準備知識:
json是一種簡單的數據格式,比xml更輕巧。json是JavaScript的原生格式,這意味著在JavaScript中處理json格式的數據不需要任何特殊的API或工具包。json的語法規則其實很簡單:對象是一個無序的“‘名稱/值'對”集合。一個對象以“{”(左括號)開始,“}”(右括號)結束。每個“名稱”后跟一個“:”(冒號);“‘名稱/值'對”之間使用“,”(逗號)分隔。看個例子先:
function testJson() {
//定義一個user(json的格式,其實就是定義一個js函數(變量)的方式而已)
var user =
{
"username": "jeff wong",
"age": 25,
"info": { "tel": "12345678", "cellphone": "13312345678" },
"address": // 數組
[
{ "city": "beijing", "postcode": "101110" },
{ "city": "ny city", "postcode": "911119" }
]
}
alert(user.username);
alert(user.age);
alert(user.info.cellphone);
alert(user.address[0].city);
alert(user.address[0].postcode);
user.username = "xiao wang";
alert(user.username);
}
上面的定義方式看起來很簡單,但是如果字段眾多,命名方式混雜,出錯的概率大大增加,怎么辦?這時候你就會想到用程序的方式生成json數據。json提供了json.js包,專門提供了幾種常用的json處理函數下載下來 ,將其引入然后就可以簡單的使用object.toJSONString()轉換成json數據。看代碼:
function Car(maker, model, year, color) {
this.maker = maker;
this.model = model;
this.year = year;
this.color = color;
}
function testJson() {
var tempCar = new Car("VW", "S", 1999, "yellow");
alert(tempCar.toJSONString());
}
也可以使用eval或者parseJSON()方法來轉換json數據到object:
function testJson() {
var str = '{ "name": "jeff wong", "age": 25,"address":"beijing"}';
var tempObj = eval('(' + str + ')');
alert(tempObj.toJSONString()); //使用eval方法
var tempObj1 = str.parseJSON();
alert(tempObj1.toJSONString()); // 或者使用parseJSON()方法
}
關于json.js的學習,請參考網上其他資源,這里我不再贅述了。說了這么多,實踐環節開始了:
ajax利用json發送/接收數據:
// 此函數等價于document.getElementById /document.all
function $(s) { if (document.getElementById) { return eval('document.getElementById("' + s + '")'); } else { return eval('document.all.' + s); } }
// 創建 XMLHttpRequest對象,以發送ajax請求
function createXMLHTTP() {
var xmlHttp = false;
var arrSignatures = ["MSXML2.XMLHTTP.5.0", "MSXML2.XMLHTTP.4.0",
"MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP",
"Microsoft.XMLHTTP"];
for (var i = 0; i < arrSignatures.length; i++) {
try {
xmlHttp = new ActiveXObject(arrSignatures[i]);
return xmlHttp;
}
catch (oError) {
xmlHttp = false; //ignore
}
}
// throw new Error("MSXML is not installed on your system.");
if (!xmlHttp && typeof XMLHttpRequest != 'undefined') {
xmlHttp = new XMLHttpRequest();
}
return xmlHttp;
}
var xmlReq = createXMLHTTP();
// 發送ajax處理請求(這里簡單驗證用戶名和密碼的有效性,默認正確的輸入:用戶名和密碼都是test)
function validatePwd(oTxt) {
var url = "/AjaxOperations.aspx?action=jsonOp";
// JSON就只是文本,由于不需要特殊編碼而且每個服務器端腳本都能處理文本數據,所以可以輕松利用JSON并將其應用到服務器。
var str = '{ "userName":"' + $("txtUserName").value + '", "userPwd": "' + $("txtPwd").value + '"}';
var jsonStr = str.parseJSON().toJSONString(); // you're sending it JSON
xmlReq.open("post", url, true);
xmlReq.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xmlReq.onreadystatechange = callBack;
xmlReq.send("sendStr=" + jsonStr); // 發送JSON(在服務器上解釋JSON)
}
function callBack() {
if (xmlReq.readyState == 4) {
if (xmlReq.status == 200) {
var jsonStr = xmlReq.responseText.parseJSON().toJSONString(); //轉化為json數據
alert(jsonStr);
}
else if (xmlReq.status == 404) {
alert("Requested URL is not found.");
} else if (xmlReq.status == 403) {
alert("Access denied.");
} else
alert("status is " + xmlReq.status);
}
}
附加文件,AjaxOperations.aspx的html頁面沒有改變,AjaxOperations.aspx.cs代碼稍作調整如下:
using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace WebTest2008
{
public partial class AjaxOperations : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!string.IsNullOrEmpty(Request["action"]) && Request["action"] == "jsonOp") // 處理JSON
{
string responseJsonTxt = "";
string tempStr = Request["sendStr"].Trim(new char[] { '{', '}' }); // 在服務器上解釋JSON需要引用一個能夠轉化JSON的組件:Json.Net,這里簡單測試,略過Json.Net
if (tempStr.Split(new char[] { ',' })[0].Split(new char[] { ':' })[1] == "\"test\"" && tempStr.Split(new char[] { ',' })[1].Split(new char[] { ':' })[1] == "\"test\"")
{
responseJsonTxt = "{\"msg\":\"驗證通過!\"}"; // 測試用
}
else responseJsonTxt = "{\"msg\":\"驗證失??!\"}";
Response.Write(responseJsonTxt);
Response.End();
}
}
jsTest.html引入json.js文件(必須下載json.js文件,否則js報錯),如下:
<html>
<head>
<title>js test</title>
<script src="js/json.js" type="text/javascript"></script>
<script src="js/testJs.js" type="text/javascript"></script>
</head>
<body>
<form id="form1">
<div>
用戶名:<input id="txtUserName" name="txtUserName" type="text" />
密碼:<input id="txtPwd" name="txtPwd" type="password" onblur="validatePwd(this)" /></div>
</form>
</body>
</html>
以上就是動力節點小編介紹的"ajax數據的傳輸方法",希望對大家有幫助,想了解更多可查看AJAX教程,如有疑問,請在線咨詢,有專業老師隨時為您服務。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習