AJAX客户端说明,XMLHttpRequest对象
程序员文章站
2022-07-02 16:55:21
在communityserver中运用了自己的ajax机制,没有借助其他的辅助控件。其中客户的xmlhttprequest对象的封装,就足以让人大饱眼福,在一般的浏览器其都...
在communityserver中运用了自己的ajax机制,没有借助其他的辅助控件。其中客户的xmlhttprequest对象的封装,就足以让人大饱眼福,在一般的浏览器其都能够运行ajax。下面我们来学习学习这个咚咚,希望能给更多的人带来帮助。
首先当然是要了解一下浏览器中的xmlhttp对象了:
xmlhttp方法:
备注:客户机可以使用xmlhttp对象发送任意的http请求,接受http应答,还可以对应答的xml文档进行解析。
open方法:初始化一个msxml2.xmlhttp请求,指定http请求方式、url以及鉴定信息。
语法:
open( bstrmethod, bstrurl, varasync, bstruser, bstrpassword )
参数介绍:
bstrmethod: 数据传送方式,即get或post。
bstrurl: 服务网页的url。
varasync: 是否同步执行。缺省为true,即同步执行,但只能在dom中实施同步执行。用中一般将其置为false,即异步执行。
bstruser: 用户名,可省略。
bstrpassword:用户口令,可省略。
send方法:发送http请求到服务器,返回应答。
语法:
oxmlhttprequest.send(varbody)
说明:此方法是否同步取决于open方法的varasync参数。如果设为true则为同步,调用立刻返回,如果设为false调用直到整个应答被接收了才返回。
setrequestheader( bstrheader, bstrvalue )
bstrheader:http 头(header)
bstrvalue: http 头(header)的值
如果open方法定义为post,可以定义表单方式上传:
xmlhttp.setrequestheader( "content-type", "application/x-www-form-urlencoded")
xmlhttp属性:
onreadystatechange:在同步执行方式下获得返回结果的事件句柄。只能在dom中调用。
responsebody: 结果返回为无符号整数数组。
responsestream: 结果返回为istream流。
responsetext : 结果返回为字符串。
responsexml: 结果返回为xml格式数据。
运用这个原理也可以做网络小偷程序,网络爬虫应该就是应用这个东西来完成的吧,不过我没有做过,可能在不久的将来会制作个来玩玩,这里我们最主要的是看看cs中是如何封装他的:
1//ajax start
2/**////<summary>
3///创建回调对象,如果存在window.xmlhttprequest()对象,则返回此对象,如果是ie则搜索msxml2.xmlhttp各个版本及microsoft.xmlhttp并创建对象返回。
4///</summary>
5function ajax_getxmlhttprequest() {
6 if (window.xmlhttprequest) {
7 return new xmlhttprequest();
8 } else {
9 if (window.ajax_xmlhttprequestprogid) {
return new activexobject(window.ajax_xmlhttprequestprogid);
} else {
var progids = ["msxml2.xmlhttp.5.0", "msxml2.xmlhttp.4.0", "msxml2.xmlhttp.3.0", "msxml2.xmlhttp", "microsoft.xmlhttp"];
for (var i = 0; i < progids.length; ++i) {
var progid = progids[i];
try {
var x = new activexobject(progid);
window.ajax_xmlhttprequestprogid = progid;
return x;
} catch (e) {
}
}
}
}
return null;
}
/**////<summary>
///ajax回调。
///</summary>
///<param name="type">调用服务端函数所在的类包括命名空间(如:nexplus.controls.siteheader)。</param>
///<param name="id">客户端所对应的标记的id(如:<div id="id"></div>)。</param>
///<param name="method">服务端(方法)函数名称(被ajaxmethod标记)。</param>
///<param name="args">传到服务器的字符串。</param>
///<param name="clientcallback">同步或异步回调。</param>
///<param name="debugrequesttext">调试/请求字符串。</param>
///<param name="debugresponsetext">调试/输出字符串。</param>
///<param name="debugerrors">调试的错误信息。</param>
///<param name="includecontrolvalueswithcallback">是否和控件及其值一起回调。</param>
///<param name="url">url地址。</param>
function ajax_callback(type, id, method, args, clientcallback, debugrequesttext, debugresponsetext, debugerrors, includecontrolvalueswithcallback, url) {
if (!url)
{
url = window.location.href;
url = url.replace(/\#.*$/, '');//去除url中标签部分,即"#"之后的字符串。
//加入参数ajax_callback并设为true,说明是ajax回调。
if (url.indexof('?') > -1)
url += "&ajax_callback=true";
else
{
if (url.substr(url.length - 1, 1) == "/")
url += "default.aspx";
url += "?ajax_callback=true";
}
}
var x = ajax_getxmlhttprequest();//取得xmlhttprequest对象。
var result = null;
if (!x) {
result = { "value":null, "error": "noxmlhttp"};
if (debugerrors) {
alert("error: " + result.error);
}
if (clientcallback) {
clientcallback(result);
}
return result;
}
x.open("post", url, clientcallback ? true : false);//以post方式打开对象,这样在服务端就可以用request.form获取参数。
x.setrequestheader("content-type", "application/x-www-form-urlencoded; charset=utf-8");
if (clientcallback) {
//如果同步,判断状态,输出错误消息。
x.onreadystatechange = function() {
var result = null;
if (x.readystate != 4) {
return;
}
if (debugresponsetext) {
alert(x.responsetext);
}
try
{
var result = eval("(" + x.responsetext + ")");
if (debugerrors && result.error) {
alert("error: " + result.error);
}
}
catch (err)
{
if (window.confirm('the following error occured while processing an ajax request: ' + err.message + '\n\nwould you like to see the response?'))
{
var w = window.open();
w.document.open('text/plain');
w.document.write(x.responsetext);
w.document.close();
}
result = new object();
result.error = 'an ajax error occured. the response is invalid.';
}
clientcallback(result);
}
}
var encodeddata = "ajax_callbacktype=" + type;
if (id) {
encodeddata += "&ajax_callbackid=" + id.split("$").join(":");
}
encodeddata += "&ajax_callbackmethod=" + method;
if (args) {
for (var i in args) {
encodeddata += "&ajax_callbackargument" + i + "=" + encodeuricomponent(args[i]);
}
}
//如果加入控件,则加入控件数据。
if (includecontrolvalueswithcallback && document.forms.length > 0) {
var form = document.forms[0];
for (var i = 0; i < form.length; ++i) {
var element = form.elements[i];
if (element.name) {
var elementvalue = null;
if (element.nodename == "input") {
var inputtype = element.getattribute("type").touppercase();
if (inputtype == "text" || inputtype == "password" || inputtype == "hidden") {
elementvalue = element.value;
} else if (inputtype == "checkbox" || inputtype == "radio") {
if (element.checked) {
elementvalue = element.value;
}
}
} else if (element.nodename == "select") {
elementvalue = element.value;
} else if (element.nodename == "textarea") {
elementvalue = element.value;
}
if (elementvalue) {
encodeddata += "&" + element.name + "=" + encodeuricomponent(elementvalue);
}
}
}
}
//如果是调试,则弹出发送的数据。
if (debugrequesttext) {
alert(encodeddata);
}
x.send(encodeddata);//向服务器发送数据。
if (!clientcallback) {
if (debugresponsetext) {
alert(x.responsetext);
}
result = eval("(" + x.responsetext + ")");
if (debugerrors && result.error) {
alert("error: " + result.error);
}
}
delete x;
return result;
}
//ajax end
其他的不用多说明了,看注释应该就差不多了,如果有不对的地方请批评指教,谢谢!
首先当然是要了解一下浏览器中的xmlhttp对象了:
xmlhttp方法:
备注:客户机可以使用xmlhttp对象发送任意的http请求,接受http应答,还可以对应答的xml文档进行解析。
open方法:初始化一个msxml2.xmlhttp请求,指定http请求方式、url以及鉴定信息。
语法:
open( bstrmethod, bstrurl, varasync, bstruser, bstrpassword )
参数介绍:
bstrmethod: 数据传送方式,即get或post。
bstrurl: 服务网页的url。
varasync: 是否同步执行。缺省为true,即同步执行,但只能在dom中实施同步执行。用中一般将其置为false,即异步执行。
bstruser: 用户名,可省略。
bstrpassword:用户口令,可省略。
send方法:发送http请求到服务器,返回应答。
语法:
oxmlhttprequest.send(varbody)
说明:此方法是否同步取决于open方法的varasync参数。如果设为true则为同步,调用立刻返回,如果设为false调用直到整个应答被接收了才返回。
setrequestheader( bstrheader, bstrvalue )
bstrheader:http 头(header)
bstrvalue: http 头(header)的值
如果open方法定义为post,可以定义表单方式上传:
xmlhttp.setrequestheader( "content-type", "application/x-www-form-urlencoded")
xmlhttp属性:
onreadystatechange:在同步执行方式下获得返回结果的事件句柄。只能在dom中调用。
responsebody: 结果返回为无符号整数数组。
responsestream: 结果返回为istream流。
responsetext : 结果返回为字符串。
responsexml: 结果返回为xml格式数据。
运用这个原理也可以做网络小偷程序,网络爬虫应该就是应用这个东西来完成的吧,不过我没有做过,可能在不久的将来会制作个来玩玩,这里我们最主要的是看看cs中是如何封装他的:
1//ajax start
2/**////<summary>
3///创建回调对象,如果存在window.xmlhttprequest()对象,则返回此对象,如果是ie则搜索msxml2.xmlhttp各个版本及microsoft.xmlhttp并创建对象返回。
4///</summary>
5function ajax_getxmlhttprequest() {
6 if (window.xmlhttprequest) {
7 return new xmlhttprequest();
8 } else {
9 if (window.ajax_xmlhttprequestprogid) {
return new activexobject(window.ajax_xmlhttprequestprogid);
} else {
var progids = ["msxml2.xmlhttp.5.0", "msxml2.xmlhttp.4.0", "msxml2.xmlhttp.3.0", "msxml2.xmlhttp", "microsoft.xmlhttp"];
for (var i = 0; i < progids.length; ++i) {
var progid = progids[i];
try {
var x = new activexobject(progid);
window.ajax_xmlhttprequestprogid = progid;
return x;
} catch (e) {
}
}
}
}
return null;
}
/**////<summary>
///ajax回调。
///</summary>
///<param name="type">调用服务端函数所在的类包括命名空间(如:nexplus.controls.siteheader)。</param>
///<param name="id">客户端所对应的标记的id(如:<div id="id"></div>)。</param>
///<param name="method">服务端(方法)函数名称(被ajaxmethod标记)。</param>
///<param name="args">传到服务器的字符串。</param>
///<param name="clientcallback">同步或异步回调。</param>
///<param name="debugrequesttext">调试/请求字符串。</param>
///<param name="debugresponsetext">调试/输出字符串。</param>
///<param name="debugerrors">调试的错误信息。</param>
///<param name="includecontrolvalueswithcallback">是否和控件及其值一起回调。</param>
///<param name="url">url地址。</param>
function ajax_callback(type, id, method, args, clientcallback, debugrequesttext, debugresponsetext, debugerrors, includecontrolvalueswithcallback, url) {
if (!url)
{
url = window.location.href;
url = url.replace(/\#.*$/, '');//去除url中标签部分,即"#"之后的字符串。
//加入参数ajax_callback并设为true,说明是ajax回调。
if (url.indexof('?') > -1)
url += "&ajax_callback=true";
else
{
if (url.substr(url.length - 1, 1) == "/")
url += "default.aspx";
url += "?ajax_callback=true";
}
}
var x = ajax_getxmlhttprequest();//取得xmlhttprequest对象。
var result = null;
if (!x) {
result = { "value":null, "error": "noxmlhttp"};
if (debugerrors) {
alert("error: " + result.error);
}
if (clientcallback) {
clientcallback(result);
}
return result;
}
x.open("post", url, clientcallback ? true : false);//以post方式打开对象,这样在服务端就可以用request.form获取参数。
x.setrequestheader("content-type", "application/x-www-form-urlencoded; charset=utf-8");
if (clientcallback) {
//如果同步,判断状态,输出错误消息。
x.onreadystatechange = function() {
var result = null;
if (x.readystate != 4) {
return;
}
if (debugresponsetext) {
alert(x.responsetext);
}
try
{
var result = eval("(" + x.responsetext + ")");
if (debugerrors && result.error) {
alert("error: " + result.error);
}
}
catch (err)
{
if (window.confirm('the following error occured while processing an ajax request: ' + err.message + '\n\nwould you like to see the response?'))
{
var w = window.open();
w.document.open('text/plain');
w.document.write(x.responsetext);
w.document.close();
}
result = new object();
result.error = 'an ajax error occured. the response is invalid.';
}
clientcallback(result);
}
}
var encodeddata = "ajax_callbacktype=" + type;
if (id) {
encodeddata += "&ajax_callbackid=" + id.split("$").join(":");
}
encodeddata += "&ajax_callbackmethod=" + method;
if (args) {
for (var i in args) {
encodeddata += "&ajax_callbackargument" + i + "=" + encodeuricomponent(args[i]);
}
}
//如果加入控件,则加入控件数据。
if (includecontrolvalueswithcallback && document.forms.length > 0) {
var form = document.forms[0];
for (var i = 0; i < form.length; ++i) {
var element = form.elements[i];
if (element.name) {
var elementvalue = null;
if (element.nodename == "input") {
var inputtype = element.getattribute("type").touppercase();
if (inputtype == "text" || inputtype == "password" || inputtype == "hidden") {
elementvalue = element.value;
} else if (inputtype == "checkbox" || inputtype == "radio") {
if (element.checked) {
elementvalue = element.value;
}
}
} else if (element.nodename == "select") {
elementvalue = element.value;
} else if (element.nodename == "textarea") {
elementvalue = element.value;
}
if (elementvalue) {
encodeddata += "&" + element.name + "=" + encodeuricomponent(elementvalue);
}
}
}
}
//如果是调试,则弹出发送的数据。
if (debugrequesttext) {
alert(encodeddata);
}
x.send(encodeddata);//向服务器发送数据。
if (!clientcallback) {
if (debugresponsetext) {
alert(x.responsetext);
}
result = eval("(" + x.responsetext + ")");
if (debugerrors && result.error) {
alert("error: " + result.error);
}
}
delete x;
return result;
}
//ajax end
其他的不用多说明了,看注释应该就差不多了,如果有不对的地方请批评指教,谢谢!
上一篇: Python入门基本语法
下一篇: JDK1.7 NIO.2 读写遍历文件树