正如刚才看到的,我们可以使用IFrame以后台方式请求数据,但是这从本质上来说不过是一种hack式的临时解决方案。最初引入IFrame的设计意图是在页面上显示可见的内容,这种用法歪曲了这个意图。在流行的Web浏览器的更新版本中,引入了专门为异步数据传输而设计的对象,我们将会看到,它比IFrame用起来要方便得多。
XmlDocument和XMLHttpResuest对象并不是Web浏览器中DOM的标准扩展,它们只是碰巧得到了多数浏览器的支持。它们的设计目标很明确,就是用来以后台方式获取数据,这使得发出异步调用的业务使用起来非常流畅。两个对象都是源自微软私有的ActiveX组件,可以在IE浏览器中作为JavaScript对象来访问。其他的浏览器则依照相似的功能和API调用实现了自己的原生对象。两个对象执行的功能很相似,不过XMLHttpRequest可以更加精细地对请求进行控制。在本书中,我们将主要使用XMLHttpRequest,在这里我们简要介绍一下XmlDocument,以便你了解这个对象与XMLHttpRequest有哪些不同。代码清单2-8展示了一段简单创建XmlDocument对象的代码。
代码清单2-8 getXmlDocument()函数
在大多数现代浏览器中,这个函数都能返回一个具有相同API的XmlDocument对象,尽管在不同的浏览器中创建文档的方式有很大不同。
这段代码检查文档对象是否支持创建一个原生的XmlDocument对象所需的implementation属性(在最近的Mozilla和Safari浏览器中都可以找到这个属性)。如果没有找到,它将测试浏览器是否支持ActiveX对象(只有微软的浏览器才能够支持),如果支持,它将尝试定位一个合适的对象。这段脚本优先使用较新一些的第二版MSXML库。
注意 检查浏览器的厂商和版本号信息,并且使用这些信息来开发用于不同浏览器的分支代码,是一种很常见的做法。在我们看来,这种做法容易导致错误,因为它无法预期浏览器的未来版本,并且还会将有能力执行这段脚本的浏览器排除在外。在getXmlDocument()函数中,我们没有尽力去猜测浏览器的版本,而是直接检查特定的对象是否可用。这个方法也称作对象检测(object detection),可以更容易地支持浏览器未来的版本,以及那些我们没有明确测试过的不常见的浏览器,通常这会使得代码更加健壮。
代码清单2-9的代码采用与前面的代码类似的方式获得XMLHttpRequest对象,不过略微简单一些。
代码清单2-9 getXmlHttpRequest()函数
同样地,我们使用对象检测来测试是否支持原生的XMLHttpRequest对象,如果不支持,再测试是否支持ActiveX对象。在两者都不支持的浏览器中,我们简单地返回null。如何更加优雅地处理失败的情况呢?这个问题我们留到第6章再来更加详细地探讨。
我们已经创建了向服务器发送请求的对象,下面我们用它来做什么呢?