api.js 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607
  1. /*
  2. * APICloud JavaScript Library
  3. * Copyright (c) 2014 apicloud.com
  4. */
  5. (function(window){
  6. var u = {};
  7. var isAndroid = (/android/gi).test(navigator.appVersion);
  8. var uzStorage = function(){
  9. var ls = window.localStorage;
  10. if(isAndroid){
  11. ls = os.localStorage();
  12. }
  13. return ls;
  14. };
  15. function parseArguments(url, data, fnSuc, dataType) {
  16. if (typeof(data) == 'function') {
  17. dataType = fnSuc;
  18. fnSuc = data;
  19. data = undefined;
  20. }
  21. if (typeof(fnSuc) != 'function') {
  22. dataType = fnSuc;
  23. fnSuc = undefined;
  24. }
  25. return {
  26. url: url,
  27. data: data,
  28. fnSuc: fnSuc,
  29. dataType: dataType
  30. };
  31. }
  32. u.trim = function(str){
  33. if(String.prototype.trim){
  34. return str == null ? "" : String.prototype.trim.call(str);
  35. }else{
  36. return str.replace(/(^\s*)|(\s*$)/g, "");
  37. }
  38. };
  39. u.trimAll = function(str){
  40. return str.replace(/\s*/g,'');
  41. };
  42. u.isElement = function(obj){
  43. return !!(obj && obj.nodeType == 1);
  44. };
  45. u.isArray = function(obj){
  46. if(Array.isArray){
  47. return Array.isArray(obj);
  48. }else{
  49. return obj instanceof Array;
  50. }
  51. };
  52. u.isEmptyObject = function(obj){
  53. if(JSON.stringify(obj) === '{}'){
  54. return true;
  55. }
  56. return false;
  57. };
  58. u.addEvt = function(el, name, fn, useCapture){
  59. if(!u.isElement(el)){
  60. console.warn('$api.addEvt Function need el param, el param must be DOM Element');
  61. return;
  62. }
  63. useCapture = useCapture || false;
  64. if(el.addEventListener) {
  65. el.addEventListener(name, fn, useCapture);
  66. }
  67. };
  68. u.rmEvt = function(el, name, fn, useCapture){
  69. if(!u.isElement(el)){
  70. console.warn('$api.rmEvt Function need el param, el param must be DOM Element');
  71. return;
  72. }
  73. useCapture = useCapture || false;
  74. if (el.removeEventListener) {
  75. el.removeEventListener(name, fn, useCapture);
  76. }
  77. };
  78. u.one = function(el, name, fn, useCapture){
  79. if(!u.isElement(el)){
  80. console.warn('$api.one Function need el param, el param must be DOM Element');
  81. return;
  82. }
  83. useCapture = useCapture || false;
  84. var that = this;
  85. var cb = function(){
  86. fn && fn();
  87. that.rmEvt(el, name, cb, useCapture);
  88. };
  89. that.addEvt(el, name, cb, useCapture);
  90. };
  91. u.dom = function(el, selector){
  92. if(arguments.length === 1 && typeof arguments[0] == 'string'){
  93. if(document.querySelector){
  94. return document.querySelector(arguments[0]);
  95. }
  96. }else if(arguments.length === 2){
  97. if(el.querySelector){
  98. return el.querySelector(selector);
  99. }
  100. }
  101. };
  102. u.domAll = function(el, selector){
  103. if(arguments.length === 1 && typeof arguments[0] == 'string'){
  104. if(document.querySelectorAll){
  105. return document.querySelectorAll(arguments[0]);
  106. }
  107. }else if(arguments.length === 2){
  108. if(el.querySelectorAll){
  109. return el.querySelectorAll(selector);
  110. }
  111. }
  112. };
  113. u.byId = function(id){
  114. return document.getElementById(id);
  115. };
  116. u.first = function(el, selector){
  117. if(arguments.length === 1){
  118. if(!u.isElement(el)){
  119. console.warn('$api.first Function need el param, el param must be DOM Element');
  120. return;
  121. }
  122. return el.children[0];
  123. }
  124. if(arguments.length === 2){
  125. return this.dom(el, selector+':first-child');
  126. }
  127. };
  128. u.last = function(el, selector){
  129. if(arguments.length === 1){
  130. if(!u.isElement(el)){
  131. console.warn('$api.last Function need el param, el param must be DOM Element');
  132. return;
  133. }
  134. var children = el.children;
  135. return children[children.length - 1];
  136. }
  137. if(arguments.length === 2){
  138. return this.dom(el, selector+':last-child');
  139. }
  140. };
  141. u.eq = function(el, index){
  142. return this.dom(el, ':nth-child('+ index +')');
  143. };
  144. u.not = function(el, selector){
  145. return this.domAll(el, ':not('+ selector +')');
  146. };
  147. u.prev = function(el){
  148. if(!u.isElement(el)){
  149. console.warn('$api.prev Function need el param, el param must be DOM Element');
  150. return;
  151. }
  152. var node = el.previousSibling;
  153. if(node.nodeType && node.nodeType === 3){
  154. node = node.previousSibling;
  155. return node;
  156. }
  157. };
  158. u.next = function(el){
  159. if(!u.isElement(el)){
  160. console.warn('$api.next Function need el param, el param must be DOM Element');
  161. return;
  162. }
  163. var node = el.nextSibling;
  164. if(node.nodeType && node.nodeType === 3){
  165. node = node.nextSibling;
  166. return node;
  167. }
  168. };
  169. u.closest = function(el, selector){
  170. if(!u.isElement(el)){
  171. console.warn('$api.closest Function need el param, el param must be DOM Element');
  172. return;
  173. }
  174. var doms, targetDom;
  175. var isSame = function(doms, el){
  176. var i = 0, len = doms.length;
  177. for(i; i<len; i++){
  178. if(doms[i].isEqualNode(el)){
  179. return doms[i];
  180. }
  181. }
  182. return false;
  183. };
  184. var traversal = function(el, selector){
  185. doms = u.domAll(el.parentNode, selector);
  186. targetDom = isSame(doms, el);
  187. while(!targetDom){
  188. el = el.parentNode;
  189. if(el != null && el.nodeType == el.DOCUMENT_NODE){
  190. return false;
  191. }
  192. traversal(el, selector);
  193. }
  194. return targetDom;
  195. };
  196. return traversal(el, selector);
  197. };
  198. u.contains = function(parent,el){
  199. var mark = false;
  200. if(el === parent){
  201. mark = true;
  202. return mark;
  203. }else{
  204. do{
  205. el = el.parentNode;
  206. if(el === parent){
  207. mark = true;
  208. return mark;
  209. }
  210. }while(el === document.body || el === document.documentElement);
  211. return mark;
  212. }
  213. };
  214. u.remove = function(el){
  215. if(el && el.parentNode){
  216. el.parentNode.removeChild(el);
  217. }
  218. };
  219. u.attr = function(el, name, value){
  220. if(!u.isElement(el)){
  221. console.warn('$api.attr Function need el param, el param must be DOM Element');
  222. return;
  223. }
  224. if(arguments.length == 2){
  225. return el.getAttribute(name);
  226. }else if(arguments.length == 3){
  227. el.setAttribute(name, value);
  228. return el;
  229. }
  230. };
  231. u.removeAttr = function(el, name){
  232. if(!u.isElement(el)){
  233. console.warn('$api.removeAttr Function need el param, el param must be DOM Element');
  234. return;
  235. }
  236. if(arguments.length === 2){
  237. el.removeAttribute(name);
  238. }
  239. };
  240. u.hasCls = function(el, cls){
  241. if(!u.isElement(el)){
  242. console.warn('$api.hasCls Function need el param, el param must be DOM Element');
  243. return;
  244. }
  245. if(el.className.indexOf(cls) > -1){
  246. return true;
  247. }else{
  248. return false;
  249. }
  250. };
  251. u.addCls = function(el, cls){
  252. if(!u.isElement(el)){
  253. console.warn('$api.addCls Function need el param, el param must be DOM Element');
  254. return;
  255. }
  256. if('classList' in el){
  257. el.classList.add(cls);
  258. }else{
  259. var preCls = el.className;
  260. var newCls = preCls +' '+ cls;
  261. el.className = newCls;
  262. }
  263. return el;
  264. };
  265. u.removeCls = function(el, cls){
  266. if(!u.isElement(el)){
  267. console.warn('$api.removeCls Function need el param, el param must be DOM Element');
  268. return;
  269. }
  270. if('classList' in el){
  271. el.classList.remove(cls);
  272. }else{
  273. var preCls = el.className;
  274. var newCls = preCls.replace(cls, '');
  275. el.className = newCls;
  276. }
  277. return el;
  278. };
  279. u.toggleCls = function(el, cls){
  280. if(!u.isElement(el)){
  281. console.warn('$api.toggleCls Function need el param, el param must be DOM Element');
  282. return;
  283. }
  284. if('classList' in el){
  285. el.classList.toggle(cls);
  286. }else{
  287. if(u.hasCls(el, cls)){
  288. u.removeCls(el, cls);
  289. }else{
  290. u.addCls(el, cls);
  291. }
  292. }
  293. return el;
  294. };
  295. u.val = function(el, val){
  296. if(!u.isElement(el)){
  297. console.warn('$api.val Function need el param, el param must be DOM Element');
  298. return;
  299. }
  300. if(arguments.length === 1){
  301. switch(el.tagName){
  302. case 'SELECT':
  303. var value = el.options[el.selectedIndex].value;
  304. return value;
  305. break;
  306. case 'INPUT':
  307. return el.value;
  308. break;
  309. case 'TEXTAREA':
  310. return el.value;
  311. break;
  312. }
  313. }
  314. if(arguments.length === 2){
  315. switch(el.tagName){
  316. case 'SELECT':
  317. el.options[el.selectedIndex].value = val;
  318. return el;
  319. break;
  320. case 'INPUT':
  321. el.value = val;
  322. return el;
  323. break;
  324. case 'TEXTAREA':
  325. el.value = val;
  326. return el;
  327. break;
  328. }
  329. }
  330. };
  331. u.prepend = function(el, html){
  332. if(!u.isElement(el)){
  333. console.warn('$api.prepend Function need el param, el param must be DOM Element');
  334. return;
  335. }
  336. el.insertAdjacentHTML('afterbegin', html);
  337. return el;
  338. };
  339. u.append = function(el, html){
  340. if(!u.isElement(el)){
  341. console.warn('$api.append Function need el param, el param must be DOM Element');
  342. return;
  343. }
  344. el.insertAdjacentHTML('beforeend', html);
  345. return el;
  346. };
  347. u.before = function(el, html){
  348. if(!u.isElement(el)){
  349. console.warn('$api.before Function need el param, el param must be DOM Element');
  350. return;
  351. }
  352. el.insertAdjacentHTML('beforebegin', html);
  353. return el;
  354. };
  355. u.after = function(el, html){
  356. if(!u.isElement(el)){
  357. console.warn('$api.after Function need el param, el param must be DOM Element');
  358. return;
  359. }
  360. el.insertAdjacentHTML('afterend', html);
  361. return el;
  362. };
  363. u.html = function(el, html){
  364. if(!u.isElement(el)){
  365. console.warn('$api.html Function need el param, el param must be DOM Element');
  366. return;
  367. }
  368. if(arguments.length === 1){
  369. return el.innerHTML;
  370. }else if(arguments.length === 2){
  371. el.innerHTML = html;
  372. return el;
  373. }
  374. };
  375. u.text = function(el, txt){
  376. if(!u.isElement(el)){
  377. console.warn('$api.text Function need el param, el param must be DOM Element');
  378. return;
  379. }
  380. if(arguments.length === 1){
  381. return el.textContent;
  382. }else if(arguments.length === 2){
  383. el.textContent = txt;
  384. return el;
  385. }
  386. };
  387. u.offset = function(el){
  388. if(!u.isElement(el)){
  389. console.warn('$api.offset Function need el param, el param must be DOM Element');
  390. return;
  391. }
  392. var sl = Math.max(document.documentElement.scrollLeft, document.body.scrollLeft);
  393. var st = Math.max(document.documentElement.scrollTop, document.body.scrollTop);
  394. var rect = el.getBoundingClientRect();
  395. return {
  396. l: rect.left + sl,
  397. t: rect.top + st,
  398. w: el.offsetWidth,
  399. h: el.offsetHeight
  400. };
  401. };
  402. u.css = function(el, css){
  403. if(!u.isElement(el)){
  404. console.warn('$api.css Function need el param, el param must be DOM Element');
  405. return;
  406. }
  407. if(typeof css == 'string' && css.indexOf(':') > 0){
  408. el.style && (el.style.cssText += ';' + css);
  409. }
  410. };
  411. u.cssVal = function(el, prop){
  412. if(!u.isElement(el)){
  413. console.warn('$api.cssVal Function need el param, el param must be DOM Element');
  414. return;
  415. }
  416. if(arguments.length === 2){
  417. var computedStyle = window.getComputedStyle(el, null);
  418. return computedStyle.getPropertyValue(prop);
  419. }
  420. };
  421. u.jsonToStr = function(json){
  422. if(typeof json === 'object'){
  423. return JSON && JSON.stringify(json);
  424. }
  425. };
  426. u.strToJson = function(str){
  427. if(typeof str === 'string'){
  428. return JSON && JSON.parse(str);
  429. }
  430. };
  431. u.setStorage = function(key, value){
  432. if(arguments.length === 2){
  433. var v = value;
  434. if(typeof v == 'object'){
  435. v = JSON.stringify(v);
  436. v = 'obj-'+ v;
  437. }else{
  438. v = 'str-'+ v;
  439. }
  440. var ls = uzStorage();
  441. if(ls){
  442. ls.setItem(key, v);
  443. }
  444. }
  445. };
  446. u.getStorage = function(key){
  447. var ls = uzStorage();
  448. if(ls){
  449. var v = ls.getItem(key);
  450. if(!v){return;}
  451. if(v.indexOf('obj-') === 0){
  452. v = v.slice(4);
  453. return JSON.parse(v);
  454. }else if(v.indexOf('str-') === 0){
  455. return v.slice(4);
  456. }
  457. }
  458. };
  459. u.rmStorage = function(key){
  460. var ls = uzStorage();
  461. if(ls && key){
  462. ls.removeItem(key);
  463. }
  464. };
  465. u.clearStorage = function(){
  466. var ls = uzStorage();
  467. if(ls){
  468. ls.clear();
  469. }
  470. };
  471. /*by king*/
  472. u.fixIos7Bar = function(el){
  473. if(!u.isElement(el)){
  474. console.warn('$api.fixIos7Bar Function need el param, el param must be DOM Element');
  475. return;
  476. }
  477. var strDM = api.systemType;
  478. if (strDM == 'ios') {
  479. var strSV = api.systemVersion;
  480. var numSV = parseInt(strSV,10);
  481. var fullScreen = api.fullScreen;
  482. var iOS7StatusBarAppearance = api.iOS7StatusBarAppearance;
  483. if (numSV >= 7 && !fullScreen && iOS7StatusBarAppearance) {
  484. el.style.paddingTop = '20px';
  485. }
  486. }
  487. };
  488. u.fixStatusBar = function(el){
  489. if(!u.isElement(el)){
  490. console.warn('$api.fixStatusBar Function need el param, el param must be DOM Element');
  491. return;
  492. }
  493. var sysType = api.systemType;
  494. if(sysType == 'ios'){
  495. u.fixIos7Bar(el);
  496. }else if(sysType == 'android'){
  497. var ver = api.systemVersion;
  498. ver = parseFloat(ver);
  499. if(ver >= 4.4){
  500. el.style.paddingTop = '25px';
  501. }
  502. }
  503. };
  504. u.toast = function(title, text, time){
  505. var opts = {};
  506. var show = function(opts, time){
  507. api.showProgress(opts);
  508. setTimeout(function(){
  509. api.hideProgress();
  510. },time);
  511. };
  512. if(arguments.length === 1){
  513. var time = time || 500;
  514. if(typeof title === 'number'){
  515. time = title;
  516. }else{
  517. opts.title = title+'';
  518. }
  519. show(opts, time);
  520. }else if(arguments.length === 2){
  521. var time = time || 500;
  522. var text = text;
  523. if(typeof text === "number"){
  524. var tmp = text;
  525. time = tmp;
  526. text = null;
  527. }
  528. if(title){
  529. opts.title = title;
  530. }
  531. if(text){
  532. opts.text = text;
  533. }
  534. show(opts, time);
  535. }
  536. if(title){
  537. opts.title = title;
  538. }
  539. if(text){
  540. opts.text = text;
  541. }
  542. time = time || 500;
  543. show(opts, time);
  544. };
  545. u.post = function(/*url,data,fnSuc,dataType*/){
  546. var argsToJson = parseArguments.apply(null, arguments);
  547. var json = {};
  548. var fnSuc = argsToJson.fnSuc;
  549. argsToJson.url && (json.url = argsToJson.url);
  550. argsToJson.data && (json.data = argsToJson.data);
  551. if(argsToJson.dataType){
  552. var type = argsToJson.dataType.toLowerCase();
  553. if (type == 'text'||type == 'json') {
  554. json.dataType = type;
  555. }
  556. }else{
  557. json.dataType = 'json';
  558. }
  559. json.method = 'post';
  560. api.ajax(json,
  561. function(ret,err){
  562. if (ret) {
  563. fnSuc && fnSuc(ret);
  564. }
  565. }
  566. );
  567. };
  568. u.get = function(/*url,fnSuc,dataType*/){
  569. var argsToJson = parseArguments.apply(null, arguments);
  570. var json = {};
  571. var fnSuc = argsToJson.fnSuc;
  572. argsToJson.url && (json.url = argsToJson.url);
  573. //argsToJson.data && (json.data = argsToJson.data);
  574. if(argsToJson.dataType){
  575. var type = argsToJson.dataType.toLowerCase();
  576. if (type == 'text'||type == 'json') {
  577. json.dataType = type;
  578. }
  579. }else{
  580. json.dataType = 'text';
  581. }
  582. json.method = 'get';
  583. api.ajax(json,
  584. function(ret,err){
  585. if (ret) {
  586. fnSuc && fnSuc(ret);
  587. }
  588. }
  589. );
  590. };
  591. /*end*/
  592. window.$api = u;
  593. })(window);