ls 5 years ago
parent
commit
c66a933968
1 changed files with 317 additions and 0 deletions
  1. 317 0
      xajax.js

+ 317 - 0
xajax.js

@@ -0,0 +1,317 @@
+/**
+ * @Module:      xajax.js
+ * @Version:     0.6.0 
+ * @Desc:        simple ajax class
+ * @Last Update: 2019-01-04
+ * @Author:      ls
+ * @E-Mail:      shucx@139.com
+ * @Site:        http://www.chuangxin1.com
+ * Copyright (c) 2007-2018
+ * Thanks dojo (http://dojotoolkit.org)
+ */
+
+if (typeof xajax !== 'object') {
+    xajax = { version: '0.6.0' };
+}
+
+(function() {
+    'use strict';
+
+    var _x = xajax,
+        _doc = window.document,
+        _enc = encodeURIComponent;
+
+    _x.ERR_OK = 0;
+    _x.ERR_EXCEPTION = 1;
+    _x.ERR_TIMEOUT = 2;
+
+    _x.CONTENT_TYPE_URL = 'application/x-www-form-urlencoded; charset=utf-8';
+    _x.CONTENT_TYPE_JSON = 'application/json; charset=utf-8';
+    _x.CONTENT_TYPE_XML = 'application/xml; charset=utf-8';
+
+
+    var _timeout = 0;
+
+    /* Not support IE6 */
+    _x.$ = function(selectors) {
+        return _doc.querySelector(selectors);
+    };
+
+    _x.$$ = function(selectors) {
+        return _doc.querySelectorAll(selectors);
+    };
+
+    _x.xhrObj = function() {
+        var _xhr = null;
+
+        if (window.XMLHttpRequest) { /* FireFox\Opera\Safari\Chrome\IE7+ ... */
+            try {
+                _xhr = new XMLHttpRequest();
+            } catch (ff) {}
+        } else if (window.ActiveXObject) { /* <= MSIE6 */
+            var xml = ['MSXML2.XMLHTTP.6.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP', 'Microsoft.XMLHTTP'];
+            for (var i = 0; i < 3; i++) {
+                try {
+                    _xhr = new ActiveXObject(xml[i]);
+                    break;
+                } catch (ie) {}
+            }
+        }
+
+        return _xhr;
+    };
+
+    _x._ioSetArgs = function(args) {
+        var ioArgs = { args: args, url: args.url };
+
+        ioArgs.async = (typeof args.async === 'undefined') ? true : false;
+        ioArgs.query = args.data || null;
+        ioArgs.headers = args.headers || null;
+        ioArgs.contentType = args.contentType || null;
+        ioArgs.handleAs = args.handleAs || 'text';
+        ioArgs.handle = args.handle || function(obj, ioargs) {};
+        ioArgs.error = args.error || null;
+        ioArgs.timeout = (args.timeout || _timeout) * 1000;
+        ioArgs.response = null;
+        ioArgs.status = 0;
+        ioArgs.err = null;
+        ioArgs.errno = _x.ERR_OK;
+
+        return ioArgs;
+    };
+
+    _x._ioResponse = function(ioArgs) {
+        var obj = null;
+
+        ioArgs.status = ioArgs.xhr.status;
+        ioArgs.response = ioArgs.xhr.responseText;
+        switch (ioArgs.handleAs) {
+            case 'text':
+                obj = ioArgs.response;
+                break;
+            case 'json':
+                try {
+                    obj = eval('(' + ioArgs.response + ')');
+                } catch (e) {
+                    ioArgs.err = e.description;
+                    ioArgs.errno = _x.ERR_EXCEPTION;
+                }
+                break;
+            case 'xml':
+                obj = ioArgs.xhr.responseXML;
+                break;
+            case 'javascript':
+                try {
+                    obj = eval(ioArgs.response);
+                } catch (e) {
+                    ioArgs.err = e.description;
+                    ioArgs.errno = _x.ERR_EXCEPTION;
+                }
+                break;
+            default:
+                obj = ioArgs.response;
+                break;
+        }
+
+        return obj;
+    };
+
+    _x._ioNotifyStart = function(ioArgs) {
+        if (ioArgs.timeout > 0) {
+            ioArgs.starttime = (new Date()).getTime();
+            ioArgs.objTimeout = setInterval(_x._ioInterval, 50);
+        }
+
+        ioArgs.xhr.onreadystatechange = function() {
+            if (ioArgs.xhr.readyState === 4) {
+                if (ioArgs.timeout > 0) {
+                    clearInterval(ioArgs.objTimeout);
+                }
+                ioArgs.handle(_x._ioResponse(ioArgs), ioArgs);
+            }
+        };
+    };
+
+    _x._ioInterval = function() {
+        var now = (new Date()).getTime();
+        if ((now - _x.ioArgs.starttime) > _x.ioArgs.timeout) {
+            _x.cancel();
+            _x.ioArgs.err = 'Timeout';
+            _x.ioArgs.errno = _x.ERR_TIMEOUT;
+            if (_x.ioArgs.error) {
+                _x.ioArgs.error(_x.ioArgs);
+            }
+        }
+    };
+
+    _x.xhr = function(method, args, hasBody) {
+        var xhr = null,
+            ioArgs = _x._ioSetArgs(args);
+
+        xhr = ioArgs.xhr = _x.xhrObj();
+        if (xhr === null) {
+            return (null);
+        }
+
+        _x.ioArgs = ioArgs;
+        try {
+            xhr.open(method, ioArgs.url, ioArgs.async);
+            _x._ioNotifyStart(ioArgs);
+            if (args.contentType) {
+                xhr.setRequestHeader('Content-Type', args.contentType);
+            }
+            if (args.headers) {
+                for (var hdr in args.headers) {
+                    xhr.setRequestHeader(hdr, args.headers[hdr]);
+                }
+            }
+            xhr.send(hasBody ? ioArgs.query : null);
+        } catch (e) {
+            _x.cancel();
+            ioArgs.err = e.description;
+            ioArgs.errno = _x.ERR_EXCEPTION;
+            if (ioArgs.error) {
+                ioArgs.error(ioArgs);
+            }
+        }
+
+        return ioArgs || null;
+    };
+
+    _x.cancel = function() {
+        if (_x.ioArgs.xhr) {
+            if (_x.ioArgs.timeout > 0) {
+                clearInterval(_x.ioArgs.objTimeout);
+            }
+            _x.ioArgs.xhr.abort();
+        }
+    };
+
+    _x.Get = function(args) {
+        return _x.xhr('GET', args, false);
+    };
+
+    _x.Head = function(args) {
+        return _x.xhr('HEAD', args, false);
+    };
+
+    _x.Post = function(args) {
+        args.contentType = args.contentType || _x.CONTENT_TYPE_URL;
+
+        return _x.xhr('POST', args, true);
+    };
+
+    _x.Put = function(args) {
+        args.contentType = args.contentType || _x.CONTENT_TYPE_URL;
+
+        return _x.xhr('PUT', args, true);
+    };
+
+    _x.Delete = function(args) {
+        args.contentType = args.contentType || _x.CONTENT_TYPE_URL;
+
+        return _x.xhr('DELETE', args, true);
+    };
+
+    _x.isArray = function(args) {
+        return args && (args instanceof Array || typeof args === 'array');
+    };
+
+    _x.isFunction = function(args) {
+        return args && (typeof args === 'function');
+    };
+
+    _x.setValue = function(obj, key, value) {
+        if (value === null) {
+            return;
+        }
+
+        var val = obj[key];
+        if (typeof val === 'string') { // inline'd type check
+            obj[key] = [val, value];
+        } else if (_x.isArray(val)) {
+            val.push(value);
+        } else {
+            obj[key] = value;
+        }
+    };
+
+    _x.fieldToObject = function(item) {
+        var obj = null;
+
+        if (item) {
+            var name = item.name,
+                type = (item.type || '').toLowerCase();
+            if (name && type && !item.disabled) {
+                if (type === 'radio' || type === 'checkbox') {
+                    if (item.checked) {
+                        obj = item.value;
+                    }
+                } else if (item.multiple) {
+                    obj = [];
+                    var opt = item.options,
+                        n = opt.length;
+                    for (var i = 0; i < n; i++) {
+                        if (opt[i].selected) {
+                            obj.push(opt.value);
+                        }
+                    }
+                } else {
+                    obj = item.value;
+                }
+            }
+        }
+
+        return obj; // Object
+    };
+
+    _x.objectToQuery = function(obj) {
+        var pairs = [],
+            backstop = {};
+
+        for (var key in obj) {
+            var value = obj[key];
+            if (value !== backstop[key]) {
+                var assign = _enc(key) + '=';
+                if (_x.isArray(value)) {
+                    for (var i = 0, n = value.length; i < n; i++) {
+                        pairs.push(assign + _enc(value[i]));
+                    }
+                } else {
+                    pairs.push(assign + _enc(value));
+                }
+            }
+        }
+
+        return pairs.join('&'); // String
+    };
+
+    _x.formToObject = function(obj) {
+        if (!obj) {
+            return null;
+        }
+
+        var el = obj.elements,
+            n = el.length,
+            s = {},
+            exclude = 'file|submit|image|reset|button|';
+        for (var i = 0; i < n; i++) {
+            var item = el[i],
+                name = item.name,
+                type = (item.type || '').toLowerCase();
+            if (name && type && exclude.indexOf(type) === -1 && !item.disabled) {
+                _x.setValue(s, name, _x.fieldToObject(item));
+            }
+        }
+
+        return s;
+    };
+
+    _x.formToQuery = function(obj) {
+        if (!obj) {
+            return null;
+        }
+
+        return _x.objectToQuery(_x.formToObject(obj));
+    };
+})();