File: js\utils.js
/**
* 模块工具类,用来初始化各模块视图、自定绑定事件以及其他辅助功能等
* @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() {
var 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)) {
cur[handler].call(this, cur, event);
} else {
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;
}

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);

模块工具类--utils的更多相关文章

  1. Android 软件管理工具类Utils

    Android 软件管理工具类Utils /** * Created by uilubo on 2015/9/30. * 工具类 */ public class Utils { public stat ...

  2. Spark中常用工具类Utils的简明介绍

    <深入理解Spark:核心思想与源码分析>一书前言的内容请看链接<深入理解SPARK:核心思想与源码分析>一书正式出版上市 <深入理解Spark:核心思想与源码分析> ...

  3. spring mvc DispatcherServlet详解之拾忆工具类utils

    DispatcherServlet的静态初始化 /** * Name of the class path resource (relative to the DispatcherServlet cla ...

  4. iOS 上传自己的工程(模块工具类)到cocoapods上遇到坑

    最近在研究把自己写的工具类和模块上传到cocoapods上, 再新构建项目中可以直接使用cocoapods使用  也可以更新之前的版本 便于维护项目. 但是在这个过程中遇到了种种问题 但是最后还是解决 ...

  5. Spark中经常使用工具类Utils的简明介绍

    <深入理解Spark:核心思想与源代码分析>一书前言的内容请看链接<深入理解SPARK:核心思想与源代码分析>一书正式出版上市 <深入理解Spark:核心思想与源代码分析 ...

  6. 工具类Utils的单元测试方式

    数据质量功能已经开发完毕,但是要实现单元测试覆盖率80%以上,其他的还好,只是这个工具类实在让我摸不着头脑,其实工具类的单元测试是最简单的,只是自己想复杂了而已: 无返回值模拟: 有返回值模拟: 异常 ...

  7. python 日志模块工具类

    #!/usr/bin/env python # -*- coding: utf-8 -*- import logging # logName 日志中的某个格式化的字段名,logFile生成的日志文件名 ...

  8. Openresty最佳案例 | 第8篇:RBAC介绍、sql和redis模块工具类

    转载请标明出处: http://blog.csdn.net/forezp/article/details/78616738 本文出自方志朋的博客 RBAC介绍 RBAC(Role-Based Acce ...

  9. springboot 整合redis redis工具类

    一步 : pom中引入相关依赖 <!-- 引入 redis 依赖 --> <dependency> <groupId>org.springframework.boo ...

随机推荐

  1. nyoj 104 最大和 (二维最大字串和)

    描述 给定一个由整数组成二维矩阵(r*c),现在需要找出它的一个子矩阵,使得这个子矩阵内的所有元素之和最大,并把这个子矩阵称为最大子矩阵. 例子: - - - - - - - 其最大子矩阵为: - - ...

  2. bootstrap 导航布局

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...

  3. python高级编程之装饰器04

    from __future__ import with_statement # -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrat ...

  4. FTP Client

    1: /// <summary> 2: /// FTP 管理类 3: /// </summary> 4: public class FTPManage 5: { 6: priv ...

  5. PC--CSS维护

    一.在样式表开头添加一个注释块,用以描述这个样式表的创建日期.创建者.标记等备注信息. /**Site: www.daqianduan.com*Author: 浩子*Updated: 2010.5.7 ...

  6. 8. 冒泡法排序和快速排序(基于openCV)

    一.前言 主要讲述冒泡法排序和快速排序的基本流程,并给出代码实现,亲测可用. 二.冒泡法排序 冒泡法排序主要是将相邻两个值比较,把小的向前冒泡,大的向后沉淀,时间复杂度为O(n2).主要思想如下: 分 ...

  7. SQL记录-字符串的截取与拼接

    SELECT concat( substr(t1.CODE, , ), '****', substr(t1.CODE, ) ), t1.CODE, t2.TITLE FROM table1 t1 LE ...

  8. [汇编学习笔记][第十章 CALL和RET指令]

    第十章 CALL和RET指令 call和ret指令都是转移指令,它们都修改CS和IP.经常被共同用于实现子程序的设计.这一章,我们讲解call和ret指令的原理 10.1 ret和retf ret指令 ...

  9. [SQL学习笔记][用exists代替全称量词 ]

    学习sql的必经问题. 学生表student (id学号 Sname姓名 Sdept所在系) 课程表Course (crscode课程号 name课程名) 学生选课表transcript (studi ...

  10. HTML5新增的拖放API---(一)

    HTML5新增了关于拖放的API,通过API可以让HTML页面的任意元素都变成可拖动的,通过使用拖放机制可以开发出更友好的人机交互的界面. 拖放操作可以分为两个动作:在某个元素上按下鼠标移动鼠标(没有 ...