xajax.js 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317
  1. /**
  2. * @Module: xajax.js
  3. * @Version: 0.6.0
  4. * @Desc: simple ajax class
  5. * @Last Update: 2019-01-04
  6. * @Author: ls
  7. * @E-Mail: shucx@139.com
  8. * @Site: http://www.chuangxin1.com
  9. * Copyright (c) 2007-2018
  10. * Thanks dojo (http://dojotoolkit.org)
  11. */
  12. if (typeof xajax !== 'object') {
  13. xajax = { version: '0.6.0' };
  14. }
  15. (function() {
  16. 'use strict';
  17. var _x = xajax,
  18. _doc = window.document,
  19. _enc = encodeURIComponent;
  20. _x.ERR_OK = 0;
  21. _x.ERR_EXCEPTION = 1;
  22. _x.ERR_TIMEOUT = 2;
  23. _x.CONTENT_TYPE_URL = 'application/x-www-form-urlencoded; charset=utf-8';
  24. _x.CONTENT_TYPE_JSON = 'application/json; charset=utf-8';
  25. _x.CONTENT_TYPE_XML = 'application/xml; charset=utf-8';
  26. var _timeout = 0;
  27. /* Not support IE6 */
  28. _x.$ = function(selectors) {
  29. return _doc.querySelector(selectors);
  30. };
  31. _x.$$ = function(selectors) {
  32. return _doc.querySelectorAll(selectors);
  33. };
  34. _x.xhrObj = function() {
  35. var _xhr = null;
  36. if (window.XMLHttpRequest) { /* FireFox\Opera\Safari\Chrome\IE7+ ... */
  37. try {
  38. _xhr = new XMLHttpRequest();
  39. } catch (ff) {}
  40. } else if (window.ActiveXObject) { /* <= MSIE6 */
  41. var xml = ['MSXML2.XMLHTTP.6.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP', 'Microsoft.XMLHTTP'];
  42. for (var i = 0; i < 3; i++) {
  43. try {
  44. _xhr = new ActiveXObject(xml[i]);
  45. break;
  46. } catch (ie) {}
  47. }
  48. }
  49. return _xhr;
  50. };
  51. _x._ioSetArgs = function(args) {
  52. var ioArgs = { args: args, url: args.url };
  53. ioArgs.async = (typeof args.async === 'undefined') ? true : false;
  54. ioArgs.query = args.data || null;
  55. ioArgs.headers = args.headers || null;
  56. ioArgs.contentType = args.contentType || null;
  57. ioArgs.handleAs = args.handleAs || 'text';
  58. ioArgs.handle = args.handle || function(obj, ioargs) {};
  59. ioArgs.error = args.error || null;
  60. ioArgs.timeout = (args.timeout || _timeout) * 1000;
  61. ioArgs.response = null;
  62. ioArgs.status = 0;
  63. ioArgs.err = null;
  64. ioArgs.errno = _x.ERR_OK;
  65. return ioArgs;
  66. };
  67. _x._ioResponse = function(ioArgs) {
  68. var obj = null;
  69. ioArgs.status = ioArgs.xhr.status;
  70. ioArgs.response = ioArgs.xhr.responseText;
  71. switch (ioArgs.handleAs) {
  72. case 'text':
  73. obj = ioArgs.response;
  74. break;
  75. case 'json':
  76. try {
  77. obj = eval('(' + ioArgs.response + ')');
  78. } catch (e) {
  79. ioArgs.err = e.description;
  80. ioArgs.errno = _x.ERR_EXCEPTION;
  81. }
  82. break;
  83. case 'xml':
  84. obj = ioArgs.xhr.responseXML;
  85. break;
  86. case 'javascript':
  87. try {
  88. obj = eval(ioArgs.response);
  89. } catch (e) {
  90. ioArgs.err = e.description;
  91. ioArgs.errno = _x.ERR_EXCEPTION;
  92. }
  93. break;
  94. default:
  95. obj = ioArgs.response;
  96. break;
  97. }
  98. return obj;
  99. };
  100. _x._ioNotifyStart = function(ioArgs) {
  101. if (ioArgs.timeout > 0) {
  102. ioArgs.starttime = (new Date()).getTime();
  103. ioArgs.objTimeout = setInterval(_x._ioInterval, 50);
  104. }
  105. ioArgs.xhr.onreadystatechange = function() {
  106. if (ioArgs.xhr.readyState === 4) {
  107. if (ioArgs.timeout > 0) {
  108. clearInterval(ioArgs.objTimeout);
  109. }
  110. ioArgs.handle(_x._ioResponse(ioArgs), ioArgs);
  111. }
  112. };
  113. };
  114. _x._ioInterval = function() {
  115. var now = (new Date()).getTime();
  116. if ((now - _x.ioArgs.starttime) > _x.ioArgs.timeout) {
  117. _x.cancel();
  118. _x.ioArgs.err = 'Timeout';
  119. _x.ioArgs.errno = _x.ERR_TIMEOUT;
  120. if (_x.ioArgs.error) {
  121. _x.ioArgs.error(_x.ioArgs);
  122. }
  123. }
  124. };
  125. _x.xhr = function(method, args, hasBody) {
  126. var xhr = null,
  127. ioArgs = _x._ioSetArgs(args);
  128. xhr = ioArgs.xhr = _x.xhrObj();
  129. if (xhr === null) {
  130. return (null);
  131. }
  132. _x.ioArgs = ioArgs;
  133. try {
  134. xhr.open(method, ioArgs.url, ioArgs.async);
  135. _x._ioNotifyStart(ioArgs);
  136. if (args.contentType) {
  137. xhr.setRequestHeader('Content-Type', args.contentType);
  138. }
  139. if (args.headers) {
  140. for (var hdr in args.headers) {
  141. xhr.setRequestHeader(hdr, args.headers[hdr]);
  142. }
  143. }
  144. xhr.send(hasBody ? ioArgs.query : null);
  145. } catch (e) {
  146. _x.cancel();
  147. ioArgs.err = e.description;
  148. ioArgs.errno = _x.ERR_EXCEPTION;
  149. if (ioArgs.error) {
  150. ioArgs.error(ioArgs);
  151. }
  152. }
  153. return ioArgs || null;
  154. };
  155. _x.cancel = function() {
  156. if (_x.ioArgs.xhr) {
  157. if (_x.ioArgs.timeout > 0) {
  158. clearInterval(_x.ioArgs.objTimeout);
  159. }
  160. _x.ioArgs.xhr.abort();
  161. }
  162. };
  163. _x.Get = function(args) {
  164. return _x.xhr('GET', args, false);
  165. };
  166. _x.Head = function(args) {
  167. return _x.xhr('HEAD', args, false);
  168. };
  169. _x.Post = function(args) {
  170. args.contentType = args.contentType || _x.CONTENT_TYPE_URL;
  171. return _x.xhr('POST', args, true);
  172. };
  173. _x.Put = function(args) {
  174. args.contentType = args.contentType || _x.CONTENT_TYPE_URL;
  175. return _x.xhr('PUT', args, true);
  176. };
  177. _x.Delete = function(args) {
  178. args.contentType = args.contentType || _x.CONTENT_TYPE_URL;
  179. return _x.xhr('DELETE', args, true);
  180. };
  181. _x.isArray = function(args) {
  182. return args && (args instanceof Array || typeof args === 'array');
  183. };
  184. _x.isFunction = function(args) {
  185. return args && (typeof args === 'function');
  186. };
  187. _x.setValue = function(obj, key, value) {
  188. if (value === null) {
  189. return;
  190. }
  191. var val = obj[key];
  192. if (typeof val === 'string') { // inline'd type check
  193. obj[key] = [val, value];
  194. } else if (_x.isArray(val)) {
  195. val.push(value);
  196. } else {
  197. obj[key] = value;
  198. }
  199. };
  200. _x.fieldToObject = function(item) {
  201. var obj = null;
  202. if (item) {
  203. var name = item.name,
  204. type = (item.type || '').toLowerCase();
  205. if (name && type && !item.disabled) {
  206. if (type === 'radio' || type === 'checkbox') {
  207. if (item.checked) {
  208. obj = item.value;
  209. }
  210. } else if (item.multiple) {
  211. obj = [];
  212. var opt = item.options,
  213. n = opt.length;
  214. for (var i = 0; i < n; i++) {
  215. if (opt[i].selected) {
  216. obj.push(opt.value);
  217. }
  218. }
  219. } else {
  220. obj = item.value;
  221. }
  222. }
  223. }
  224. return obj; // Object
  225. };
  226. _x.objectToQuery = function(obj) {
  227. var pairs = [],
  228. backstop = {};
  229. for (var key in obj) {
  230. var value = obj[key];
  231. if (value !== backstop[key]) {
  232. var assign = _enc(key) + '=';
  233. if (_x.isArray(value)) {
  234. for (var i = 0, n = value.length; i < n; i++) {
  235. pairs.push(assign + _enc(value[i]));
  236. }
  237. } else {
  238. pairs.push(assign + _enc(value));
  239. }
  240. }
  241. }
  242. return pairs.join('&'); // String
  243. };
  244. _x.formToObject = function(obj) {
  245. if (!obj) {
  246. return null;
  247. }
  248. var el = obj.elements,
  249. n = el.length,
  250. s = {},
  251. exclude = 'file|submit|image|reset|button|';
  252. for (var i = 0; i < n; i++) {
  253. var item = el[i],
  254. name = item.name,
  255. type = (item.type || '').toLowerCase();
  256. if (name && type && exclude.indexOf(type) === -1 && !item.disabled) {
  257. _x.setValue(s, name, _x.fieldToObject(item));
  258. }
  259. }
  260. return s;
  261. };
  262. _x.formToQuery = function(obj) {
  263. if (!obj) {
  264. return null;
  265. }
  266. return _x.objectToQuery(_x.formToObject(obj));
  267. };
  268. })();