欢迎来到福编程网,本站提供各种互联网专业知识!

AJAX客户端说明,XMLHttpRequest对象

发布时间:2007-01-07 作者: 来源:转载
在CommunityServer中运用了自己的AJAX机制,没有借助其他的辅助控件。其中客户的XMLHttpRequest对象的封装,就足以让人大饱眼福,在一般的浏览器其都能够运行AJAX。下面我们来学习学习这个咚咚,希望能给更多的人带来帮助。首先当然是要了解一下浏览器中的XML
在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//AjaxStart
2/**////


3///创建回调对象,如果存在window.XMLHttpRequest()对象,则返回此对象,如果是IE则搜索Msxml2.XMLHTTP各个版本及Microsoft.XMLHTTP并创建对象返回。
4///

5functionAjax_GetXMLHttpRequest(){
6if(window.XMLHttpRequest){
7returnnewXMLHttpRequest();
8}else{
9if(window.Ajax_XMLHttpRequestProgID){
returnnewActiveXObject(window.Ajax_XMLHttpRequestProgID);
}else{
varprogIDs=["Msxml2.XMLHTTP.5.0","Msxml2.XMLHTTP.4.0","MSXML2.XMLHTTP.3.0","MSXML2.XMLHTTP","Microsoft.XMLHTTP"];
for(vari=0;ivarprogID=progIDs[i];
try{
varx=newActiveXObject(progID);
window.Ajax_XMLHttpRequestProgID=progID;
returnx;
}catch(e){
}
}
}
}
returnnull;
}
/**////
///Ajax回调。
///

///调用服务端函数所在的类包括命名空间(如:NExplus.Controls.SiteHeader)。
///客户端所对应的标记的ID(如:
)。
///服务端(方法)函数名称(被AjaxMethod标记)。
///传到服务器的字符串。
///同步或异步回调。
///调试/请求字符串。
///调试/输出字符串。
///调试的错误信息。
///是否和控件及其值一起回调。
///Url地址。
functionAjax_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";
}
}

varx=Ajax_GetXMLHttpRequest();//取得XMLHttpRequest对象。
varresult=null;
if(!x){
result={"value":null,"error":"NOXMLHTTP"};
if(debugErrors){
alert("error:"+result.error);
}
if(clientCallBack){
clientCallBack(result);
}
returnresult;
}

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(){
varresult=null;

if(x.readyState!=4){
return;
}

if(debugResponseText){
alert(x.responseText);
}

try
{
varresult=eval("("+x.responseText+")");
if(debugErrors&&result.error){
alert("error:"+result.error);
}
}
catch(err)
{
if(window.confirm('ThefollowingerroroccuredwhileprocessinganAJAXrequest:'+err.message+'nnWouldyouliketoseetheresponse?'))
{
varw=window.open();
w.document.open('text/plain');
w.document.write(x.responseText);
w.document.close();
}

result=newObject();
result.error='AnAJAXerroroccured.Theresponseisinvalid.';
}

clientCallBack(result);
}
}
varencodedData="Ajax_CallBackType="+type;
if(id){
encodedData+="&Ajax_CallBackID="+id.split("$").join(":");
}
encodedData+="&Ajax_CallBackMethod="+method;
if(args){
for(variinargs){
encodedData+="&Ajax_CallBackArgument"+i+"="+encodeURIComponent(args[i]);
}
}
//如果加入控件,则加入控件数据。
if(includeControlValuesWithCallBack&&document.forms.length>0){
varform=document.forms[0];
for(vari=0;ivarelement=form.elements[i];
if(element.name){
varelementValue=null;
if(element.nodeName=="INPUT"){
varinputType=element.getAttribute("TYPE").toUpperCase();
if(inputType=="TEXT"||inputType=="PASSWORD"||inputType=="HIDDEN"){
elementValue=element.value;
}elseif(inputType=="CHECKBOX"||inputType=="RADIO"){
if(element.checked){
elementValue=element.value;
}
}
}elseif(element.nodeName=="SELECT"){
elementValue=element.value;
}elseif(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);
}
}
deletex;
returnresult;
}

//AjaxEnd
其他的不用多说明了,看注释应该就差不多了,如果有不对的地方请批评指教,谢谢!

相关推荐