利用XMLHttpRequest做个ajax请求

看了网上js,ajax,jq不同或是区别,吵得不可开交。有那个闲工夫看看web技术,尤其是web api((js作为工具,有好多功能调用的webapi)),它不香吗??

个人认为ajax,是一个新概念,就跟印刷术(js)和活字印刷术(ajax),本质还是js(小样儿,穿个马甲还认识你),最主要得作用也是最常用的是“异步”(就是不用整个页面都刷新,局部改变)。

下面封了个方法

var _Util = {};

//ajax请求
_Util.ajax = function (req) {
    req = {
        method: req.method || "POST",
        url: req.url || "",
        param: req.param || "",
        upload: req.upload || false,
        timeout: req.timeout || 20000,
        success: req.success || function () { },
        error: req.error || function () { },
        complete: req.complete || function () { },
        overtime: req.overtime || function () { },
        async: req.async || true
    };

    var xhr = (function () {
        if(typeof XMLHttpRequest !== 'undefined'){
            return new XMLHttpRequest();
        } else if (typeof ActiveXObject !== 'undefined') {
            if(typeof arguments.callee.activeXString != 'string')
            {
           		//不懂这三个得,自己去查
                var versions = ['MSXML2.XMLHTTP.6.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP'];
                for (var i = 0, len = versions.length; i < len; i++) {
                    try {
                        new ActiveXObject(versions[i]);
                        arguments.callee.activeXString = versions[i];
                        break;
                    } catch (ex) {
                    }
                }
            }
            return new ActiveXObject(arguments.callee.activeXString);
        } else {
            throw new Error('No XHR object available');
        }
    }());
    //请求路径
    req.url = req.url + (req.url.indexOf('?') == -1 ? '?' : '');
    //参数,一个json,{key:val, key1:val1, ......}
    req.param = (function (p) {
        if(req.upload){
            var fd = new FormData();
            for (var o in p)
                p.hasOwnProperty(o) && fd.append(p[0]);
            return fd;
        }else{
            var arr = [];
            for (var o in p)
                arr.push(encodeURIComponent(o) + '=' + encodeURIComponent(p[o]));
            return arr.join('&');
        }
    })(req.param);

    //方法
    if (req.param !== '' && req.method.toUpperCase() === 'GET') {
        req.url += req.param;
    }

    //异步,回调方法的定义
    if(req.async){
        xhr.onreadystatechange = function () {
            if ((xhr.readyState == 4 || xhr.readyState == 'complete') && !requestDone) {
                callback();
            }
        }
    }

    //发送请求
    xhr.open(req.method, req.url, req.async);
    var requestDone = false;
    var timeid = setTimeout(function () {
        requestDone = true;
        req.overtime();
    }, req.timeout);

    //post补上参数
    if (req.method.toUpperCase() === 'POST') {
        if (!req.upload)
            xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
        //不理解这一步的,可以下下面formdata的案例,地址:https://developer.mozilla.org/zh-CN/docs/Web/API/FormData/Using_FormData_Objects
        xhr.send(req.param);
    } else {
        xhr.send(null);
    }
    //回调
    function callback() {
        if (timeid != 0) {
            window.clearTimeout(timeid);
            timeid = 0;
        }
        if (xhr.status == 200) {
            req.success(xhr.responseText);
        } else{
            req.error(xhr.status, xhr.statusText);
        }
        req.complete();
        xhr = null;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值