这篇文章主要介绍了ajax数据传输方式,结合实例形式较为详细的分析总结了ajax数据传输的原理与传输文本、xml及json格式数据的具体实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
本文实例讲述了ajax数据传输方式。分享给大家供大家参考,具体如下:
在异步应用程序中发送和接收信息时,常见的可以选择以纯文本和xml作为数据格式(可参考《jquery学习笔记之ajax用法实例详解》),现在还有一种比较流行的方式:json(javascript object notation)。好了,下面举例说明这三种数据格式在ajax的异步应用。
一、纯文本方式
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">
<p>
用户名:<input id="txtusername" name="txtusername" type="text" /> 密码:<input id="txtpwd" name="txtpwd" type="password" onblur="validatepwd(this)" /></p>
</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,运行试试看吧。
上面这种方式是最简单最直接也是最有效的方式。熟练使用最佳。
二、xml方式
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();
}
}
}
}
好了,前面两种方法是大家平时开发中比较熟悉的方式,下面我们来看看第三种方式。
三、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处理函数。下载下来,(json.js点击此处本站下载。) ,将其引入然后就可以简单的使用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">
<p>
用户名:<input id="txtusername" name="txtusername" type="text" />
密码:<input id="txtpwd" name="txtpwd" type="password" onblur="validatepwd(this)" /></p>
</form>
</body>
</html>
上面是我整理给大家的,希望今后会对大家有帮助。
相关文章:
基于ajax的简单搜索实现方法
js与jquery终止正在发送的ajax请求的方法
ajax调用中ie缓存问题解决方法
以上就是ajax数据传输方式实例详解的详细内容。