|
@@ -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));
|
|
|
|
+ };
|
|
|
|
+})();
|