`
happmaoo
  • 浏览: 4348630 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Ajax的client部分(更健壮的代码)

阅读更多
Ajax的闪光点在于client端的JS能代表用户向server发出异步请求,主要是通过XMLHttpRequest对象实现的,
但精华点在于JS能够对server端的响应进行DOM或CSS操作,使得页面有更新,从而带来丰富的客户体验。

1. client端的精华点:
JS的DOM操作实现页面内容的更新;
JS的DOM、CSS操作实现页面外观和布局的更新;
<此部分的突破点在掌握JS的常用方法,及面向对象特性>

2. client端的核心,使用XMLHttpRequest对象(创建对象;发送异步请求;响应处理/回调函数;)
a) XMLHttpRequest的创建,考虑到浏览器的兼容性更好的代码如下:
//创建一个XMLHttpRequest对象
varxmlHttp=createXmlHttpRequestObject();
//如下函数创建一个XMLHttpRequest对象(安全可靠的)
functioncreateXmlHttpRequestObject()
...{
varxmlHttp;
//非IE
try
...{
xmlHttp
=newXMLHttpRequest();
}

catch(e)
...{
//IE的所有版本
varXmlHttpVersions=newArray("MSXML2.XMLHTTP.6.0","MSXML2.XMLHTTP.5.0","MSXML2.XMLHTTP.4.0","MSXML2.XMLHTTP.3.0","MSXML2.XMLHTTP","Microsoft.XMLHTTP");
for(vari=0;i<XmlHttpVersions.length&&!xmlHttp;i++)
...{
try
...{
xmlHttp
=newActiveXObject(XmlHttpVersions[i]);
}

catch(e)
...{}
}

}

if(!xmlHttp)
...{
alert(
"ErrorcreatingtheXMLHttpRequestObject.");
}

else
...{
returnxmlHttp;
}

}


b) 使用XMLHttpRequest对象发送异步请求:
//event-driven的异步请求
functionmouseon()
...{
if(xmlHttp)
...{
//如果XMLHttpRequest忙则不再向Server发送请求
if(!(xmlHttp.readyState==0||xmlHttp.readyState==4))
...{
alert(
"Cannotconnecttoserver,pleasetryagainlater.");
}

else
...{
try
...{
//open
xmlHttp.open("GET","serverTXT.txt",true);
//设置回调函数,一定要在send之前
xmlHttp.onreadystatechange=handleRequestStateChange;
//send,其中send的部分为消息体,如果是POST方式,需要将请求通过send发送到server端
xmlHttp.send(null);
}

catch(e)
...{
alert(
"Cannotconnecttoserver: "+e.toString());
}

}

}

}


c) 响应处理/回调函数:
//回调函数
functionhandleRequestStateChange()
...{
varshowDIV=document.getElementById("show");
if(xmlHttp.readyState==1)
...{
showDIV.innerHTML
+="Requeststatus:1(loading)<br/>";
}
elseif(xmlHttp.readyState==2)
...{
showDIV.innerHTML
+="Requeststatus:2(loaded)<br/>";
}
elseif(xmlHttp.readyState==3)
...{
showDIV.innerHTML
+="Requeststatus:3(interactive)<br/>";
}
elseif(xmlHttp.readyState==4)
...{
//server端状态为200(OK)
if(xmlHttp.status==200)
...{
try
...{
//获取server端的响应(repsonseText版)
response=xmlHttp.responseText;
showDIV.innerHTML
+="Requeststatus:4(complete).serversaid<br/>";
showDIV.innerHTML
+=response;
}

catch(e)
...{
alert(
"Errorreadingtheresponse:"+e.toString());
}

}

//server端状态不是200(OK)
else
...{
alert(
"Therewasaproblemretrievingthedata: "+xmlHttp.statusText);
}

}

}



3. responseText,responseXML
a) 解析XML文档的方法使用DOM或者XPath<更有效>

4. client端JS的错误及异常处理:
a) 各个浏览器抛出异常的方法不太一样(Firefox, opera, IE)
try{}catch(e){}结构
b) 针对不同浏览器捕获异常的方法
IE,通常可以通过点击浏览器左下角的JS错误查看JS异常;
FireFox,通常情况下是没有给出显示错误,需要查看Error console获得

c)以XML结构验证的方法显式地抛出异常

functionmouseout()
...{
if(xmlHttp)
...{
try
...{
//open
xmlHttp.open("GET","serverXML.xml",true);
//设置回调函数,一定要在send之前
xmlHttp.onreadystatechange=handleRequestStateChangeXML;
//send,其中send的部分为消息体,如果是POST方式,需要将请求通过send发送到server端
xmlHttp.send(null);
}

catch(e)
...{
alert(
"Cannotconnecttoserver: "+e.toString());
}

}

}


functionhandleRequestStateChangeXML()
...{
varshowDIV=document.getElementById("show");
if(xmlHttp.readyState==4)
...{
//server端状态为200(OK)
if(xmlHttp.status==200)
...{
try
...{
//获取server端的响应(responseXML版)
response_xml=xmlHttp.responseXML;

//捕获IE和Opera潜在的错误
if(!response_xml||!response_xml.documentElement)
...{
throw("InvalidXMLstructure: "+xmlHttp.responseText);
}

//捕获FireFox的潜在错误
varrootNodeName=response_xml.documentElement.nodeName;
if(rootNodeName=="parsererror")
...{
throw("InvalidXMLstructure: "+xmlHttp.responseText);
}


//确认了XML结构正确,下一步解析XML
xmlRoot=response_xml.documentElement;
personArray
=xmlRoot.getElementsByTagName("person");

showText
="";
for(vari=0;i<personArray.length;i++)
...{
showText
+=personArray.item(i).firstChild.data+"<br/>";
}


showDIV.innerHTML
+="Requeststatus:4(complete).serversaid<br/>";
showDIV.innerHTML
+=showText;
}

catch(e)
...{
alert(
"Errorreadingtheresponse:"+e.toString());
}

}

//server端状态不是200(OK)
else
...{
alert(
"Therewasaproblemretrievingthedata: "+xmlHttp.statusText);
}

}

}


5. JavaScript操作DOM很常见,下面举例一个JS操作CSS进行响应的例子

//主要是通过设置DOM元素的className属性为CSS文件中定义的style
functionsetStyle1()
...{
oDIV
=document.getElementById("content");
oDIV.className
="style1";
}


functionsetStyle2()
...{
oDIV
=document.getElementById("content");
oDIV.className
="style2";
}



分享到:
评论

相关推荐

    Ajax-bitbucket-api-client.java.zip

    Ajax-bitbucket-api-client.java.zip,Git为JavaSUM语言的Bit Sub®云的客户端API转换了源代码库。,ajax代表异步javascript和xml。它是多种web技术的集合,包括html、css、json、xml和javascript。它用于创建动态网页...

    JAVA上百实例源码以及开源项目

    Java源代码实现部分,比较有意思,也具参考性。像坐标控制、旋转矩阵、定时器、生成图像、数据初始化、矩阵乘法、坐标旋转、判断是否是顺时针方向排列、鼠标按下、放开时的动作等,都可在本源码中得以体现。 Java...

    JAVA上百实例源码以及开源项目源代码

    Java源代码实现部分,比较有意思,也具参考性。像坐标控制、旋转矩阵、定时器、生成图像、数据初始化、矩阵乘法、坐标旋转、判断是否是顺时针方向排列、鼠标按下、放开时的动作等,都可在本源码中得以体现。 Java...

    java源码包---java 源码 大量 实例

    Java源代码实现部分,比较有意思,也具参考性。像坐标控制、旋转矩阵、定时器、生成图像、数据初始化、矩阵乘法、坐标旋转、判断是否是顺时针方向排列、鼠标按下、放开时的动作等,都可在本源码中得以体现。 Java...

    java源码包2

    Java源代码实现部分,比较有意思,也具参考性。像坐标控制、旋转矩阵、定时器、生成图像、数据初始化、矩阵乘法、坐标旋转、判断是否是顺时针方向排列、鼠标按下、放开时的动作等,都可在本源码中得以体现。 Java...

    tic-tac-toe-client:连接到后端API的前端tic tac toe客户端,用于用户身份验证和游戏状态统计

    它使用在服务器上存储井字游戏的用户数据和游戏板详细信息,而所有游戏逻辑,用户身份验证形式和样式都通过我自己的代码在客户端本地处理。 现在播放! 您可以在以下位置现场玩游戏: : 使用的技术和方法 ...

    java开源包1

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    fastCSharp

    由于我个人基本上只有web开发经验,所以我贡献的代码部分包括web开发部分,没有桌面应用部分,其它的就靠大家贡献了。 代码贡献者请注意:为了解决部分桌面应用平台升级问题,这个项目决定兼容.net framework2.0。 ...

    jsLinb —— 一个不错误的js框架(兼容jQuery, prototype, mootools等其他框架)

    jsLINB是一个完全的浏览器端javascript解决方案,兼容大部分现代浏览器 (IE6.0/IE7.0/firefox1.5/firefox2.0/opera9/Safari2.0,Safari缺乏测试)。它可以帮助程序开发者实现各种类型的RIA应用-在提供更加强大框架的...

    微软最新基于SAAS的架构Crab(源代码+演示安装包+文档)

    作为微软最新的SaaS应用案例,Crab用到了大部分微软一些最新的技术,如:用 Asp.net ajax 1.0、web parts、themes对页面View进行优化,用WCF(Windows Communication Foundation)对Services进行封装,用WF(Windows ...

    asp.net知识库

    如何使数据库中的表更有弹性,更易于扩展 存储过程——天使还是魔鬼 如何获取MSSQLServer,Oracel,Access中的数据字典信息 C#中利用GetOleDbSchemaTable获取数据库内表信息[原创] 如何解决ACCESS中SELECT TOP语句竟然...

    java源码包3

    Java源代码实现部分,比较有意思,也具参考性。像坐标控制、旋转矩阵、定时器、生成图像、数据初始化、矩阵乘法、坐标旋转、判断是否是顺时针方向排列、鼠标按下、放开时的动作等,都可在本源码中得以体现。 Java...

    java源码包4

    Java源代码实现部分,比较有意思,也具参考性。像坐标控制、旋转矩阵、定时器、生成图像、数据初始化、矩阵乘法、坐标旋转、判断是否是顺时针方向排列、鼠标按下、放开时的动作等,都可在本源码中得以体现。 Java...

    java开源包8

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    数字证书:从文件中读取数字证书,生成文件输入流,输入文件为c:/mycert.cer,获取一个处理X.509证书的证书工厂…… Java+ajax写的登录实例 1个目标文件 内容索引:Java源码,初学实例,ajax,登录 一个Java+ajax写的...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    数字证书:从文件中读取数字证书,生成文件输入流,输入文件为c:/mycert.cer,获取一个处理X.509证书的证书工厂…… Java+ajax写的登录实例 1个目标文件 内容索引:Java源码,初学实例,ajax,登录 一个Java+ajax写的...

    java开源包10

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    ExtAspNet v2.2.1 (2009-4-1) 值得一看

    -部分ExtAspNet控件的设计时支持(会在后续版本中逐步完善)。 -v0.2beta2版本中关于PersistChildren(true)的描述有误,这个是设计时属性,和运行时是否保持状态没有关系。 -修正CheckBox控件的CheckedChanged...

Global site tag (gtag.js) - Google Analytics