biaoge's blog

以前端技术为主

Archive for the ‘XMLHttpRequest’ tag

不用try catch创建XMLHttpRequest对象

without comments

一直搞不明白为什么许多书上在创建XMLHttpRequest对象的时候一定要用try catch方法来做,用对象检测方法不是要简单得多吗?今天看kkp on JavaScript看到Data Retrieval这一章时决定好好分析一下这个问题,首先用以下代码测试:

if (XMLHttpRequest) alert('supported!');

马上就有新的发现,原来IE 7内部已经有了XMLHttpRequest这个对象,此前还一直以为所有的IE都不支持XMLHttpRequest对象的,原来是我读的基本JS的书籍都太老了,根本没有提及IE7已经开始支持XHR这个问题。

刚才的代码在IE6里面会报错,提示XMLHttpRequest未定义,if语句有一个特点很有意思:当遇到未定义的变量的时候会报错,而遇到未定义的属性时则不会报错。在支持XHR的浏览器里面XMLHttpRequest可以看成是一个全局变量,而所有的全局变量同时也是window对象的属性,那么方法就出来了,在if语句里面把XMLHttpRequest写成window的属性,即if (window.XMLHttpRequest),这样IE6就不会报错了。

做了一个小小的搜索看快就发现原来IE的开发人员正是用对象检测来创建XHR对象的:

if (window.XMLHttpRequest) {
    // If IE7, Mozilla, Safari, etc: Use native object
    var xmlHttp = new XMLHttpRequest()
}
else if (window.ActiveXObject) {
    // ...otherwise, use the ActiveX control for IE5.x and IE6
    var xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}

Update:projs中介绍一种更好的方法:

if ( typeof XMLHttpRequest == 'undefined' )
    XMLHttpRequest = function() {
        // Internet Explorer uses an ActiveXObject to create a new XMLHttpRequest object
        return new ActiveXObject(
            // IE 5 uses a different XMLHTTP object from IE 6
            navigator.userAgent.indexOf('MSIE 5') >= 0 ?
            'Microsoft.XMLHTTP' : 'Msxml2.XMLHTTP' );
};
//Create the request object
var xml = new XMLHttpRequest;

Written by admin

October 24th, 2008 at 3:40 pm