CTLELE/script/api.js

591 lines
18 KiB
JavaScript

/*
* APICloud JavaScript Library
* Copyright (c) 2014 apicloud.com
*/
(function(window) {
var u = {};
var isAndroid = (/android/gi).test(navigator.appVersion);
var uzStorage = function() {
var ls = window.localStorage;
if (isAndroid) {
ls = os.localStorage();
}
return ls;
};
function parseArguments(url, data, fnSuc, dataType) {
if (typeof(data) == 'function') {
dataType = fnSuc;
fnSuc = data;
data = undefined;
}
if (typeof(fnSuc) != 'function') {
dataType = fnSuc;
fnSuc = undefined;
}
return {
url: url,
data: data,
fnSuc: fnSuc,
dataType: dataType
};
}
u.trim = function(str) {
if (String.prototype.trim) {
return str == null ? "" : String.prototype.trim.call(str);
} else {
return str.replace(/(^\s*)|(\s*$)/g, "");
}
};
u.trimAll = function(str) {
return str.replace(/\s*/g, '');
};
u.isElement = function(obj) {
return !!(obj && obj.nodeType == 1);
};
u.isArray = function(obj) {
if (Array.isArray) {
return Array.isArray(obj);
} else {
return obj instanceof Array;
}
};
u.isEmptyObject = function(obj) {
if (JSON.stringify(obj) === '{}') {
return true;
}
return false;
};
u.addEvt = function(el, name, fn, useCapture) {
if (!u.isElement(el)) {
console.warn('$api.addEvt Function need el param, el param must be DOM Element');
return;
}
useCapture = useCapture || false;
if (el.addEventListener) {
el.addEventListener(name, fn, useCapture);
}
};
u.rmEvt = function(el, name, fn, useCapture) {
if (!u.isElement(el)) {
console.warn('$api.rmEvt Function need el param, el param must be DOM Element');
return;
}
useCapture = useCapture || false;
if (el.removeEventListener) {
el.removeEventListener(name, fn, useCapture);
}
};
u.one = function(el, name, fn, useCapture) {
if (!u.isElement(el)) {
console.warn('$api.one Function need el param, el param must be DOM Element');
return;
}
useCapture = useCapture || false;
var that = this;
var cb = function() {
fn && fn();
that.rmEvt(el, name, cb, useCapture);
};
that.addEvt(el, name, cb, useCapture);
};
u.dom = function(el, selector) {
if (arguments.length === 1 && typeof arguments[0] == 'string') {
if (document.querySelector) {
return document.querySelector(arguments[0]);
}
} else if (arguments.length === 2) {
if (el.querySelector) {
return el.querySelector(selector);
}
}
};
u.domAll = function(el, selector) {
if (arguments.length === 1 && typeof arguments[0] == 'string') {
if (document.querySelectorAll) {
return document.querySelectorAll(arguments[0]);
}
} else if (arguments.length === 2) {
if (el.querySelectorAll) {
return el.querySelectorAll(selector);
}
}
};
u.byId = function(id) {
return document.getElementById(id);
};
u.first = function(el, selector) {
if (arguments.length === 1) {
if (!u.isElement(el)) {
console.warn('$api.first Function need el param, el param must be DOM Element');
return;
}
return el.children[0];
}
if (arguments.length === 2) {
return this.dom(el, selector + ':first-child');
}
};
u.last = function(el, selector) {
if (arguments.length === 1) {
if (!u.isElement(el)) {
console.warn('$api.last Function need el param, el param must be DOM Element');
return;
}
var children = el.children;
return children[children.length - 1];
}
if (arguments.length === 2) {
return this.dom(el, selector + ':last-child');
}
};
u.eq = function(el, index) {
return this.dom(el, ':nth-child(' + index + ')');
};
u.not = function(el, selector) {
return this.domAll(el, ':not(' + selector + ')');
};
u.prev = function(el) {
if (!u.isElement(el)) {
console.warn('$api.prev Function need el param, el param must be DOM Element');
return;
}
var node = el.previousSibling;
if (node.nodeType && node.nodeType === 3) {
node = node.previousSibling;
return node;
}
};
u.next = function(el) {
if (!u.isElement(el)) {
console.warn('$api.next Function need el param, el param must be DOM Element');
return;
}
var node = el.nextSibling;
if (node.nodeType && node.nodeType === 3) {
node = node.nextSibling;
return node;
}
};
u.closest = function(el, selector) {
if (!u.isElement(el)) {
console.warn('$api.closest Function need el param, el param must be DOM Element');
return;
}
var doms, targetDom;
var isSame = function(doms, el) {
var i = 0,
len = doms.length;
for (i; i < len; i++) {
if (doms[i].isSameNode(el)) {
return doms[i];
}
}
return false;
};
var traversal = function(el, selector) {
doms = u.domAll(el.parentNode, selector);
targetDom = isSame(doms, el);
while (!targetDom) {
el = el.parentNode;
if (el != null && el.nodeType == el.DOCUMENT_NODE) {
return false;
}
traversal(el, selector);
}
return targetDom;
};
return traversal(el, selector);
};
u.contains = function(parent, el) {
var mark = false;
if (el === parent) {
mark = true;
return mark;
} else {
do {
el = el.parentNode;
if (el === parent) {
mark = true;
return mark;
}
} while (el === document.body || el === document.documentElement);
return mark;
}
};
u.remove = function(el) {
if (el && el.parentNode) {
el.parentNode.removeChild(el);
}
};
u.attr = function(el, name, value) {
if (!u.isElement(el)) {
console.warn('$api.attr Function need el param, el param must be DOM Element');
return;
}
if (arguments.length == 2) {
return el.getAttribute(name);
} else if (arguments.length == 3) {
el.setAttribute(name, value);
return el;
}
};
u.removeAttr = function(el, name) {
if (!u.isElement(el)) {
console.warn('$api.removeAttr Function need el param, el param must be DOM Element');
return;
}
if (arguments.length === 2) {
el.removeAttribute(name);
}
};
u.hasCls = function(el, cls) {
if (!u.isElement(el)) {
console.warn('$api.hasCls Function need el param, el param must be DOM Element');
return;
}
if (el.className.indexOf(cls) > -1) {
return true;
} else {
return false;
}
};
u.addCls = function(el, cls) {
if (!u.isElement(el)) {
console.warn('$api.addCls Function need el param, el param must be DOM Element');
return;
}
if ('classList' in el) {
el.classList.add(cls);
} else {
var preCls = el.className;
var newCls = preCls + ' ' + cls;
el.className = newCls;
}
return el;
};
u.removeCls = function(el, cls) {
if (!u.isElement(el)) {
console.warn('$api.removeCls Function need el param, el param must be DOM Element');
return;
}
if ('classList' in el) {
el.classList.remove(cls);
} else {
var preCls = el.className;
var newCls = preCls.replace(cls, '');
el.className = newCls;
}
return el;
};
u.toggleCls = function(el, cls) {
if (!u.isElement(el)) {
console.warn('$api.toggleCls Function need el param, el param must be DOM Element');
return;
}
if ('classList' in el) {
el.classList.toggle(cls);
} else {
if (u.hasCls(el, cls)) {
u.removeCls(el, cls);
} else {
u.addCls(el, cls);
}
}
return el;
};
u.val = function(el, val) {
if (!u.isElement(el)) {
console.warn('$api.val Function need el param, el param must be DOM Element');
return;
}
if (arguments.length === 1) {
switch (el.tagName) {
case 'SELECT':
var value = el.options[el.selectedIndex].value;
return value;
break;
case 'INPUT':
return el.value;
break;
case 'TEXTAREA':
return el.value;
break;
}
}
if (arguments.length === 2) {
switch (el.tagName) {
case 'SELECT':
el.options[el.selectedIndex].value = val;
return el;
break;
case 'INPUT':
el.value = val;
return el;
break;
case 'TEXTAREA':
el.value = val;
return el;
break;
}
}
};
u.prepend = function(el, html) {
if (!u.isElement(el)) {
console.warn('$api.prepend Function need el param, el param must be DOM Element');
return;
}
el.insertAdjacentHTML('afterbegin', html);
return el;
};
u.append = function(el, html) {
if (!u.isElement(el)) {
console.warn('$api.append Function need el param, el param must be DOM Element');
return;
}
el.insertAdjacentHTML('beforeend', html);
return el;
};
u.before = function(el, html) {
if (!u.isElement(el)) {
console.warn('$api.before Function need el param, el param must be DOM Element');
return;
}
el.insertAdjacentHTML('beforebegin', html);
return el;
};
u.after = function(el, html) {
if (!u.isElement(el)) {
console.warn('$api.after Function need el param, el param must be DOM Element');
return;
}
el.insertAdjacentHTML('afterend', html);
return el;
};
u.html = function(el, html) {
if (!u.isElement(el)) {
console.warn('$api.html Function need el param, el param must be DOM Element');
return;
}
if (arguments.length === 1) {
return el.innerHTML;
} else if (arguments.length === 2) {
el.innerHTML = html;
return el;
}
};
u.text = function(el, txt) {
if (!u.isElement(el)) {
console.warn('$api.text Function need el param, el param must be DOM Element');
return;
}
if (arguments.length === 1) {
return el.textContent;
} else if (arguments.length === 2) {
el.textContent = txt;
return el;
}
};
u.offset = function(el) {
if (!u.isElement(el)) {
console.warn('$api.offset Function need el param, el param must be DOM Element');
return;
}
var sl = Math.max(document.documentElement.scrollLeft, document.body.scrollLeft);
var st = Math.max(document.documentElement.scrollTop, document.body.scrollTop);
var rect = el.getBoundingClientRect();
return {
l: rect.left + sl,
t: rect.top + st,
w: el.offsetWidth,
h: el.offsetHeight
};
};
u.css = function(el, css) {
if (!u.isElement(el)) {
console.warn('$api.css Function need el param, el param must be DOM Element');
return;
}
if (typeof css == 'string' && css.indexOf(':') > 0) {
el.style && (el.style.cssText += ';' + css);
}
};
u.cssVal = function(el, prop) {
if (!u.isElement(el)) {
console.warn('$api.cssVal Function need el param, el param must be DOM Element');
return;
}
if (arguments.length === 2) {
var computedStyle = window.getComputedStyle(el, null);
return computedStyle.getPropertyValue(prop);
}
};
u.jsonToStr = function(json) {
if (typeof json === 'object') {
return JSON && JSON.stringify(json);
}
};
u.strToJson = function(str) {
if (typeof str === 'string') {
return JSON && JSON.parse(str);
}
};
u.setStorage = function(key, value) {
if (arguments.length === 2) {
var v = value;
if (typeof v == 'object') {
v = JSON.stringify(v);
v = 'obj-' + v;
} else {
v = 'str-' + v;
}
var ls = uzStorage();
if (ls) {
ls.setItem(key, v);
}
}
};
u.getStorage = function(key) {
var ls = uzStorage();
if (ls) {
var v = ls.getItem(key);
if (!v) { return; }
if (v.indexOf('obj-') === 0) {
v = v.slice(4);
return JSON.parse(v);
} else if (v.indexOf('str-') === 0) {
return v.slice(4);
}
}
};
u.rmStorage = function(key) {
var ls = uzStorage();
if (ls && key) {
ls.removeItem(key);
}
};
u.clearStorage = function() {
var ls = uzStorage();
if (ls) {
ls.clear();
}
};
u.fixIos7Bar = function(el) {
return u.fixStatusBar(el);
};
u.fixStatusBar = function(el) {
if (!u.isElement(el)) {
console.warn('$api.fixStatusBar Function need el param, el param must be DOM Element');
return 0;
}
el.style.paddingTop = api.safeArea.top + 'px';
return el.offsetHeight;
};
u.fixTabBar = function(el) {
if (!u.isElement(el)) {
console.warn('$api.fixTabBar Function need el param, el param must be DOM Element');
return 0;
}
el.style.paddingBottom = api.safeArea.bottom + 'px';
return el.offsetHeight;
};
u.toast = function(title, text, time) {
var opts = {};
var show = function(opts, time) {
api.showProgress(opts);
setTimeout(function() {
api.hideProgress();
}, time);
};
if (arguments.length === 1) {
var time = time || 500;
if (typeof title === 'number') {
time = title;
} else {
opts.title = title + '';
}
show(opts, time);
} else if (arguments.length === 2) {
var time = time || 500;
var text = text;
if (typeof text === "number") {
var tmp = text;
time = tmp;
text = null;
}
if (title) {
opts.title = title;
}
if (text) {
opts.text = text;
}
show(opts, time);
}
if (title) {
opts.title = title;
}
if (text) {
opts.text = text;
}
time = time || 500;
show(opts, time);
};
u.post = function( /*url,data,fnSuc,dataType*/ ) {
var argsToJson = parseArguments.apply(null, arguments);
var json = {};
var fnSuc = argsToJson.fnSuc;
argsToJson.url && (json.url = argsToJson.url);
argsToJson.data && (json.data = argsToJson.data);
if (argsToJson.dataType) {
var type = argsToJson.dataType.toLowerCase();
if (type == 'text' || type == 'json') {
json.dataType = type;
}
} else {
json.dataType = 'json';
}
json.method = 'post';
api.ajax(json,
function(ret, err) {
if (ret) {
fnSuc && fnSuc(ret);
}
}
);
};
u.get = function( /*url,fnSuc,dataType*/ ) {
var argsToJson = parseArguments.apply(null, arguments);
var json = {};
var fnSuc = argsToJson.fnSuc;
argsToJson.url && (json.url = argsToJson.url);
//argsToJson.data && (json.data = argsToJson.data);
if (argsToJson.dataType) {
var type = argsToJson.dataType.toLowerCase();
if (type == 'text' || type == 'json') {
json.dataType = type;
}
} else {
json.dataType = 'text';
}
json.method = 'get';
api.ajax(json,
function(ret, err) {
if (ret) {
fnSuc && fnSuc(ret);
}
}
);
};
/*end*/
window.$api = u;
})(window);