提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
转帖|其它|编辑:郝浩|2009-02-10 11:05:37.000|阅读 1250 次
概述:一个Aajax请求就像一个JavaScript线程。在要求执行的同时,JavaScript代码也在代码流里执行。那么你如何解决可能发生的冲突及由此产生的错误呢?如果你的网页有Ajax功能,且它不能下载你所期望的文本,你能通过点击浏览器上的重新载入(刷新)按钮来解决这一问题吗?如果可以的话,在什么条件下可行?如果不能,那是为什么呢?
# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>
一个Aajax请求就像一个JavaScript线程。在要求执行的同时,JavaScript代码也在代码流里执行。那么你如何解决可能发生的冲突及由此产生的错误呢?如果你的网页有Ajax功能,且它不能下载你所期望的文本,你能通过点击浏览器上的重新载入(刷新)按钮来解决这一问题吗?如果可以的话,在什么条件下可行?如果不能,那是为什么呢?
如果服务器有任何问题,它会发送一个出错信息吗?如果会,那个错误信息会替代你正期望的文本还是有什么Ajax方法可以控制错误?如果不是,又是为什么呢?如果服务器死机,TCP/IP协议会发送错误信息吗?如果会,你怎样控制?如果不会,又是为什么?本文旨帮解决这系列的问题。
没有错误校验的Ajax函数
以下是一个没有错误校验代码的Ajax要求的执行过程:
//variable to finally hold the Ajax downloaded text.
pageDoc = "";
var xmlHttp;
try
{
// Firefox, Opera 8.0+, Safari
xmlHttp = new XMLHttpRequest();
}
catch (e)
{
// Internet Explorer try
{
xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
}
catch (e)
{
try
{
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
catch (e)
{
alert("Your browser does not support AJAX!");
}
}
}
xmlHttp.onreadystatechange=function()
{
if (xmlHttp.readyState == 4)
{
pageDoc = xmlHttp.responseText;
}
}
xmlHttp.open("GET","//localhost/cgi-bin/sendPge2Str.pl",true);
xmlHttp.send(null);[SPAN]
第一个语句说明了下载的文本存在易变性,JavaScript需要Ajax对象来发出Ajax请求。下一个语句是综合的尝试性锁定。这个语句之所以长是因为不同的浏览器和不同的IE版本是依靠不同的方式对Ajax对象示例。该例子中的Ajax对象名是xmlHttp。
随后的语句就为Ajax对象定义了一个方法。每次Ajax对象状态改变的时候,这个方法都会被调用。当readystate为4的时候会最终的状态会更改。当readystate为4时,被定义的Ajax对象方法会被执行。这种情况下文本已经下载完毕并且可以为浏览器所使用。
(xmlHttp.open())语句跟随打开请求的连接。随后的语句发出请求。当文本全部下载完,readystare变为4并执行定义的对象。
点击重新载入的按钮
这个规则对任何网页,包括有Ajax函数的网页都适用。网页正在显示或已经显示的时候,你如果发现所有HTML要素都没有下载,你应该刷新浏览器。这一操作可以重新下载你HTML要素。当服务器出现问题或传输线路出现障碍的时候,这一招管用。
注意:它只在错误的Ajax载入内容不被浏览器缓冲时有作用。许多浏览器都是默认缓冲Ajax下载的文本。因此,当你点击重新载入的按钮,下载的Ajax文本是从浏览器缓冲处获得的。当然,要想不让浏览器缓冲也是可以做到的。你要在服务器的脚本上花点功夫。PHP,电脑脚本语言,就可以帮助解决这一问题。但是,这里暂不讨论这一点。
如上所说,如果Ajax问题是服务器或网路意外造成的,点击浏览器的刷新按钮来解决Ajax下载错误是可行的。
服务器或传输线不起作用的时候
在此分享一些我自己的经验。如果在用户看过网页后服务器或传输线停止了,而又没有任何错误信息发送。
服务器脚本不生效
在此我所说的是那些要把Ajax文本从服务器发送到客户的脚本。如果脚本不起作用,而其他的没问题,那就是因为没有下载Ajax文本。但是,服务器可能会发送替代Ajax文本的错误信息。用户就可以看见错误信息了。最好的避免此类错误发生的方法是确保你的脚本无误。
JavaScript Ajax对象的readyState性能
readyState性能通过返回一个整数与正发生的请求保持联系。JavaScript Ajax 对象的readyState性能可以被附值为1,2,3或4.数值代表的意思如下:
0:未初始化的
1:载入中
2:已载入
3:互动的
4:完成
经常使用的数值是最后一个,它指示下载已经完成。这些数值可以被用来检查错误吗?答案是否定的。你不能用这些数值来测定是否有错误发生。你所能做的只是用这些数值检查发出的请求进行到了哪一步。[SPAN]
HTTP Status
当你使用HTTP服务器时你会需要以下的HTTP错误信息与状态信息。当传输线和服务器运转正常时,会出现这些错误/状态信息。
200:OK
这意味着请求成功。用户的请求被成功接收,理解和执行。
404:Not Found (没找到)
意思是服务器没找到任何可以与请求链接相匹配的。
301:Moved Permanently (永远移动)
304:Not Modified (网页未经修改)
403:Forbidden (禁止)
401:Unauthorized (未授权,错误的密码)
以上只是一部分信息的举例。这些信息都由服务器发送。Ajax对象有两个性能来指示这这些错误/状态情况。这两个性能包括状态和状态文本。状态性能保存一个数值。例如,请求成功,状态性能会显示200;如果不成功则显示404。
状态文本保存唯一的文本相当于一个数值,例如,如果请求成功,状态文本会显示“OK”;如果不成功,则显示“Not Found”。
这两种性能任选其一,都可以检查错误或状态的情况。记住当传输线和服务器运转正常时这种方法才适用。注:大多数时候传输线和服务器都正常,所以这些HTTP状态信息一般都能正确指示错误。如果你的脚本不起作用,它也能指出来。
最重要的HTTP状态码是200:“OK.”。它能指示请求是否被服务器接受。由Ajax对象状态性能指示数值,而文本“OK”则由Ajax对象状态文本性能指示。以下的代码片段可以告诉你怎样通过状态数值200进行错误检查:
xmlHttp.onreadystatechange=function()
{
if (xmlHttp.readyState == 4)
{
if (xmlHttp.status == 200)
{
pageDoc = xmlHttp.responseText;
}
}
else
{
//report error – to the client.
}
}
该代码片段是Ajax对象中“状态改变事件触发器”方法的修改版本。在我解释该代码前,先让我们区分一下readyState为4和状态为200之间的差异。当readyState为4时,意味着传送完毕,也就是完成了某些下载。而下载的东西可能不是你希望的Ajax文本。它可能是来自服务器的错误信息,如果你的脚本不生效的话。[SPAN]
当状态为200时,意味着服务器成功接收到了你的请求,理解并且接受该请求。这并不意味着服务器已经把用户请求的发送给了客户。另一方面,当readyState为4时,表示用户收到了某些东西,但不代表是你请求的东西。
你需要同时使用这两种性能来确保所下载的东西就是你想要的东西。在上述的“状态改变事件触发器”方法的定义中,你有一个if的语句。该语句检查readyState是否为4。如果是,意味着下载完成。为了确保下载的东西是你想要的,我们还需测试其状态是否为200。如果是,你就下载到了你想要的。如果不是,我们就要处理错误信息。
在你的Ajax进程里至少要涵盖上述的代码片段。
Ajax请求的线程效应
一个Ajax请求就像一个JavaScript线程。发出请求时,JavaScript代码也在代码流中执行。你可能想通过Ajax请求的结果(下载的文本)使那些语句在Ajax请求之下。而问题是你或许无法知道请求在什么时候会完成。在请求完成的时候,请求语句下面的语句可能已经被执行了。
如果可以在“状态改变事件发生器”方法中使用Ajax结果,那当然最好。
如果你必须在语句中使用Ajax 请求之下的Ajax结果,那你应该有一个Ajax请求之下的while-loop,它可以在Ajax请求下的语句继续执行前,循环检查文本是否被下载。如果要求的结果已经接收到的话,xmlHttp。“状态改变事件发生器”方法应该有一个用来指示whilt-loop的语句。
反应时间比预计的更长
反应时间比预计的要长该怎么办?当你确定时间超出过长时,终止Ajax请求。你要知道怎样判断时间是否过长。
Ajax对象有一个方法叫做abort()。该函数用来终止Ajax请求。当请求被终止后,readyState的值归零,当然不会下载任何东西。你不用担心readyState或状态的值。下面的代码片段,位于Ajax进程以下,在5秒后终止Ajax请求:
function abortAjax()
{
xmlHttp.abort();
}
setTimeout("abortAjax()", 5000);
结论
要对文中的每个问题给出一个清晰的答案是不太可能的。在某些条件下,如果您单击刷新按钮,你就可以得到你所希望的。也有可能,这些方法帮不到你。总是利用readyState和状态性能,可以弄清楚很多问题。不要忘记Ajax请求的线程效应。在最后的部分的展示,告诉了你如何避免可能发生的冲突。
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@pclwef.cn
文章转载自:IT专家网面对“数字中国”建设和中国制造2025战略实施的机遇期,中车信息公司紧跟时代的步伐,以“集约化、专业化、标准化、精益化、一体化、平台化”为工作目标,大力推进信息服务、工业软件等核心产品及业务的发展。在慧都3D解决方案的实施下,清软英泰建成了多模型来源的综合轻量化显示平台、实现文件不失真的百倍压缩比、针对模型中的大模型文件,在展示平台上进行流畅展示,提升工作效率,优化了使用体验。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@pclwef.cn
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢