javaScript AJAX

AJAX的实现

var sAjax = function () {
        var sendMsg = {                                             
            url: "",
            sendType: "POST",
            ContentType: "application/x-www-form-urlencoded",
            msgType: "JSON",
            data: {},
            success: function (data) {

            },
            error: function (data) {

            },
            send: function () {
                var url = "";
                if (sendMsg.sendType == "POST") {
                    url = sendMsg.url;
                } else {
                    url = sendMsg.url + "?" + postData(sendData.data);
                }
                var xhr = new XMLHttpRequest();
                xhr.open(sendMsg.sendType, url, true);
                xhr.setRequestHeader("Content-type", sendMsg.ContentType);
                xhr.onreadystatechange = function () {
                    var XMLHttpReq = xhr;
                    if (XMLHttpReq.readyState == 4) {
                        if (XMLHttpReq.status == 200) {
                            var text = XMLHttpReq.responseText;
                            if (sendMsg.msgType == "JSON") {
                                console.log(text);
                                sendMsg.success(eval('(' + text + ")"));
                            } else {
                                sendMsg.success(text);
                            }
                        } else {
                            sendMsg.error(XMLHttpReq.status);
                        }
                    }
                };
                xhr.send(postData(sendMsg.data));
            }
        }
        function postData(obj) { // 转成post需要的字符串.
            var str = "";
            for (var prop in obj) {
                str += prop + "=" + obj[prop] + "&"
            }
            return str;
        };
        return sendMsg;
    }

注意1:
构造函数中的sendMsg内的send方法中不可使用this.的方式获取sendMsg对象中的属性,因为this是静态的,当使用var a =new sAjax()实例化对象时this就已经生成了,这个时候this中的属性还没有被赋值this.url=null。
注意2:
使用eval()函数转换json字符串时应当使用sendMsg.success(eval('(' + text + ")"))的方式进行解析,使用sendMsg.success(eval( text))会报错提示“VM444:1 Uncaught SyntaxError: Unexpected token 😦…)”,原因是在javaScript中“{}”表示一个对象,而对象不能脱离变量单独存在,“()”在javascript中有2种作用:确立运算优先级,以及分组运算符。在这里“()”起到了分组运算符的作用。
分组运算符:
Return the result of evaluating Expression. This may be of type Reference.
百度翻译
返回评价结果。这可能是类型参考。
基本没看懂,但是比较eval()函数的说明,本人理解为,eval('{"aaa":"aaa"}') 是将 '{"aaa":"aaa"}' 字符串当做语句来执行,执行这个语句在语法上是错误的,而eval('(' + '{"aaa":"aaa"}' + ")")是返回了'{"aaa":"aaa"}'的评价结果。就像是在函数中return一个变量一样。

posted @ 2016-12-28 13:32  ShiQing  阅读(152)  评论(0编辑  收藏  举报