RunJS:在线前端代码编辑分享平台是一个在线的 HTML、Javascript、CSS 等 web 前端代码的编辑分享平台,拥有实时预览、高亮显示、代码格式化等功能,提供多种登录方式。
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() {
- 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);
项目中用到的工具包:
/********************************************
*
* date: 2017-3-15
* Modify: add annotation
* author: jiankangcui
*
* ******************************************/
define([
'jquery',
'global',
'numeral'
],
function($,global){
var i = 0;
var name;
var Util = function(){
this.prefixRendered=false;
};
var submitOptions={
context:null,//提交表单域
action:null,//提交url
dataExtension:null,//额外数据
mode:''
};
var renderOptions={
context:null,//渲染表单域
url:null,//提交url
formDataSelector: null
};
Util.prototype = {
//打开一个新的标签页的窗口
new_window : function(item){
var url = $(item).attr('data-url')||$(item).attr('href'),
width = $(item).attr('data-width')||500,
height = $(item).attr('data-height')||800,
left = Math.max(0,$(window).width()/2 - width/2);
return window.open(url,'_blank','width='+ width +',height='+ height +',top=100,left='+left+',toolbar=no,menubar=no,scrollbars=yes, resizable=yes,location=no, status=no');
},
stringify_aoData : function (aoData) {
var o = {};
var modifiers = ['mDataProp_',
'sSearch_',
'iSortCol_',
'bSortable_',
'bRegex_',
'bSearchable_',
'sSortDir_'];
$.each(aoData, function(idx,obj) {
if (obj.name) {
for (i=0; i < modifiers.length; i++) {
if (obj.name.substring(0, modifiers[i].length) === modifiers[i]) {
var index = parseInt(obj.name.substring(modifiers[i].length), 10);
var key = 'a' + modifiers[i].substring(0, modifiers[i].length-1);
if (!o[key]) {
o[key] = [];
}
o[key][index] = obj.value;
return;
}
}
o[obj.name] = obj.value;
}
else {
o[idx] = obj;
}
});
return JSON.stringify(o);
},
//配置菜单激活状态样式
set_menu: function(item){
$('.navbar-fixed-top .navbar-nav li').removeClass('active');
$('.navbar-fixed-top .navbar-nav li').each(function(i){
var menuItem = $(this).attr('data-menu-item');
if(menuItem === item){
$(this).addClass('active');
}
});
},
ajax_submit: function(form,option){
option=option||submitOptions;
//获取form元素
var rootElement=option.context?('#'+$(form).attr('id')+' '+option.context):form;
//获取form元素的id
var formId=option.context?($(form).attr('id')+' '+option.context):$(form).attr('id');
var result ={};
if(option.context1&&option.context1==='.flat'){
var rootElement1=option.context1?('#'+$(form).attr('id')+' '+option.context1):form;
result = this._clone( this._submit_data(rootElement1,option));
}
if(option.mode && option.mode==='arrayMode'){
var firstRootElement=option.list?('#'+$(form).attr('id')+' '+option.list):form;
formId = $(form).attr('id');
for(i=1;i<=$(firstRootElement).length;i++){
var listAttr='';
var arr = [];
var secondRootElement = option.context?('#'+$(form).attr('id')+' '+option.list+'-'+i+' '+option.context):form;
for(var j=0;j<$(secondRootElement).length;j++){
var temp = secondRootElement;
temp = temp + ':eq('+j+')';
var data =this._submit_data(temp,option);
arr.push(this._clone(data));
listAttr=temp;
}
result[$(listAttr).attr('data-name')]=arr;
}
return $.ajax({
url: option.action||$(form).attr('action'),
type: $(form).attr('method'),
dataType: 'json',
headers: {
'x-form-id' : formId
},
contentType: 'application/json; charset=UTF-8',
data: JSON.stringify(result)
});
}
//引用提取ajax数据函数
var data1 = this._submit_data(rootElement,option);
//发送ajax请求
return $.ajax({
url: option.action||$(form).attr('action'),
type: $(form).attr('method'),
dataType: 'json',
headers: {
'x-form-id' : formId
},
contentType: 'application/json; charset=UTF-8',
data: JSON.stringify(data1)
});
},
//提取ajax数据,返回对象
_submit_data: function(rootElement,option){
var rootElement1 = rootElement;
var o = {};
var key;
var tokens;
var t;
var c;
var option1 = option;
$(rootElement1).find('input,textarea,select,.file-upload,.data-binder').each(function(){
if($(this).attr('data-ignore')==='true'||$(this).parents('[data-ignore=true]').length>0){
return true;
}
if($(this).attr('type')==='file'){
return true;
}
if($(this).hasClass('select2-focusser select2-offscreen') || $(this).hasClass('select2-input')){
return true;
}
key = $(this).attr('name');
if(key){
tokens = key.split('\.');
c = o;
for(i=0; i<tokens.length; i++){
t = tokens[i];
if(!c.hasOwnProperty(t)){
c[t] = {};
}
if(i === tokens.length -1){
if($(this).hasClass('file-upload')){
c[t] = $(this).attr('data-img');
}
else if($(this).hasClass('data-binder')){
c[t] = $(this).attr('data-val');
}
else if($(this).attr('type') === 'checkbox'){
c[t] = $(this).is(':checked');
}
else if($(this).attr('type') === 'radio')
{
if($(this).is(':checked'))
{
c[t] = $(this).val();
}
}else{
c[t] = $(this).val();
}
}else{
c = c[t];
}
}
}
});
//加入额外数据
if(option1.dataExtension&&typeof option1.dataExtension==='object'){
for(var prop in option1.dataExtension){
if(prop === 'masked_data'){
var masked_data = option1.dataExtension[prop];
for(var mask in masked_data){
var ligten_data = o[mask.slice(0,mask.indexOf('_original'))];
if(ligten_data && ligten_data.indexOf('*') !== -1){
o[mask.slice(0,mask.indexOf('_original'))] = masked_data[mask];
}
}
}else{
o[prop]=option1.dataExtension[prop];
}
}
}
return o;
},
_render_data: function(root,data,option){
var me = this;
$(root).find('input,select,.hidden-form-control,.file-upload,.show-form-control,textarea').each(function(){
var $this = $(this);
name = $this.attr('name');
if(name)
{
var s = name.split('.');
var temp = data;
for(i=0;i<s.length;i++)
{
if(temp){ temp = temp[s[i]]; }
}
if(temp!= undefined && temp != null){
if($(this).attr('type') === 'radio' || $(this).attr('type') === 'checkbox'){
$(this).prop('checked',temp);
}else if($(this).hasClass('select2-hidden')){
$(this).select2('val', temp);
}
else if($(this).hasClass('file-upload')){
$(this).attr('data-img',temp);
$(this).find('.file-binder').val(temp);
$(this).find('.upload-filename').text(temp);
}
else if(this.tagName === 'SPAN')
{
$this.html(temp).attr('title',temp);
}else if(this.tagName === 'IMG'){
if(me.is_pdf(temp)) {
$this.attr('src',global.context+'/assets/img/pdf.jpg');
$this.attr('data-pdfpath',temp);
$(this).parent().find('.file-upload .upload-img').attr('src',global.context+'/assets/img/pdf.jpg');
$(this).parent().find('.file-upload .upload-img').attr('data-pdfpath',temp);
}else if(me.is_doc(temp)) {
$this.attr('src',global.context+'/assets/img/doc.jpg');
$this.attr('data-pdfpath',temp);
$(this).parent().find('.file-upload .upload-img').attr('src',global.context+'/assets/img/doc.jpg');
$(this).parent().find('.file-upload .upload-img').attr('data-pdfpath',temp);
}
else{
$this.attr('src',temp);
$this.removeAttr('data-pdfpath');
$(this).parent().find('.file-upload .upload-img').attr('src',temp);
$(this).parent().find('.file-upload .upload-img').removeAttr('data-pdfpath');
}
$(this).parent().find('.file-upload .upload-img').parent('.upload-thumbnail').show();
}else{
var except = option.except || [];
var flat = false;
for(i=0;i<except.length;i++)
{
if(option.except[i] === $this.attr('name'))
{
flat = true;
}
}
if(flat){
name = temp.name || '';
$this.val(name);
}else{
$this.val(temp);
}
}
}
}
});
},
render_form : function(form,option){
var that = this;
this.render_prefix(form,option);
option=option||renderOptions;
var rootElement=option.context?('#'+$(form).attr('id')+' '+option.context):form;
var formDataSelector = option.formDataSelector;
var formData=$(rootElement).data('cache');
if(option.cache && formData){
this._render_data(rootElement,formData,option);
return;
}
if(formDataSelector)
{
var jsontext = $.trim($(formDataSelector).text()).length===0?'{}':$(formDataSelector).text();
formData = $.parseJSON(jsontext);
this._render_data(rootElement,formData,option);
return;
}
return $.ajax({
url: option.url,
type: 'GET',
dataType: 'json',
contentType: 'application/json; charset=UTF-8'
}).done(function(resp){
$(rootElement).data('cache',resp);
that._render_data(rootElement,resp,option);
});
},
render_prefix:function(form,option){
if(this.prefixRendered){
return;
}
option=option||renderOptions;
var rootElement=option.context?('#'+$(form).attr('id')+' '+option.context):'form';
$(rootElement).find('input,select,.hidden-form-control,.file-upload,.data-binder,.show-form-control,textarea').each(function(){
if($(this).hasClass('upload-input')){
return;
}
var currentName=$(this).attr('name')?$(this).attr('name'):'';
var parentName=$(this).parents('.hasPrefix').length>0?$(this).parents('.hasPrefix').eq(0).attr('data-prefix'):'';
$(this).attr('name',parentName+currentName);
});
this.prefixRendered=true;
},
//http 重定向
//replace() 方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串
redirect: function(url) {
// Similar behavior as an HTTP redirect
window.location.replace(url);
},
//form表单数据提取(包含单选框、复选框)
getSearchData:function(containerId){
var result = [];
$(containerId).find('input,textarea,select').each(function(){
var o = {};
var key;
if($(this).attr('data-ignore')==='true'){
return true;
}
if($(this).hasClass('select2-focusser select2-offscreen') || $(this).hasClass('select2-input')){
return true;
}
key = $(this).attr('name');
if(key){
if($(this).attr('Type')==='checkbox'){
o['name'] = key;
if($(this).val()==='true'){
o['value']=true;
}else{
o['value']=false;
}
}
else if($(this).attr('Type')==='radio'){
if($(this).is(':checked')){
o['name'] = key;
o['value']= $(this).val();
} else {
return;
}
}else{
o['name'] = key;
o['value']=$(this).val();
}
result.push(o);
}
});
return result;
},
//克隆对象为新对象 for(i in myObj)
_clone: function(myObj){
if(typeof(myObj) !== 'object') return myObj;
if(myObj == null){ return myObj; }
var myNewObj = {};
for(i in myObj){
myNewObj[i] = this._clone(myObj[i]);
}
return myNewObj;
},
//数字保留小数位
_decimal_floor: function(digit, length) {
length = length ? parseInt(length, 10) : 0;
if (length <= 0){ return Math.floor(digit); }
digit = Math.floor(digit * Math.pow(10, length)) / Math.pow(10, length);
return digit;
},
//添加千位分隔符,保留两位小数
get_thousand_floor: function(num,length){
if(!length){
length = 2;
};
num = this._decimal_floor(num,length);
return numeral(num).format('0,0.00');
},
//添加千位分隔符,保留两位小数
get_thousand:function(num){
if(!isNaN(num)){
return numeral(num).format('0,0.00');
}
else {
return '0.00';
}
},
//匹配小数点,整数保留一位小数
get_aprate:function(num){
var data = parseFloat(num);
return !/\./.test(data) == true? data += '.0':data;
},
//匹配格式‘0.0’的百分数
get_percent:function(num){
return numeral(num).format('0.0')+'%';
},
//匹配小数点,整数保留一位小数添加 ‘%’
get_trans_percent:function(num){
if(num.indexOf('.')!==-1){
return num+'%';
}else{
return num+'.0%';
}
},
//匹配格式‘0.00’,整数保留两位小数
get_twoScale:function(num){
return numeral(num).format('0.00');
},
//判断链接文件类型pdf
is_pdf:function(path){
var type = path.substr(path.length-3).toLowerCase();
if(type==='pdf'){ return true; }
else{ return false; }
},
//判断链接文件类型doc
is_doc:function(path){
var array=path.split('.');
return array.length>0&&(array[array.length-1]==='doc'||array[array.length-1]==='docx');
},
//判断链接文件类型excel
is_excel:function(path){
var array=path.split('.');
return array.length>0&&(array[array.length-1]==='xls'||array[array.length-1]==='xlsx');
},
//form表单数据提取
get_search_data:function(form_selector){
var val;
var data = {};
$(form_selector).find('input,select,textarea').each(function(){
var $this = $(this);
if($this.attr('data-ignore') === 'true'){
return;
}
name = $this.attr('name');
if($this.attr('data-userSel') === 'true'){
val = $this.data('value');
}else{
val = $this.val();
}
if( !data.hasOwnProperty(name) || $.trim(val).length>0){
data[name] = val;
}
});
return data;
},
//form表单数据提取(包含单选框)
get_search_radio:function(form_selector){
var name1;
var val1;
var data = {};
$(form_selector).find('input,select,textarea').each(function(){
var $this = $(this);
if($this.attr('data-ignore') === 'true'){
return;
}
if($(this).attr('Type')==='radio'){
if($(this).is(':checked')){
name1 = $this.attr('name');
val1 = $this.val();
}
}else{
name1 = $this.attr('name');
val1 = $this.val();
}
if( !data.hasOwnProperty(name1) || $.trim(val1).length>0){
data[name1] = val1;
}
});
return data;
},
//bootstrap-popover-x 侧边弹出框(**)
bind_popoverx:function(selector,width,height){
var iselector = selector || '.image-example-popoverx';
var iwidth = width || 204;
var iheight = height || 151;
$(iselector).popoverx({
ensure_visiable : true,
trigger: 'hover',
placement : 'top',
width: iwidth,
height: iheight,
elementToAppend: $('.right-blk-body').length===0? $('.blk-body'): $('.right-blk-body'),
onShown: function(){
var src = $(this.element).attr('data-src');
var html = '<img src="'+src+'" width="100%";></img>';
this.$tip.find('.popover-content').html(html);
this.resetPosition();
}
});
},
//时间戳转日期
unixToDate: function(unixTime, isFull, timeZone) {
if (typeof (timeZone) === 'number')
{
unixTime = parseInt(unixTime, 10) + parseInt(timeZone, 10) * 60 * 60;
}
var time = new Date(unixTime);
var ymdhis = '';
var year = time.getFullYear();
var month = time.getMonth()+1;
var date = time.getDate();
var hours = time.getHours();
var minutes = time.getMinutes();
var seconds = time.getSeconds();
month = month < 10 ? '0'+month : month;
date = date < 10 ? '0'+date : date;
hours = hours < 10 ? '0'+hours : hours;
minutes = minutes < 10 ? '0'+minutes : minutes;
seconds = seconds < 10 ? '0'+seconds : seconds;
ymdhis += year + '-' + month + '-' + date;
if (isFull === true)
{
ymdhis += ' ' + hours + ':' + minutes + ':' + seconds;
}
return ymdhis;
}
};
return new Util();
});
*
* date: 2017-3-15
* Modify: add annotation
* author: jiankangcui
*
* ******************************************/
define([
'jquery',
'global',
'numeral'
],
function($,global){
var i = 0;
var name;
var Util = function(){
this.prefixRendered=false;
};
var submitOptions={
context:null,//提交表单域
action:null,//提交url
dataExtension:null,//额外数据
mode:''
};
var renderOptions={
context:null,//渲染表单域
url:null,//提交url
formDataSelector: null
};
Util.prototype = {
//打开一个新的标签页的窗口
new_window : function(item){
var url = $(item).attr('data-url')||$(item).attr('href'),
width = $(item).attr('data-width')||500,
height = $(item).attr('data-height')||800,
left = Math.max(0,$(window).width()/2 - width/2);
return window.open(url,'_blank','width='+ width +',height='+ height +',top=100,left='+left+',toolbar=no,menubar=no,scrollbars=yes, resizable=yes,location=no, status=no');
},
stringify_aoData : function (aoData) {
var o = {};
var modifiers = ['mDataProp_',
'sSearch_',
'iSortCol_',
'bSortable_',
'bRegex_',
'bSearchable_',
'sSortDir_'];
$.each(aoData, function(idx,obj) {
if (obj.name) {
for (i=0; i < modifiers.length; i++) {
if (obj.name.substring(0, modifiers[i].length) === modifiers[i]) {
var index = parseInt(obj.name.substring(modifiers[i].length), 10);
var key = 'a' + modifiers[i].substring(0, modifiers[i].length-1);
if (!o[key]) {
o[key] = [];
}
o[key][index] = obj.value;
return;
}
}
o[obj.name] = obj.value;
}
else {
o[idx] = obj;
}
});
return JSON.stringify(o);
},
//配置菜单激活状态样式
set_menu: function(item){
$('.navbar-fixed-top .navbar-nav li').removeClass('active');
$('.navbar-fixed-top .navbar-nav li').each(function(i){
var menuItem = $(this).attr('data-menu-item');
if(menuItem === item){
$(this).addClass('active');
}
});
},
ajax_submit: function(form,option){
option=option||submitOptions;
//获取form元素
var rootElement=option.context?('#'+$(form).attr('id')+' '+option.context):form;
//获取form元素的id
var formId=option.context?($(form).attr('id')+' '+option.context):$(form).attr('id');
var result ={};
if(option.context1&&option.context1==='.flat'){
var rootElement1=option.context1?('#'+$(form).attr('id')+' '+option.context1):form;
result = this._clone( this._submit_data(rootElement1,option));
}
if(option.mode && option.mode==='arrayMode'){
var firstRootElement=option.list?('#'+$(form).attr('id')+' '+option.list):form;
formId = $(form).attr('id');
for(i=1;i<=$(firstRootElement).length;i++){
var listAttr='';
var arr = [];
var secondRootElement = option.context?('#'+$(form).attr('id')+' '+option.list+'-'+i+' '+option.context):form;
for(var j=0;j<$(secondRootElement).length;j++){
var temp = secondRootElement;
temp = temp + ':eq('+j+')';
var data =this._submit_data(temp,option);
arr.push(this._clone(data));
listAttr=temp;
}
result[$(listAttr).attr('data-name')]=arr;
}
return $.ajax({
url: option.action||$(form).attr('action'),
type: $(form).attr('method'),
dataType: 'json',
headers: {
'x-form-id' : formId
},
contentType: 'application/json; charset=UTF-8',
data: JSON.stringify(result)
});
}
//引用提取ajax数据函数
var data1 = this._submit_data(rootElement,option);
//发送ajax请求
return $.ajax({
url: option.action||$(form).attr('action'),
type: $(form).attr('method'),
dataType: 'json',
headers: {
'x-form-id' : formId
},
contentType: 'application/json; charset=UTF-8',
data: JSON.stringify(data1)
});
},
//提取ajax数据,返回对象
_submit_data: function(rootElement,option){
var rootElement1 = rootElement;
var o = {};
var key;
var tokens;
var t;
var c;
var option1 = option;
$(rootElement1).find('input,textarea,select,.file-upload,.data-binder').each(function(){
if($(this).attr('data-ignore')==='true'||$(this).parents('[data-ignore=true]').length>0){
return true;
}
if($(this).attr('type')==='file'){
return true;
}
if($(this).hasClass('select2-focusser select2-offscreen') || $(this).hasClass('select2-input')){
return true;
}
key = $(this).attr('name');
if(key){
tokens = key.split('\.');
c = o;
for(i=0; i<tokens.length; i++){
t = tokens[i];
if(!c.hasOwnProperty(t)){
c[t] = {};
}
if(i === tokens.length -1){
if($(this).hasClass('file-upload')){
c[t] = $(this).attr('data-img');
}
else if($(this).hasClass('data-binder')){
c[t] = $(this).attr('data-val');
}
else if($(this).attr('type') === 'checkbox'){
c[t] = $(this).is(':checked');
}
else if($(this).attr('type') === 'radio')
{
if($(this).is(':checked'))
{
c[t] = $(this).val();
}
}else{
c[t] = $(this).val();
}
}else{
c = c[t];
}
}
}
});
//加入额外数据
if(option1.dataExtension&&typeof option1.dataExtension==='object'){
for(var prop in option1.dataExtension){
if(prop === 'masked_data'){
var masked_data = option1.dataExtension[prop];
for(var mask in masked_data){
var ligten_data = o[mask.slice(0,mask.indexOf('_original'))];
if(ligten_data && ligten_data.indexOf('*') !== -1){
o[mask.slice(0,mask.indexOf('_original'))] = masked_data[mask];
}
}
}else{
o[prop]=option1.dataExtension[prop];
}
}
}
return o;
},
_render_data: function(root,data,option){
var me = this;
$(root).find('input,select,.hidden-form-control,.file-upload,.show-form-control,textarea').each(function(){
var $this = $(this);
name = $this.attr('name');
if(name)
{
var s = name.split('.');
var temp = data;
for(i=0;i<s.length;i++)
{
if(temp){ temp = temp[s[i]]; }
}
if(temp!= undefined && temp != null){
if($(this).attr('type') === 'radio' || $(this).attr('type') === 'checkbox'){
$(this).prop('checked',temp);
}else if($(this).hasClass('select2-hidden')){
$(this).select2('val', temp);
}
else if($(this).hasClass('file-upload')){
$(this).attr('data-img',temp);
$(this).find('.file-binder').val(temp);
$(this).find('.upload-filename').text(temp);
}
else if(this.tagName === 'SPAN')
{
$this.html(temp).attr('title',temp);
}else if(this.tagName === 'IMG'){
if(me.is_pdf(temp)) {
$this.attr('src',global.context+'/assets/img/pdf.jpg');
$this.attr('data-pdfpath',temp);
$(this).parent().find('.file-upload .upload-img').attr('src',global.context+'/assets/img/pdf.jpg');
$(this).parent().find('.file-upload .upload-img').attr('data-pdfpath',temp);
}else if(me.is_doc(temp)) {
$this.attr('src',global.context+'/assets/img/doc.jpg');
$this.attr('data-pdfpath',temp);
$(this).parent().find('.file-upload .upload-img').attr('src',global.context+'/assets/img/doc.jpg');
$(this).parent().find('.file-upload .upload-img').attr('data-pdfpath',temp);
}
else{
$this.attr('src',temp);
$this.removeAttr('data-pdfpath');
$(this).parent().find('.file-upload .upload-img').attr('src',temp);
$(this).parent().find('.file-upload .upload-img').removeAttr('data-pdfpath');
}
$(this).parent().find('.file-upload .upload-img').parent('.upload-thumbnail').show();
}else{
var except = option.except || [];
var flat = false;
for(i=0;i<except.length;i++)
{
if(option.except[i] === $this.attr('name'))
{
flat = true;
}
}
if(flat){
name = temp.name || '';
$this.val(name);
}else{
$this.val(temp);
}
}
}
}
});
},
render_form : function(form,option){
var that = this;
this.render_prefix(form,option);
option=option||renderOptions;
var rootElement=option.context?('#'+$(form).attr('id')+' '+option.context):form;
var formDataSelector = option.formDataSelector;
var formData=$(rootElement).data('cache');
if(option.cache && formData){
this._render_data(rootElement,formData,option);
return;
}
if(formDataSelector)
{
var jsontext = $.trim($(formDataSelector).text()).length===0?'{}':$(formDataSelector).text();
formData = $.parseJSON(jsontext);
this._render_data(rootElement,formData,option);
return;
}
return $.ajax({
url: option.url,
type: 'GET',
dataType: 'json',
contentType: 'application/json; charset=UTF-8'
}).done(function(resp){
$(rootElement).data('cache',resp);
that._render_data(rootElement,resp,option);
});
},
render_prefix:function(form,option){
if(this.prefixRendered){
return;
}
option=option||renderOptions;
var rootElement=option.context?('#'+$(form).attr('id')+' '+option.context):'form';
$(rootElement).find('input,select,.hidden-form-control,.file-upload,.data-binder,.show-form-control,textarea').each(function(){
if($(this).hasClass('upload-input')){
return;
}
var currentName=$(this).attr('name')?$(this).attr('name'):'';
var parentName=$(this).parents('.hasPrefix').length>0?$(this).parents('.hasPrefix').eq(0).attr('data-prefix'):'';
$(this).attr('name',parentName+currentName);
});
this.prefixRendered=true;
},
//http 重定向
//replace() 方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串
redirect: function(url) {
// Similar behavior as an HTTP redirect
window.location.replace(url);
},
//form表单数据提取(包含单选框、复选框)
getSearchData:function(containerId){
var result = [];
$(containerId).find('input,textarea,select').each(function(){
var o = {};
var key;
if($(this).attr('data-ignore')==='true'){
return true;
}
if($(this).hasClass('select2-focusser select2-offscreen') || $(this).hasClass('select2-input')){
return true;
}
key = $(this).attr('name');
if(key){
if($(this).attr('Type')==='checkbox'){
o['name'] = key;
if($(this).val()==='true'){
o['value']=true;
}else{
o['value']=false;
}
}
else if($(this).attr('Type')==='radio'){
if($(this).is(':checked')){
o['name'] = key;
o['value']= $(this).val();
} else {
return;
}
}else{
o['name'] = key;
o['value']=$(this).val();
}
result.push(o);
}
});
return result;
},
//克隆对象为新对象 for(i in myObj)
_clone: function(myObj){
if(typeof(myObj) !== 'object') return myObj;
if(myObj == null){ return myObj; }
var myNewObj = {};
for(i in myObj){
myNewObj[i] = this._clone(myObj[i]);
}
return myNewObj;
},
//数字保留小数位
_decimal_floor: function(digit, length) {
length = length ? parseInt(length, 10) : 0;
if (length <= 0){ return Math.floor(digit); }
digit = Math.floor(digit * Math.pow(10, length)) / Math.pow(10, length);
return digit;
},
//添加千位分隔符,保留两位小数
get_thousand_floor: function(num,length){
if(!length){
length = 2;
};
num = this._decimal_floor(num,length);
return numeral(num).format('0,0.00');
},
//添加千位分隔符,保留两位小数
get_thousand:function(num){
if(!isNaN(num)){
return numeral(num).format('0,0.00');
}
else {
return '0.00';
}
},
//匹配小数点,整数保留一位小数
get_aprate:function(num){
var data = parseFloat(num);
return !/\./.test(data) == true? data += '.0':data;
},
//匹配格式‘0.0’的百分数
get_percent:function(num){
return numeral(num).format('0.0')+'%';
},
//匹配小数点,整数保留一位小数添加 ‘%’
get_trans_percent:function(num){
if(num.indexOf('.')!==-1){
return num+'%';
}else{
return num+'.0%';
}
},
//匹配格式‘0.00’,整数保留两位小数
get_twoScale:function(num){
return numeral(num).format('0.00');
},
//判断链接文件类型pdf
is_pdf:function(path){
var type = path.substr(path.length-3).toLowerCase();
if(type==='pdf'){ return true; }
else{ return false; }
},
//判断链接文件类型doc
is_doc:function(path){
var array=path.split('.');
return array.length>0&&(array[array.length-1]==='doc'||array[array.length-1]==='docx');
},
//判断链接文件类型excel
is_excel:function(path){
var array=path.split('.');
return array.length>0&&(array[array.length-1]==='xls'||array[array.length-1]==='xlsx');
},
//form表单数据提取
get_search_data:function(form_selector){
var val;
var data = {};
$(form_selector).find('input,select,textarea').each(function(){
var $this = $(this);
if($this.attr('data-ignore') === 'true'){
return;
}
name = $this.attr('name');
if($this.attr('data-userSel') === 'true'){
val = $this.data('value');
}else{
val = $this.val();
}
if( !data.hasOwnProperty(name) || $.trim(val).length>0){
data[name] = val;
}
});
return data;
},
//form表单数据提取(包含单选框)
get_search_radio:function(form_selector){
var name1;
var val1;
var data = {};
$(form_selector).find('input,select,textarea').each(function(){
var $this = $(this);
if($this.attr('data-ignore') === 'true'){
return;
}
if($(this).attr('Type')==='radio'){
if($(this).is(':checked')){
name1 = $this.attr('name');
val1 = $this.val();
}
}else{
name1 = $this.attr('name');
val1 = $this.val();
}
if( !data.hasOwnProperty(name1) || $.trim(val1).length>0){
data[name1] = val1;
}
});
return data;
},
//bootstrap-popover-x 侧边弹出框(**)
bind_popoverx:function(selector,width,height){
var iselector = selector || '.image-example-popoverx';
var iwidth = width || 204;
var iheight = height || 151;
$(iselector).popoverx({
ensure_visiable : true,
trigger: 'hover',
placement : 'top',
width: iwidth,
height: iheight,
elementToAppend: $('.right-blk-body').length===0? $('.blk-body'): $('.right-blk-body'),
onShown: function(){
var src = $(this.element).attr('data-src');
var html = '<img src="'+src+'" width="100%";></img>';
this.$tip.find('.popover-content').html(html);
this.resetPosition();
}
});
},
//时间戳转日期
unixToDate: function(unixTime, isFull, timeZone) {
if (typeof (timeZone) === 'number')
{
unixTime = parseInt(unixTime, 10) + parseInt(timeZone, 10) * 60 * 60;
}
var time = new Date(unixTime);
var ymdhis = '';
var year = time.getFullYear();
var month = time.getMonth()+1;
var date = time.getDate();
var hours = time.getHours();
var minutes = time.getMinutes();
var seconds = time.getSeconds();
month = month < 10 ? '0'+month : month;
date = date < 10 ? '0'+date : date;
hours = hours < 10 ? '0'+hours : hours;
minutes = minutes < 10 ? '0'+minutes : minutes;
seconds = seconds < 10 ? '0'+seconds : seconds;
ymdhis += year + '-' + month + '-' + date;
if (isFull === true)
{
ymdhis += ' ' + hours + ':' + minutes + ':' + seconds;
}
return ymdhis;
}
};
return new Util();
});