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