IE与Firefox下XMLHttp的创建创建一个XMLHttp对象 显然,使用一个XMLHttp对象的第一步,是要创建它,因为Micr
IE与Firefox下XMLHttp的创建
创建一个XMLHttp对象
显然,使用一个XMLHttp对象的第一步,是要创建它,因为Microsoft对此的实现是ActiveX控件,所以你也必须在JavaScript中使用ActiveXObject的所有者类,并传递给它一个XMLHttp控件的签名:
var oXmlHttp = new ActiveXObject("Microsoft.XMLHttp");
上述代码创建了XMLHttp对象的第一个版本(其与IE 5.0一同发布),问题是,随着后续MSXML库的发布,也发布了好几个不同的新版本,每次发布都带来了更好的稳定性与更快的速度,所以,必须要确定你使用的是用户电脑上可用的最新版本。每个版本的签名如下:
Microsoft.XMLHttp
MSXML2.XMLHttp
MSXML2.XMLHttp.3.0
MSXML2.XMLHttp.4.0
MSXML2.XMLHttp.5.0
不幸的是,确定可用最佳版本唯一的方法,是依次尝试创建它们。因为其本身为一个ActiveX控件,任何创建对象上的失败,都会抛出一个错误,这意味着你必须在一个try…catch块中编写这些代码,如下:
function createXMLHttp() {if (typeof XMLHttpRequest != "undefined") {return new XMLHttpRequest();} else if (window.ActiveXObject) {var aVersions = [ "MSXML2.XMLHttp.5.0","MSXML2.XMLHttp.4.0","MSXML2.XMLHttp.3.0","MSXML2.XMLHttp","Microsoft.XMLHttp"];for (var i = 0; i < aVersions.length; i ) {try {var oXmlHttp = new ActiveXObject(aVersions[i]);return oXmlHttp;} catch (oError) {//Do nothing}}}throw new Error("不能创建XMLHttp对象!");}
现在,这个函数先检查是否定义了一个XMLHttpRequest类(使用typeof操作符),假如类XMLHttpRequest存在,它将被用于创建XMLHttp对象;否则,函数检查ActiveXObject类是否存在,假如存在,就执行一遍为IE创建XMLHttp对象相同的过程。假如以上两个测试都失败了,就会抛出一个错误。
另一种创建跨浏览器XMLHttp对象的方法,就是使用已为跨浏览器编写的类库:zXml。它由两位作者编写,可从http://www.nczonline.net/downloads/处下载,库中定义了一个创建XMLHttp对象的单一函数:
var oXmlHttp = zXmlHttp.createRequest();
函数createRequest与zXml库本身,将会贯穿全文,以帮助处理有关跨浏览器的Ajax技术。
在创建完一个XMLHttp对象之后,便可预备从JavaScript中发起HTTP请求。首先调用open()方法,由其完成对象的初始化,此方法接受以下三个参数:
1、 请求类型:指示某种请求类型的字符串,GET或POST(这也是目前所有浏览器都支持的类型)。
2、 URL:请求将发送到的某URL。
3、 异步(Async):一个布尔值,由其决定请求是否异步。
最后一个代表异步的参数,在此非常重要,因为它控制了JavaScript怎样执行请求。当设置为true时,请求被异步发送,JavaScript代码不会等待响应而继续执行,必须设置一个事件处理函数以监视对请求的响应。假如设置为false,请求被同步发送,而JavaScript会在继续执行代码之前等待来自服务器的响应;这意味着假如响应需要很长时间,那么用户将不能操作浏览器,直至响应完成。因此,开发Ajax应用程序最好的方法是,对数据的常规返回操作,尽量使用异步请求,而同步请求用于发送和接收与服务器之间的短小信息。
如对某一info.txt文件的异步GET请求,代码如下:
var oXmlHttp = zXmlHttp.createRequest();
oXmlHttp.open("get", "info.txt", true);
请注重此处的第一个参数,也就是请求类型,即使在技术层面要求请求类型全部为大写字符,但此处使用小写也是没关系的。