网络编程
位置:首页>> 网络编程>> XML编程>> 使用 XML HTTP Request 对象[翻译]

使用 XML HTTP Request 对象[翻译]

作者:子乌 来源:子乌的叶子 发布时间:2007-11-07 21:11:00 

标签:XML,XMLHTTP,ajax

作者:Jim Ley(主页)

译者:Sheneyan(子乌)

时间:2006.1.29

英文原文:http://jibbering.com/2002/4/httprequest.html

子乌注:这篇文章我想看过的人很多,翻译的版本也有许多,我之所以要再来翻译一次,是因为这篇文章的时效性(看下一段作者说明),以及文字的优雅。文字的时效性,它居然是2006年1月再次更改的版本,也就是说,我也许就是第一个翻译这个版本的人哦:P。文字的优雅,有能力、有空还是得看看原文,那英文的美感,在类似的技术文章中算很少见的(也许是我少见多怪,等我看多了就不会这样了~)

这篇文章写于2002年4月,由于这个对象最终会变得越来越流行,我已经决定修改并更新这篇文章。2002版仍然可以在线阅读,同样的还有2004年9月版2005年8月版。你正在阅读的是2006年1月版。

在windows上的Internet Explorer,Mac OS-X上的Safari,跨平台的Mozilla,KDE上的Konqueror,Java写的IceBrowser,以及另一个跨平台的Opera(包括Symbian)都为客户端的javascript脚本提供了一个方法来产生HTTP请求。卑微的出身和少许推崇者的古怪命名,最终成长为在某些领域里的核心技术,它叫作“AJAX”(欣赏一下原文:From the humble begins as an oddly named object with few admirers, it's blossomed to be the core technology in something called AJAX)。

这个对象让许多事情变得比原来优雅、简洁,并引入了一些在其他方面也一样重要的东西,比如HEAD请求来看一个资源的最后修改时间,或者只是看它是否存在。它让你的编码(scripting?)的选择更加灵活,允许POST提交,比如PUT、DELETE等等操作的可能性而不需要页面的改变。这些方法日益广泛地应用于创建类似G-Mail的更强大提供更迅捷(snappier)用户界面却使用更少带宽的web应用程序。

为什么叫做“XML”HTTP Request对象?

虽然这个对象被叫做“XML HTTP Request对象”,但它并不只局限于使用XML,它能够请求或发送任何类型的文档,虽然对于javascript来说,处理二进制流很成问题。

创建对象

在Internet Explorer里,你通过new ActiveXObject("Msxml2.XMLHTTP")或new ActiveXObject("Microsoft.XMLHTTP")(取决于安装的MSXML版本)来创建这个对象。在Mozilla和Sarafi中(以及未来支持这个对象的类似它们俩的浏览器(UA,User Agent)),你使用new XMLHttpRequest(),而IceBrowser使用另外一个方法:window.createRequest()。

这意味着你需要在不同的浏览器上展现不同的脚本(子乌注:小小抱怨一句,我还是觉得这点小小麻烦比起css的兼容来说,简单多了。。。。这只是个人看法,也许过几个月,我熟悉了css,就不会发这种牢骚了~),在一个浏览器上能够干得好好的代码,在另外一个上面八成会出错。下面的脚本解决了这个问题,而且如果它不支持,变量将被设置为false并允许恰当的错误信息,并在这个对象不可用的时候降低要求(degradtion),使用其他普通的http传输方法。留有后路是很重要的,即使在ie中,这个对象也经常由于安全设置的略微修改(通常是由于ie的入侵漏洞造成的)而被禁止。当你真的无法实现功能的时候而需要提供低等级的支持时,底下是一些方法。我建议是提供另一个变通的页面。比如GMail许诺说他们在未来(子乌注:呃。。。这文章是2002年写的,那时候gmail还没实现该功能)会提供一个更安全的版本,很有可能是完全没有javascript--完全的退化。


var xmlhttp=false;
/*@cc_on @*/
/*@if (@_jscript_version >= 5)
// JScript提供的条件编译让我们能够应付旧的ie版本,以及由于安全原因无法创建对象
try {
  xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
  try {
   xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
  } catch (E) {
   xmlhttp = false;
  }
}
@end @*/
if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
        try {
                xmlhttp = new XMLHttpRequest();
        } catch (e) {
                xmlhttp=false;
        }
}
if (!xmlhttp && window.createRequest) {
        try {
                xmlhttp = window.createRequest();
        } catch (e) {
                xmlhttp=false;
        }
}


0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com