几种创建XMLHttpRequest对象的方法

XMLHttpRequest对象,也就是Ajax交互的核心对象。

这里列举三种创建Ajax对象的方法。


第一种:

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <title>Examples</title>
    <meta name="author" content="manfredHu">
    <meta name="website" content="http://www.cnblogs.com/manfredHu/">
</head>

<body>
    <script type="text/javascript">
    //IE8-中创建XHR对象的第一种方法
    function getXHR() {
        if (window.XMLHttpRequest) {
            return new XMLHttpRequest();
        } else {
            window.XMLHttpRequest = function() {
                try {
                    return new ActiveXObject("Msxml2.XMLHTTP.6.0");
                } catch (e1) {
                    try {
                        return new ActiveXObject("Msxml2.XMLHTTP.3.0");
                    } catch (e2) {
                        throw new Error("XMLHttpRequest is not supported");
                    }
                }
            }
        }
    }
    var XHR = getXHR();
    console.log(XHR);
    </script>
</body>

</html>

第一种第一个是判断window.XMLHttpRequest对象是否存在,存在则返回。不存在则检测IE浏览器的ActiveObject各个版本的不同对象。总的来说这种写法try和catch嵌套很多。看着有点晕


第二种:

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <title>Examples</title>
    <meta name="author" content="manfredHu">
    <meta name="website" content="http://www.cnblogs.com/manfredHu/">
</head>

<body>
    <script type="text/javascript">
    //IE8-中创建XHR对象的第二种方法
    function getxhr() {
        var xmlhttp;
        if (window.XMLHttpRequest) { // code for IE7+, Firefox, Chrome, Opera, Safari
            xmlhttp = new XMLHttpRequest();
        } else { // code for IE6, IE5
            xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
        }
        console.log(xmlhttp);
    }
    var XHR = getxhr();
    console.log(XHR);
    </script>
</body>

</html>

第二种方法是W3School上面的方法,看起来很简洁,但是没有版本检测。在IE6下可以正常运行!低版本IE5-没有测过不知道,但是也是不推荐的写法。新版本跟老版本的IE在不同版本对XHR对象的处理不太一样,项目中还是推荐要写入版本号。


第三种:

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <title>Examples</title>
    <meta name="author" content="manfredHu">
    <meta name="website" content="http://www.cnblogs.com/manfredHu/">
</head>

<body>
    <script type="text/javascript">
    //IE8-中创建XHR对象的第三种方法
    function createXHR() {
        if (typeof XMLHttpRequest != "undefined") {
            return new XMLHttpRequest(); //IE7+和其他浏览器支持的
        } else if (typeof ActiveXObject != "undefined") { //IE7-支持的
            if (typeof arguments.callee.activeXString != "string") {
                var versions = ["MSXML2.XMLHttp.6.0", "MSXML2.XMLHttp.3.0", "MSXML2.XMLHttp"],
                    i, len;
                for (i = 0, len = versions.length; i < len; i++) {
                    try {
                        new ActiveXObject(versions[i]);
                        arguments.callee.activeXString = versions[i];
                        break;
                    } catch (e) {
                        
                    }
                }
            }
            return new ActiveXObject(arguments.callee.activeXString); //返回ActiveXObject对象
        } else { //全部不支持,抛出错误
            throw new Error("don't support XMLHttpRequest");
        }
    }
    var XHR = createXHR();
    console.log(XHR);
    </script>
</body>

</html>

第三种是来自Professional JavaScript for Web中文名《JavaScript高级程序设计(第3版)》这本书然后经过自己修改理解得到的。首先判断有没有支持XMLHttpRequest对象,有得话直接返回。没有的话检测IE的ActiveObject对象是否存在,存在则循环创建一个由新到老的版本号作为参数的对象,如果有错误则跳过错误继续创建低级的版本。有一步要注意,就是第一次运行的时候将函数的activeXString对象缓存为已经测试完毕的versions[i]版本参数,然后在第二次就不会执行if里面的东西,直接到return new ActiveXObject(argument.callee.activeXString)这句。这种写法是比较推荐的,逻辑比较清晰。而且没有像第一种那样用N个try和catch嵌套创建,而是通过数组和for循环创建。大师果然写的代码就是不一样,很严谨和扩展性很好的代码写法。


第四种是double Net提议的用惰性函数的写法

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <title>第四种创建方法</title>
    <meta name="author" content="double Net">
</head>

<body>
    <script type="text/javascript">
    var XHR = function() {
        //将浏览器支持的AJAX对象放入一个function中,并且根据固定的顺序放到一个队列里。
        for (var AJAXObj = [function() {
                return new XMLHttpRequest
            }, function() {
                return new ActiveXObject("Msxml2.XMLHTTP")
            }, function() {
                return new ActiveXObject("Msxml3.XMLHTTP")
            }, function() {
                return new ActiveXObject("Microsoft.XMLHTTP")
            }], val = null, index = 0; index < AJAXObj.length; index++) {
            //此方法的核心,如果当前浏览器支持此对象就用val保存起来,用保存当前最适合ajax对象的function替换XHR方法,并且结束该循环。这样第二次执行XHR方法时就不需要循环,直接就能得到当前浏览器最适ajax对象。如果都不支持就抛出自定义引用错误。
            try {
                val = AJAXObj[index]()
            } catch (b) {
                continue
            }
            //假设当前浏览器为标准浏览器,此处执行完毕之后console.log(XHR);
            //结果为:function () {
            //  return new XMLHttpRequest
            //};XHR成功替换。
            XHR = AJAXObj[index];
            break
        }
        if (!val) {
            throw new ReferenceError("XMLHttpRequest is not supported")
        }
        return val;
    };
    var xmlObj = XHR();
    console.log(xmlObj);
    </script>
</body>

</html>

孤陋寡闻,了解了一下什么叫惰性函数,也谢谢double Net这位朋友的提醒 :)

惰性载入表示函数执行的分支只会在函数第一次掉用的时候执行,在第一次调用过程中,该函数会被覆盖为另一个按照合适方式执行的函数,这样任何对原函数的调用就不用再经过执行的分支了。

确实第三种代码没有考虑到惰性函数的优点的那部分,即是一次检测之后重写构造方法。

虽然看到这里我对与创建XHR对象的方法已经觉得够完美了,但是感觉上面的代码也不是我的菜,for里面嵌套好多代码,跟自己的代码习惯不太符合(有点处女座了请原谅^_^。。。)


 第五种方法是后面才发现的

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <title>第五种创建方法</title>
</head>

<body>
    <script type="text/javascript">
    function createXHR() {
        if (typeof XMLHttpRequest != "undefined") {
            //在第一次执行的时候重写createXHR函数
            createXHR = function() {
                return new XMLHttpRequest();
            };

        } else if (typeof ActiveXObject != "undefined") {

            createXHR = function() {
                if (arguments.callee.activeXString != "string") {
                    var versions = ["MSXML2.XMLHttp.6.0", "MSXML2.XMLHttp.3.0", "MSXML2.XMLHttp"],
                        i, len;
                    for (i = 0, len = versions.length; i < len; i++) {
                        try {
                            new ActiveXObject(versions[i]);
                            arguments.callee.activeXString = versions[i];
                            break;
                        } catch (ex) {
                            //skip
                        }
                    }

                }
                return new ActiveXObject(arguments.callee.activeXString);
            };

        } else {

            createXHR = function() {
                throw new Error("No XHR object available.");
            };

        }
        return createXHR();
    }

    var XHR = createXHR();
    alert(XHR);
    </script>
</body>

</html>

转载于:https://www.cnblogs.com/manfredHu/p/4593810.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: XMLHttpRequest对象是一种能够发送HTTP或HTTPS请求并接收服务器响应的JavaScript API。它可以用于创建异步的Web应用程序,不需要刷新页面就可以更新内容。这个对象通常被用于AJAX编程中,但它也可以用于其它的网络通信。 ### 回答2: XMLHttpRequest对象是一种在JavaScript中使用的原生对象,它允许在客户端和服务器之间进行异步数据交换。通过使用XMLHttpRequest对象,我们可以向服务器发送HTTP请求,并在不刷新整个页面的情况下获取服务器的响应数据。 XMLHttpRequest对象最主要的功能是通过HTTP协议向服务器发送请求,以下是实现HTTP请求的几个基本步骤: 1. 创建一个XMLHttpRequest对象:使用`new XMLHttpRequest()`来创建一个XMLHttpRequest对象。 2. 设置请求的方法和地址:使用`open()`方法来设置HTTP请求的方法(如GET、POST等)和请求的地址。 3. 设置请求头部信息:可以通过`setRequestHeader()`方法来设置HTTP请求的头部信息,例如设置Content-Type等。 4. 发送请求:使用`send()`方法来发送HTTP请求,如果是POST请求,可以在send()中传递请求的参数。 5. 监听响应:通过设置`onreadystatechange`属性,并使用`onreadystatechange`事件来监听请求的状态变化。 6. 获取响应数据:可以使用`responseText`属性来获取服务器响应的文本数据,使用`responseXML`属性获取服务器响应的XML数据,以及其他相关属性。 XMLHttpRequest对象的出现使得客户端和服务器之间的数据交换更加灵活和高效。它可以用于获取服务器返回的数据,并以各种形式展示在网页中,例如动态更新页面内容、实现无刷新提交表单、实时获取服务器数据等。同时,XMLHttpRequest对象也被广泛用于实现Ajax技术,实现异步更新页面的效果。 需要注意的是,由于浏览器的安全限制,XMLHttpRequest对象只能用于请求同源策略下的资源。如果需要请求其他域名下的资源,可以使用CORS(跨域资源共享)或者代理方式来解决。此外,XMLHttpRequest对象也有一些局限性,例如无法同时发送多个请求、无法监听请求进度等。因此,在一些复杂的应用场景下,可能需要使用其他技术来完成数据交换的需求。 ### 回答3: XMLHttpRequest对象是一种在前端开发中用于与服务器进行通信的API。它是浏览器提供的用于发送和接收HTTP请求的对象之一。 XMLHttpRequest对象的使用主要分为几个步骤。首先,我们需要创建一个XMLHttpRequest对象,可以通过调用`new XMLHttpRequest()`来实现。然后,可以使用`open()`方法来指定发送请求的方式(GET、POST等)、URL地址以及是否采用异步方式发送请求。接下来,使用`send()`方法将请求发送到服务器。 在请求发送完成后,XMLHttpRequest对象将会接收服务器的响应。我们可以通过`onreadystatechange`事件来监听ReadyState状态的变化,并在状态为4(请求已完成)时处理服务器的响应。此时,可以使用`status`属性来获取服务器返回的状态码,通过`responseText`或`responseXML`属性获取服务器返回的数据。 XMLHttpRequest对象是一个功能强大且广泛使用的技术,可以用于实现各种与服务器交互的功能。例如,可以使用该对象发送Ajax请求,实现页面的无刷新更新。同时,也可以使用它来实现登录验证、数据传输、文件上传等功能。此外,XMLHttpRequest对象支持跨域请求,可以实现访问不同域名下的资源。 总之,XMLHttpRequest对象是前端开发中不可或缺的一部分,它使得我们可以通过JavaScript与服务器进行通信,实现更加丰富和动态的用户体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值