Ten的XHR



Ten.XHR = new Ten.Class({                                                                         // XHR : XMLHttpRequest
    initialize: function(uri,opts,obj,callPropertyName) {                                         //
        Ten.EventDispatcher.implementEventDispatcher(this);                                       //
        this.method = 'GET';                                                                      //
                                                                                                  //
        if (!uri) return;                                                                         //
                                                                                                  //
        if (!Ten.XHR.isSafeUri(uri)) {                                                            //
            throw "host differs : " + uri;                                                        //
        }                                                                                         //
                                                                                                  //
        if (!opts) opts = {};                                                                     // 只是爲了opts.method不報錯
                                                                                                  //
        if (opts.method)                                                                          //
            this.method = opts.method;                                                            //
                                                                                                  //
        var self = this;                                                                          //
        this.addEventListener('complete', function() {                                            //
            if (!obj) return;                                                                     //
            if (typeof(obj) == 'function' && typeof(callPropertyName) == 'undefined') {           //
                obj.call(obj, self.request);                                                      //
            } else {                                                                              //
                obj[callPropertyName].call(obj, self.request);                                    //
            }                                                                                     //
        });                                                                                       //
                                                                                                  //
        this.load(uri, opts.data);                                                                //
    },                                                                                            //
    getXMLHttpRequest: function() {                                                               //
        var xhr;                                                                                  //
        var tryThese = [                                                                          //
            function () { return new XMLHttpRequest(); },                                         //
            function () { return new ActiveXObject('Msxml2.XMLHTTP'); },                          //
            function () { return new ActiveXObject('Microsoft.XMLHTTP'); },                       //
            function () { return new ActiveXObject('Msxml2.XMLHTTP.4.0'); }                       //
        ];                                                                                        //
        for (var i = 0; i < tryThese.length; i++) {                                               //
            var func = tryThese[i];                                                               //
            try {                                                                                 //
                xhr = func;                                                                       //
                return func();                                                                    //
            } catch (e) {                                                                         //
                //alert(e);                                                                       //
            }                                                                                     //
        }                                                                                         //
        return xhr;                                                                               //
    },                                                                                            //
    isSafeUri: function(uri) {                                                                    //
        if (uri.match(/^\w+:/) || uri.match(/^\/\//)) {                                           //
            if (uri.split('/')[2] == location.host) return true;                                  //
            else return false;                                                                    //
        } else if (uri.match(/^\/[^\/]/) || uri == '/') {                                         //
            return true;                                                                          //
        } else if (!uri || uri.length == 0) {                                                     //
            return false;                                                                         //
        }                                                                                         //
        return true;                                                                              //
    },                                                                                            //
    makePostData: function(data) {                                                                //
        var regexp = /%20/g;                                                                      //
        if (typeof data == 'string' || (data instanceof String)) {                                //
            return encodeURIComponent(data).replace(regexp, '+');                                 //
        }                                                                                         //
        var pairs = [];                                                                           //
        for (var k in data) {                                                                     //
            if (typeof data[k] == 'undefined') continue;                                          //
            var prefix = encodeURIComponent(k).replace(regexp, '+') + '=';                        //
            var values = Array.prototype.concat(data[k]);                                         //
            for (var i = 0; i < values.length; i++) {                                             //
                var pair = prefix + encodeURIComponent(values[i]).replace(regexp, '+');           //
                pairs.push(pair);                                                                 //
            }                                                                                     //
        }                                                                                         //
        return pairs.join('&');                                                                   //
    }                                                                                             //
},{                                                                                               //
    load: function(url, params) {                                                                 //
        var req = Ten.XHR.getXMLHttpRequest();                                                    //
        this.request = req;                                                                       //
                                                                                                  //
        var self = this;                                                                          //
        req.onreadystatechange = function() {                                                     //
            self.stateChangeHandler.call(self, req);                                              //
        };                                                                                        //
        params = params ? Ten.XHR.makePostData(params) : null;                                    //
                                                                                                  //
        req.open(this.method, url, true);                                                         //
        if (this.method == 'POST')                                                                //
            req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');            // 最常見的 POST 提交數據的方式.提交的數據按照 key1=val1&key2=val2 的方式進行編碼,key 和 val 都進行了 URL 轉碼。
        req.send(params);                                                                         //
    },                                                                                            //
    stateChangeHandler: function(req) {                                                           //
        this.dispatchEvent('state_change');                                                       //
                                                                                                  //
        if (req.readyState == 4) {                                                                //
            this.dispatchEvent('ready', req.status.toString());                                   //
                                                                                                  //
            if (req.status >= 200 && req.status < 300) {                                          //
                this.dispatchEvent('complete', req);                                              //
            } else {                                                                              //
                this.dispatchEvent('error', req);                                                 //
            }                                                                                     //
        }                                                                                         //
    }                                                                                             //
});                                                                                               //


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章