我赞美你品格高尚,崇敬你洁白无瑕。我爱你、想你、盼你,像对每一个季节那样。我爱你、想你、盼你,不管世俗的偏见怎样厉害。冬――四季之一的冬,你来吧!我喜欢你纯净的身躯,喜欢你严厉的性格,我要在你的怀抱中锻炼、奋斗、成熟……你可以和春天的万花,夏天的麦浪,秋天的瓜果……比美!
在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/**////<summary>
3///创建回调对象,如果存在window.XMLHttpRequest()对象,则返回此对象,如果是IE则搜索Msxml2.XMLHTTP各个版本及Microsoft.XMLHTTP并创建对象返回。
4///</summary>
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;i<progIDs.length;++i){
varprogID=progIDs[i];
try{
varx=newActiveXObject(progID);
window.Ajax_XMLHttpRequestProgID=progID;
returnx;
}catch(e){
}
}
}
}
returnnull;
}
/**////<summary>
///Ajax回调。
///</summary>
///<paramname="type">调用服务端函数所在的类包括命名空间(如:NExplus.Controls.SiteHeader)。</param>
///<paramname="id">客户端所对应的标记的ID(如:<divid="ID"></div>)。</param>
///<paramname="method">服务端(方法)函数名称(被AjaxMethod标记)。</param>
///<paramname="args">传到服务器的字符串。</param>
///<paramname="clientCallBack">同步或异步回调。</param>
///<paramname="debugRequestText">调试/请求字符串。</param>
///<paramname="debugResponseText">调试/输出字符串。</param>
///<paramname="debugErrors">调试的错误信息。</param>
///<paramname="includeControlValuesWithCallBack">是否和控件及其值一起回调。</param>
///<paramname="url">Url地址。</param>
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+'\n\nWouldyouliketoseetheresponse?'))
{
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;i<form.length;++i){
varelement=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
其他的不用多说明了,看注释应该就差不多了,如果有不对的地方请批评指教,谢谢!
本文AJAX客户端说明,XMLHttpRequest对象到此结束。人活着就是为了解决困难。这才是生命的意义,也是生命的资料。逃避不是办法,知难而上往往是解决问题的最好手段。小编再次感谢大家对我们的支持!