http://runjs.cn/apidoc/classes/Utils.html --utils.js中方法導航。
http://runjs.cn/apidoc/files/js_utils.js.html ---代碼實際地址
/**
* 模塊工具類,用來初始化各模塊視圖、自定綁定事件以及其他輔助功能等
*
* @class Utils
*/
Utils = (function() {
var instance;
/**
* @class Utils
* @constructor
*/
function Utils() {
instance = this;
return this;
}
/**
* 事件自動綁定 events:<br>
* 事件映射列表 映射規則:<br>
* "event(事件) -> selector(選擇器)":"handler(事件處理器)"<br>
* events = { <br>
* "click->[document]":"doc_click_handler" <br> }<br>
* <span style="color:#A00">[注]</span>如果selector帶有中括號[]則表明爲系統全局變量,如window,document<br>
* 需要以 call(module) 的方式把上下文設置成當前的模塊實例
*
* @example g_utils.binder.call(module)
* @method binder
*/
Utils.prototype.binder = function(cur) {
if (isEmpty(cur))
cur = this;
var events = this.Events;
if (isEmpty(events))
return;
var clazz = className(this);
if (isEmpty(clazz))
this.clazz = clazz = "Plugin";
Console.log("[" + clazz + "]Binding events");
try {
$.each(events, function(key, handler) {
if (isEmpty(events))
return;
var handler = events[key];
if (isEmpty(key))
return;
var sp = key.split("->");
var evt = sp[0];
var sel = sp[1];
if (isEmpty(evt) || isEmpty(sel) || isNotFunc(cur[handler]) && isNotFunc(handler))
return;
var one = function(event) {
if (isNotFunc(handler)) {
return cur[handler].call(this, cur, event);
} else {
return handler.call(this, cur, event)
}
};
var hasWindowObj = sel.indexOf("[window]") != -1;
var hasDocumentObj = sel.indexOf("[document]") != -1;
if (hasWindowObj) {
$(window).unbind(evt, one);
$(window).bind(evt, one);
sel = sel.replace(/[\[window\]]/g, "")
}
if (hasDocumentObj) {
$(document).unbind(evt, one);
$(document).bind(evt, one);
sel = sel.replace(/[\[document\]]/g, "")
}
if (isEmpty(sel))
return;
Console.log("\t[" + clazz + "]Binding event[" + handler + "]");
$(sel).die(evt).live(evt, one);
})
} catch (e) {
Console.log("Error Occured When Binding Events:" + e);
}
};
/**
* 初始化參數:初始化arguments第一個參數(json格式),將其設置爲當前對象的成員屬性, params爲json格式數據<br>
*
* @method initParams
* @example g_utils.initParams.call(module)
* @params {Object} params JSON類型數據
*/
Utils.prototype.initParams = function(params) {
var clazz = className(this);
if (isNotEmpty(params)) {
Console.log("[" + clazz + "]Initializing Params with outer params");
for ( var key in params) {
this[key] = params[key];
}
}
if (isNotEmpty(this.arg) && isNotEmpty(this.arg[0])) {
Console.log("[" + clazz + "]Initializing Params with arguments[0]");
var opt = this.arg[0];
for ( var key in opt) {
if (isNotEmpty(opt[key]))
this[key] = opt[key];
}
}
};
/**
* 初始化視圖
* 自動像viewLink+"/"+ident路徑請求模版,返回後插入到target中,初始化完成執行afterInit回調,並將當前對象當作調用上下文對象
*
* @method initParams
* @example g_utils.initView.call(module,ident,callback,async)
* @param {String}
* ident 代碼的唯一標識
* @param {Function}
* afterInit 當視圖初始化好後調用的回調函數
* @param {Boolean}
* async 是否採用異步方式加載數據,true或undefined時爲異步方式,false爲同步方式
*/
Utils.prototype.initView = function(ident, afterInit, async) {
var cur = this;
var clazz = className(this);
var func = "on" + clazz + "ViewInit";
if (g_status.once) {
afterInit.call(cur, ident, $(this.target).html());
plugins.fireEvent(func, cur);
return;
}
if (isEmpty(ident))
ident = g_status.ident;
Console.log("[" + this.clazz + "]Initializing View with ident:[" + ident + "] " + (isFunc(afterInit) ? "and callback" : ""));
var link = this.viewLink + "/" + ident + "?" + new Date().getTime();
if (isEmpty(async) || async) {
$.get(link, function(e) {
cur.view = $(e);
Console.log("[" + cur.clazz + "]View Loaded in async");
if (isNotEmpty(cur.target) && isNotEmpty(e)) {
cur.target.html(e);
afterInit.call(cur, ident, cur.view);
plugins.fireEvent(func, cur);
}
});
} else {
var e = instance.load(link, async);
cur.view = $(e);
Console.log("[" + cur.clazz + "]View Loaded in syn");
if (isNotEmpty(cur.target) && isNotEmpty(e)) {
cur.target.html(e);
afterInit.call(cur, ident, cur.view);
plugins.fireEvent(func, cur);
}
}
};
/**
* 採用同步或異步方式加載遠端資源
*
* @method load
* @param {String}
* link 請求鏈接地址
* @param {Boolean}
* async 是否採用異步方式加載數據
* @param {Function}
* callback 採用異步方式的回調函數
* @param {Object}
* data 發送請求時附帶參數數據
* @return {String} responseText 採用同步方式時直接返回結果,採用異步方式時將返回 undefined
*/
Utils.prototype.load = function(link, async, callback, data) {
var cur = this;
return $.ajax({
url : link,
success : function(html) {
if (isFunc(callback))
callback.call(cur, html);
},
data : data,
async : async,
type : "post"
}).responseText;
};
/**
* 處理服務器端返回的JSON類型數據結果,判斷是否爲出錯信息,並提供兩種方式處理錯誤
*
* @method errorHandler
* @param {String}
* msg 服務器傳來待處理的 JSON 格式字符串
* @param {Function}
* success 無錯誤時的回調函數,該回調將獲得處理過後的 JSON 數據
* @param {Function}
* error 服務器端傳來錯誤信息時調用,將返回出錯 JSON 數據
* @param {Boolean}
* diy 是否立即使用 error
* 回調函數處理錯誤,true爲立即使用error處理,false和undefined爲系統使用彈窗顯示錯誤然後再調用error回調處理
*/
Utils.prototype.errorHandler = function(msg, success, error, diy) {
try {
var msg = eval("(" + msg + ")");
if (msg.error) {
if (isEmpty(diy) || !diy) {
dialog.get("error", msg.msg);
if (typeof error != "undefined") {
setTimeout(function() {
error(msg);
}, 2000);
}
return false;
} else {
if (typeof error != "undefined") {
return error(msg);
}
}
}
return success(msg)
} catch (e) {
if (typeof e.stack != 'undefined') {
dialog.get("jserror", e.stack.substring(0, 50));
} else
dialog.get("jserror", e.message);
return;
}
};
/**
* 阻止瀏覽器默認事件
*
* @method stopDefault
* @param {Object}
* event 瀏覽器事件對象
*/
Utils.prototype.stopDefault = function(event) {
event.preventDefault();
event.returnvalue = false;
};
/**
* 初始狀態信息,該方法用來從服務器端加載一段js,用eval執行來初始化全局變量
*
* @method initStatus
* @param {String}
* link 請求鏈接地址
*/
Utils.prototype.initStatus = function(link) {
var status = this.load(link, false);
if (isNotEmpty(status))
eval(status);
};
/**
* 獲得以“http://”開頭的鏈接地址,並加上當前域的HOST名稱,例如
* g_utils.getHttpLink("/code/abcdefg")將返回"http://runjs.cn/code/abcdefg"
*
* @method getHttpLink
* @return {String} link 返回處理好的鏈接地址
*/
Utils.prototype.getHttpLink = function(link) {
if (isEmpty(link))
return;
if (link.indexOf("http") == -1) {
if (link.indexOf("/") == 0) {
link = g_status.host + link;
} else {
link = g_status.host + "/" + link;
}
}
return link;
};
Utils.prototype.notClickOn = function(event, selectors, callback) {
if (isNotEmpty(event) && (!$(event.srcElement || event.target).is(selectors)) && isFunc(callback))
callback.call(this, event);
};
Utils.prototype.loadImages = function(sources, callback) {
var images = {};
var loadedImages = 0;
var numImages = 0;
for ( var src in sources) {
numImages++;
}
for ( var src in sources) {
images[src] = new Image();
images[src].onload = function() {
if (++loadedImages >= numImages) {
callback(images);
}
};
images[src].src = sources[src];
}
};
Utils.prototype.hasHtml = function(content) {
var reg = new RegExp("<\/?.+?>", "g")
return reg.test(content);
};
/**
* 將形如"2013-02-28 17:35:00"的字符串轉換爲Date對象
*/
Utils.prototype.parseDate = function(s) {
var re = /^(\d{4})-(\d\d)-(\d\d) (\d\d):(\d\d):(\d\d)$/;
var m = re.exec(s);
return m ? new Date(m[1], m[2] - 1, m[3], m[4], m[5], m[6]) : null;
};
/**
* 通過字符串動態調用函數:
* 'osc.upload_img.onSuccess'
* Usage:g_utils.invoke.call(osc.upload_img,'onSuccess',{img:'http://oschina.net/img/logo.gif'})
*/
Utils.prototype.invoke = function(method_name,args){
if(isEmpty(method_name))
return;
var methods = method_name.split('.');
var context = this;
var invoker = this;
for(var i=0;i<methods.length;i++){
var tmp = invoker[methods[i]];
if(i!=methods.length-1 && typeOf(tmp,'object')){
invoker = tmp;
}else if(isFunc(tmp)){
tmp.call(context,args);
}
}
};
return Utils;
})();
/**
* Utils 類實例[全局]
*
* @attribute g_utils
*/
g_utils = new Utils();
/**
* 判斷當前對象是否爲空
*
* @method isEmpty
* @param {Object}
* obj
* @return {Boolean} empty 當爲 null,undefined,"" 將返回true
*/
window.isEmpty = function(obj) {
return (obj == null || typeof obj == "undefined" || obj.length == 0)
}
/**
* 判斷當前對象是否非空
*
* @method isNotEmpty
* @param {Object}
* obj
* @return {Boolean}
*/
window.isNotEmpty = function(obj) {
return !isEmpty(obj);
}
/**
* 判斷是否爲函數
*
* @method isFunc
* @param {Object}
* fun
* @return {Boolean}
*/
window.isFunc = function(fun) {
return (fun != null && typeof fun == "function");
}
/**
* 判斷不是函數
*
* @method isNotFunc
* @param {Object}
* fun
* @return {Boolean}
*/
window.isNotFunc = function(fun) {
return !isFunc(fun);
}
/**
* 判斷 cur 是否爲 type 類型
*
* @method typeOf
* @param {Object}
* cur
* @param {String}
* type
* @example typeOf("Hello","string");//將返回true
* @return {Boolean}
*/
window.typeOf = function(cur, type) {
if (typeof type != "string")
return false;
return typeof cur == type;
}
/**
* 判斷是否爲數組
*
* @method isArray
* @param {Object}
* array
* @return {Boolean}
*/
window.isArray = function(array) {
return isNotEmpty(array) && className(array) == "Array"
}
/**
* 判斷不是數組
*
* @method isNotArray
* @param {Object}
* arr
* @return {Boolean}
*/
window.isNotArray = function(arr) {
return !isArray(arr);
}
/**
* 獲取當前模塊名
*
* @method className
* @param {Object}
* obj
* @example className(g_utils);//返回 "Utils"
* @return
*/
window.className = function(obj) {
if (obj && obj.constructor && obj.constructor.toString) {
var arr = obj.constructor.toString().match(/function\s*(\w+)/);
if (arr && arr.length == 2) {
obj.clazz = arr[1]
return arr[1];
}
}
return undefined;
}
/**
* 判斷兩個對象是否爲相同的類
*
* @method isSameClass
* @param {Object}
* cur
* @param {Object}
* cur2
* @return {Boolean}
*/
window.isSameClass = function(cur, cur2) {
if (isNotEmpty(cur) && isNotEmpty(cur2)) {
return className(cur) == className(cur2);
}
return false;
}
/**
* 判斷兩個對象爲不同類
*
* @method isDifClass
* @param {Object}
* cur
* @param {Object}
* cur2
* @return {Boolean}
*/
window.isDifClass = function(cur, cur2) {
return !isSameClass(cur, cur2);
}
/**
* 以 window.open 方式打開彈窗
*
* @method openwindow
* @param {String}
* url
* @param {String}
* name
* @param {Number}
* iWidth
* @param {Number}
* iHeight
*/
window.openwindow = function(url, name, iWidth, iHeight) {
var url; // 轉向網頁的地址;
var name; // 網頁名稱,可爲空;
var iWidth; // 彈出窗口的寬度;
var iHeight; // 彈出窗口的高度;
var iTop = (window.screen.availHeight - 30 - iHeight) / 2; // 獲得窗口的垂直位置;
var iLeft = (window.screen.availWidth - 10 - iWidth) / 2; // 獲得窗口的水平位置;
window.open(url, name, 'height=' + iHeight + ',,innerHeight=' + iHeight + ',width=' + iWidth + ',innerWidth=' + iWidth + ',top=' + iTop + ',left=' + iLeft + ',toolbar=no,menubar=no,scrollbars=auto,resizeable=no,location=no,status=no');
}
/**
* 返回 true 且啥也不處理的回調函數,用於{{#crossLink "Dialog"}}{{/crossLink}}中設置無所作爲的按鈕的事件
*
* @method doNothing
* @example dialog.get("confrim2",doNothing,doNow);//doNow 爲回調函數
* @return {Boolean}
*/
window.doNothing = function() {
return true;
}
/**
* 更新瀏覽器地址欄鏈接地址
*
* @method updateUrl
* @param {String}
* url
*/
window.updateUrl = function(url) {
if (window.history && window.history.pushState) {
window.history.pushState(null, url, url);
}
};
/**
* 判斷當前是否處在iframe中
*
* @method isIframe
* @return {Boolean}
*/
window.isIframe = function() {
return top.location != self.location;
}
/**
* 判斷當前不處在iframe中
*
* @method isIframe
* @return {Boolean}
*/
window.isNotIframe = function() {
return !isIframe();
};
/**
* 利用數組的join構造字符串,提高字符串拼接效率
*
* @method buildString
* @param arguments
* {String|Number}
* @return {String} 拼接後的字符串
*/
window.buildString = function() {
var str = [];
for ( var i = 0; i < arguments.length; i++) {
str[i] = arguments[i];
}
return str.join("");
};
window.console = window.console || {};
console.log || (console.log = typeof opera != "undefined" ? opera.postError : function(msg) {
});
/*---IE Extend---*/
if (!Array.prototype.indexOf) {
Array.prototype.indexOf = function(elt /* , from */) {
var len = this.length >>> 0;
var from = Number(arguments[1]) || 0;
from = (from < 0) ? Math.ceil(from) : Math.floor(from);
if (from < 0)
from += len;
for (; from < len; from++) {
if (from in this && this[from] === elt)
return from;
}
return -1;
};
}
ConsoleUtils = (function() {
var open = false;
function ConsoleUtils(op) {
open = op;
}
ConsoleUtils.prototype.toggle = function() {
open = !open;
};
ConsoleUtils.prototype.open = function() {
open = true;
}
ConsoleUtils.prototype.close = function() {
open = false;
}
ConsoleUtils.prototype.log = function(msg) {
if (open)
console.log(msg);
}
return ConsoleUtils;
})();
Console = new ConsoleUtils(false);