封装一个自己的 Ajax小框架

Posted 叶祖辉

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了封装一个自己的 Ajax小框架相关的知识,希望对你有一定的参考价值。

框架代码如下:

技术分享
// 使用封装方法的人只关心提供http的请求方法,url地址,数据,成功和失败的回调方法

// 类的构造定义,主要职责就是新建出 XMLHttpRequest 对象
var MyXMLHttpRequest = function () {
    var xmlhttprequest;
    if (window.XMLHttpRequest) {
        xmlhttprequest = new XMLHttpRequest();
        if (xmlhttprequest.overrideMimeType) {
            xmlhttprequest.overrideMimeType("text/xml");
        }
    } else if (window.ActiveXObject) {
        var activeName = ["MSXML2.XMLHTTP", "Microsoft.XMLHTTP"];
        for (var i = 0; i < activeName.length; i++) {
            try {
                xmlhttprequest = new ActiveXObject(activeName[i]);
                break;
            } catch (e) {

            }
        }
    }
    if (xmlhttprequest == undefined || xmlhttprequest == null) {
        alert("XMLHttpRequest对象创建失败!");
    } else {
        this.xmlhttp = xmlhttprequest;
    }
}

//用户发送请求的方法
MyXMLHttpRequest.prototype.send = function (method, url, data, callback, failback) {

    if (this.xmlhttp != undefined && this.xmlhttp != null) {
        method = method.toUpperCase();
        if (method != "GET" && method != "POST") {
            alert("HTTP的请求方法必须是GET或POST");
            return;
        }
        if (url == null || url == undefined) {
            alert("HTTP的请求地址必须设置!");
            return;
        }
        var tempxmlhttp = this.xmlhttp;

        this.xmlhttp.onreadystatechange = function () {
            if (tempxmlhttp.readyState == 4) {
                if (tempxmlhttp.status == 200) {
                    var responseText = tempxmlhttp.responseText;
                    var responseXML = tempxmlhttp.responseXML;

                    if (callback == undefined || callback == null) {
                        alert("没有设置处理数据正确返回方法!");
                        alert("返回的数据:" + responseText)
                    } else {
                        callback(responseText, responseXML);
                    }
                } else {
                    if (failback == undefined || failback == null) {
                        alert("没有设置处理数据正确返回的方法!");
                    } else {
                        failback(tempxmlhttp.status, tempxmlhttp.statusText);
                    }
                }
            }
        }

        //解决缓存的转换
        if (url.indexOf("?") >= 0) {
            url = url + "&t=" + (new Date()).valueOf();
        } else {
            url = url + "?t=" + (new Date()).valueOf();
        }

        //解决跨域的问题
        if (url.indexOf("http://") >= 0) {
            url.replace("?", "&");
            url = "Proxy?url=" + url;
        }

        this.xmlhttp.open(method, url, true);

        //如果是POST方式,需要设置请求头
        if (method == "POST") {
            this.xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        }

        //提交请求
        this.xmlhttp.send(data);
    } else {
        alert("XMLHttpRequest对象创建失败,无法发送数据!");
    }
}

//放弃AJAX请求
MyXMLHttpRequest.prototype.abort = function () {
    this.xmlhttp.abort();
}
技术分享

调用方式如下:

1. 引用js
2. new 一个自定义的 XMLHttpRequest 对象
3. 使用里面的 send 方法进行数据提交
4. 构造 callback 回调处理函数,与 failback 失败的 回调函数

技术分享
<script src="ajax.js" type="text/javascript"></script>
<script type="text/javascript">
        function ValidUser() {
            //获取客户端内容
            var userName = document.getElementById("UserName").value;
            //进行编码解决 中文乱码
            userName = encodeURI(encodeURI(userName));

            var xmlhttp = new MyXMLHttpRequest();
           
            xmlhttp.send("POST", "AjaxRequst.ashx", "name="+userName, callback, failback);
          //xmlhttp.send("GET", "AjaxRequst.ashx?name="+userName, "", callback, failback);
        }
        function callback(responseText, responseXML) {
            //纯文件数据的接受方法
            var message = responseText;

            //将返回的内容添加到DIV层里
            var div = document.getElementById(‘message‘);
            div.innerhtml = message;
        }
        function failback(status, statusText) {
            alert(status +"---"+ statusText);
        }
</script>
技术分享

 




以上是关于封装一个自己的 Ajax小框架的主要内容,如果未能解决你的问题,请参考以下文章

先定一个小目标,自己封装个ajax

自己封装个ajax

回归 | js实用代码片段的封装与总结(持续更新中...)

封装自己的Ajax框架

封装Ajax框架(代码篇)

实现自己的MVC AJAX框架计划