/* * 描述:shr命名空间构造器 * @class 用来构建js 对象的命名空间 * @constructor * @return 返回构造完成的命名空间(JS对象) */ var Namespace = { /* * 描述:注册命名空间 * @param {String} fullNS 命名空间名称 * @return 返回造建完成的命名空间 */ register : function(fullNS) { var nsArray = fullNS.split('.'); var sEval = ""; var sNS = ""; for (var i = 0; i < nsArray.length; i++) { if (i != 0) sNS += "."; sNS += nsArray[i]; sEval += "if (typeof(" + sNS + ") == 'undefined') " + sNS + " = new Object();" } if (sEval != "") return eval(sEval); } }; /** * 重写jquery init方法来过滤下selector中的特殊字符 * 不能处理"#test1,#test2"多个选择器的情况 */ var selector_special_char_regex = /[!"#$%&'()*+,.\/:;<=>?@\[\\\]\^`{|}~]/g; var waf = $; var shr = $; var _top = getTop(); var _ajaxFnCache = $.ajax; $.ajax = function (url, options){ // toodo 参考 jquery.js ajax实现 if ( typeof url === "object" ) { options = url; url = undefined; } options = options || {}; //shr.dealPostParam会修改options,防止影响外部参数引用 var newOptions = $.extend(true,{},options); shr.dealPostParam( newOptions ); return _ajaxFnCache(url, newOptions); }; function detectBrowser () { // Useragent RegExp var rwebkit = /(webkit)[ \/]([\w.]+)/; var ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/; var rmsie = /(msie) ([\w.]+)/; var rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/; var browser = {}; // Use of jQuery.browser is frowned upon. // More details: http://docs.jquery.com/Utilities/jQuery.browser var uaMatch = function( ua ) { ua = ua.toLowerCase(); var match = rwebkit.exec( ua ) || ropera.exec( ua ) || rmsie.exec( ua ) || ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) || []; return { browser: match[1] || "", version: match[2] || "0" }; } var browserMatch = uaMatch( window.navigator.userAgent ); if ( browserMatch.browser ) { browser[ browserMatch.browser ] = true; browser.version = browserMatch.version; } // Deprecated, use jQuery.browser.webkit instead if ( browser.webkit ) { browser.safari = true; } return browser; } shr.extend({ /** * 解决jQuery高版本下不支持浏览器检测问题 */ browser: jQuery.browser || detectBrowser(), initPrivacyAgreement: function(options){ var $mask = $('
').appendTo($('body')); $mask.css({ "display" : "block", "color" : "#fff", "position" : "fixed", "top" : "0px", "left" : "0px", "background-color" : 'black', "opacity" : 0.4, "-moz-opacity" : 0.4, "filter" : "alpha(opacity=" + (0.4 * 100) + ")", "width" : "100%", "height" : "100%", "z-index": "1024" }); $('html').css({'overflow':'hidden'}); var tpl = [ '
', '
${name}
', '
$${content}
', '
', '', '', '
', '
' ].join(''); var privacyHtml = juicer(tpl,options.data); $("body").append(privacyHtml); $('#privacyAgree').click(function(){ if (typeof options.agree !== "function") return; options.agree(); }); $('#privacyReject').click(function(){ if (typeof options.reject !== "function") return; options.reject(); }); }, hidePrivacyAgreement: function(){ var iframes = top.document.getElementsByTagName('iframe'); if(iframes.length > 0) { for(var i = 0;i < iframes.length;i++) { mask = iframes[i].contentWindow.document.getElementById('shr-mask-agreement'); $(mask).remove(); } } $("div#shr-mask-agreement").remove(); $("div#shr-mask-agreement", top.parent.document).remove(); $('html').css({'overflow':'visible'}); $('.privacyPolicy').remove(); }, startMask: function(opacity, load){ opacity = (opacity || 0.16); if(load) { var $mask = $('
').appendTo($('body')); $mask.css({ "display" : "block", "color" : "#fff", "position" : "fixed", "top" : "0px", "left" : "0px", "background-color" : 'gray', "opacity" : opacity, "-moz-opacity" : opacity, "filter" : "alpha(opacity=" + (opacity * 100) + ")", "width" : "100%", "height" : "100%", "z-index": "9999" }); return; } var $mask = $('
').appendTo($('body')); $mask.css({ "display" : "block", "color" : "#fff", "position" : "fixed", "top" : "0px", "left" : "0px", "background-color" : 'black', "opacity" : opacity, "-moz-opacity" : opacity, "filter" : "alpha(opacity=" + (opacity * 100) + ")", "width" : "100%", "height" : "100%", "z-index": "1024" }); }, //重写eval方法 codeEval: function ( code ){ var script; if ( code ) { var data_key = '_process_json_data_'+parseInt(shr.randMath()); code = 'window["'+data_key+'"]=('+code+');' script = document.createElement("script"); script.text = code; document.head.appendChild( script ).parentNode.removeChild( script ); return window[data_key]; } return null; }, //附件上传中需要用到的fileUUID getAttachmentFileUUID: function(){ if( $(".attachmentUploadArea").length > 0 && $(".attachmentUploadArea").hasClass('standardAttachment')){ var mainPageDom = $(".attachmentUploadArea").closest(".view_mainPage"); var uuid = ''; //多行表单的时候需要取view_mainPage上的uuid去拿viewPage if(mainPageDom.length && mainPageDom.attr('id')){ uuid = mainPageDom.attr('id'); } var currentPage = shr.getCurrentViewPage(uuid); var attachmentFileUUID = currentPage ? currentPage.attachmentFileUUID: ''; return attachmentFileUUID; } }, //生成附件fileUUID generateAttachmentFileUUID : function(){ var attachmentFileUUID = ''; if ($(".attachmentUploadArea").length > 0) { attachmentFileUUID = shr.generateUUID(); } return attachmentFileUUID; }, //在接口中设置附件上传中需要用到的UUID _addAttachmentFileUUID : function(data){ if(data){ var attachmentFileUUID = shr.getAttachmentFileUUID(); if( $(".attachmentUploadArea").length > 0 && $(".attachmentUploadArea").hasClass('standardAttachment') && attachmentFileUUID ){ data.fileUUID = attachmentFileUUID; } } }, //生成UUID generateUUID: function() { var uuid = ''; var d = new Date().getTime(); if (window.performance && typeof window.performance.now === "function") { d += performance.now(); } uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { var r = (d + Math.random() * 16) % 16 | 0; d = Math.floor(d / 16); return (c == 'x' ? r : (r & 0x3 | 0x8)).toString(16); }); return uuid; }, //随机数 randMath: function(number){ number = number? number : 100000; var seed = (new Date()).getTime(); function r(){ seed = (seed*9301+49297)%233280; return seed/(233280.0); } return Math.ceil(r()*number); }, stopMask: function(){ //对于界面存在多个iframe时,关闭提示不能移除所有遮罩 var iframes = top.document.getElementsByTagName('iframe'); if(iframes.length > 0) { for(var i = 0;i < iframes.length;i++) { mask = iframes[i].contentWindow.document.getElementById('shr-mask'); $(mask).remove(); } } $("div#shr-mask").remove(); }, // 增加一个关闭Mask的方法,用来提示浏览器缩放时的关闭。 stopAllMask: function(){ //对于界面存在多个iframe时,关闭提示不能移除所有遮罩 var iframes = top.document.getElementsByTagName('iframe'); if(iframes.length > 0) { for(var i = 0;i < iframes.length;i++) { mask = iframes[i].contentWindow.document.getElementById('shr-mask'); $(mask).remove(); } } $("div#shr-mask").remove(); $("div#shr-mask", top.parent.document).remove(); }, /** * 获取当前的语言类型 * 判断语言类型规则:当字符串中存在中午字符、英文字符和数字时,规则是中文字符安>英文字符>数字 * @param {value} */ getValueLanguageType: function(value) { if(escape(value).indexOf('%u') > -1) { return 'zh_CN'; }else if(/[a-z]/i.test(value)) { return 'en_US'; }else{ return 'number'; } }, getCommonForUrl: function (someWindow, re) { if (!someWindow) { someWindow = _top; } var ret = re.exec(someWindow.location.href); return (ret && ret.length > 1) ? ret[1] : ''; }, /** * 过滤掉jquery选择器中的特殊字符串 */ filterSelectorSpecialChar: function (selector) { var _selector = selector; if (typeof selector == "string") { _selector = selector.replace(selector_special_char_regex, "\\$&"); } return _selector; }, /** * 描述:获取当前语种标识 * zh_CN |中文 *en_US |英文 *zh_TW |繁体 */ getContext: function () { if (!shr.context) { shr.context = { locale: window.contextLanguage }; } return shr.context; }, //处理安全漏洞扫描出来的json注入 explainJson: function( data ) { var rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g; var rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g; var rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g; var rvalidchars = /^[\],:{}\s]*$/; if ( typeof data !== "string" || !data ) { return null; } // Make sure leading/trailing whitespace is removed (IE can't handle it) data = jQuery.trim( data ); // Make sure the incoming data is actual JSON // Logic borrowed from http://json.org/json2.js if ( rvalidchars.test(data.replace(rvalidescape, "@").replace(rvalidtokens, "]").replace(rvalidbraces, "")) ) { // Try to use the native JSON parser first return window.JSON && window.JSON.parse ?window.JSON.parse( data ) : (new Function("return " + data))(); } else { jQuery.error( "Invalid JSON: " + data ); } }, /** * 根据语言环境获取多语言字段对应语言值 * 作用:当前的en_US,zh_CN,zh_TW环境与l1,l2,13的映射 * @param lan en_US、zh_CN、zh_TW 可以通过shr.getContext().locale或者window.contextLanguage获取 * @return l1、l2、13 * */ getFieldLangByContext: function (lan) { var locale = 'zh_CN'; if(lan){ locale = lan; }else if(shr.getContext().locale){ locale = shr.getContext().locale; } var each = null; for (var i = 0, total = window.languageMappingList.length;i\s*/ig; //过滤on开头的标签属性 var reg2 = /\s*(ontoggle|ondragend|onunload|onsubmit|onscroll|onclick|onchange|onblur|onbefore|onafter|onactivate|onselect|onload|onkey|onfocus|onhelp|ondrop|onfinish|onerror|eval|expression|onclick|ondbclick|onmousedown|onmouseup|prompt)\s*=/ig; //过滤src和href的伪协议 var reg3 = /\s*(href|src)\s*=/ig; //过滤alert的伪协议 var reg4 = /\s*(alert|confirm(?!\s*ed))\s*/ig; if(reg1.test(targetVal) || reg2.test(targetVal) || reg3.test(targetVal) || reg4.test(targetVal)){ return true; }else{ return false; } }, /** * xss过滤 */ xssFilter: function(targetVal){ //XSS过滤 if((typeof targetVal) != 'string'){ return targetVal; } if(shr.verifyXss(targetVal)){ // 1.前端简单转义,主要对 < > 处理 2,服务端对特殊字符拦截 return $.htmlEncode(targetVal); }else{ return targetVal; } }, /** * 防止恶意url */ safeUrl: function(url, whiteChars){ var strRegex = '^((https|http|ftp)://)?'//(https或http或ftp):// 可有可无 + '(([\\w_!~*\'()\\.&=+$%-]+: )?[\\w_!~*\'()\\.&=+$%-]+@)?' //ftp的user@ 可有可无 + '(([0-9]{1,3}\\.){3}[0-9]{1,3}' // IP形式的URL- 3位数字.3位数字.3位数字.3位数字 + '|' // 允许IP和DOMAIN(域名) + '(localhost)|' //匹配localhost + '([\\w_!~*\'()-]+\\.)*' // 域名- 至少一个[英文或数字_!~*\'()-]加上. + '\\w+\\.' // 一级域名 -英文或数字 加上. + '[a-zA-Z]{1,6})' // 顶级域名- 1-6位英文 + '(:[0-9]{1,5})?' // 端口- :80 ,1-5位数字 + '((/?)|' // url无参数结尾 - 斜杆或这没有 + '(/[\\w_!~*\'()\\.;?:@&=+$,%#-]+)+/?)$';//请求参数结尾- 英文或数字和[]内的各种字符 var re=new RegExp(strRegex,'i');//i不区分大小写 //将url做uri转码后再匹配,解除请求参数中的中文和空字符影响 if (re.test(encodeURI(url))) { return url; }else { return url; } }, /** * 获取协议和域名 */ getProtocolAndDomain: function (someWindow) { var re = (/^((?:http|https)(?:\:\/\/)[^\/]+)/i); return this.getCommonForUrl(someWindow, re); }, /** * 获取协议 */ getProtocol: function (someWindow) { var _window = (someWindow || _top); return _window.location.protocol; }, /** * 获取域名 */ getDomain: function (someWindow) { var _window = (someWindow || _top); return _window.location.host; }, /** * 获取serviceId */ getServiceId: function (someWindow) { var _win = _top; if (someWindow) { _win = someWindow; } return shr.getUrlRequestParam('serviceId', _win.location.href); }, /** * F7请求头的特征值 */ getXShrEncryptF7Value: function(){ return window.systemParamForShr['encryptDB']+'_'+window.systemParamForShr['encryptUser']+'_'+window.systemParamForShr['encryptContext']; }, /** * 获取数据中心 */ getDataCenter: function () { var dataCenter = _top.localStorage.getItem('FAccountDCName'); if (dataCenter === 'undefined') { return; } return dataCenter; }, /** * 提供通用的SessionStorage存储方法 * 整个系统最好统一调用此方法 * @param key 关键字 必须 * @param billId 表单Id 可选 * @param value 必须 */ setSessionStorage:function(key,billId,value){ sessionStorage.setItem(this.genStorageKey(key,billId),value); }, /**提供通用的SessionStorage获取方法 * 整个系统最好统一调用此方法 * @param key 关键字 必须 * @param billId 表单Id 可选 * @param value 必须 */ getSessionStorage:function(key,billId){ return sessionStorage.getItem(this.genStorageKey(key,billId)); }, /** * 提供通用的LocalStorage 存入方法 * 整个系统最好统一调用此方法 * @param key 关键字 必须 * @param billId 表单Id 可选 * @param value 必须 */ setLocalStorage:function(key,billId,value){ localStorage.setItem(this.genStorageKey(key,billId),value); }, /** * 提供通用的LocalStorage 获取方法 * 整个系统最好统一调用此方法 * @param key 关键字 必须 * @param billId 表单Id 可选 */ getLocalStorage:function(key,billId){ return localStorage.getItem(this.genStorageKey(key,billId)); }, /** * SessionStorage 或者 LocalStorage 的key的生成方式,以contextId+key[+单据id(可选)] */ genStorageKey:function(key,billId){ if(key == 'data-navigationData'){ return 'data-navigationData'; } var key = window.systemParamForShr.encryptContext + '#' + key; if(billId){ key += '#' + billId; } return key; }, /** * 提供通用的LocalStorage 值移除方法 * 整个系统最好统一调用此方法 * @param key 关键字 必须 * @param billId 表单Id 可选 */ removeLocalStorageItem:function(key,billId){ localStorage.removeItem(this.genStorageKey(key,billId)); }, /** * 提供通用的SessionStorage 值移除方法 * 整个系统最好统一调用此方法 * @param key 关键字 必须 * @param billId 表单Id 可选 */ removeSessionStorageItem:function(key,billId){ sessionStorage.removeItem(this.genStorageKey(key,billId)); }, /** * 获取浏览器类型 */ getBowserInfo : function(){ var Sys = {}; var ua = navigator.userAgent.toLowerCase(); var s; (s = ua.match(/rv:([\d.]+)\) like gecko/)) ? Sys.ie = s[1] : (s = ua.match(/msie ([\d.]+)/)) ? Sys.ie = s[1] : (s = ua.match(/firefox\/([\d.]+)/)) ? Sys.firefox = s[1] : (s = ua.match(/chrome\/([\d.]+)/)) ? Sys.chrome = s[1] : (s = ua.match(/opera.([\d.]+)/)) ? Sys.opera = s[1] : (s = ua.match(/version\/([\d.]+).*safari/)) ? Sys.safari = s[1] : 0; if (Sys.ie) return { browser : "IE" , version :Sys.ie}; if (Sys.firefox) return { browser : "Firefox" , version :Sys.firefox}; if (Sys.chrome) return { browser : "Chrome" , version :Sys.chrome }; if (Sys.opera) return { browser : "Opera" , version :Sys.opera }; if (Sys.safari) return { browser : "Safari" ,version : Sys.safari }; }, /** *描述:ajax请求超时时间 */ ajaxTimeout: 600000, /** * ajax请求时出现阻塞提示最小间隔时间 */ blockMinTime: 100, dynamicURL: '/dynamic.do', openServiceURL: '/shr/msf/service.do', getTreeDataURL: '/dynamic.do?method=getTreeData', /** * 描述:注册命名空间,并返回 * @param {String} 名称空间路径 */ registerNamespace : function(ns){ var nsArray = fullNS.split('.'); var sEval = ""; var sNS = ""; for (var i = 0; i < nsArray.length; i++) { if (i != 0) sNS += "."; sNS += nsArray[i]; sEval += "if (typeof(" + sNS + ") == 'undefined') " + sNS + " = new Object();" } if (sEval != "") return eval(sEval); }, /** * 描述:shr 的js 类继承 * @param {subClass} 当前类 * @param {superClass} 需要继承的超类 */ inherit : function(subClass, superClass) { if(superClass==null) return ; var Fun = function(){};//用一个空的函数作为中间缓冲,如果直接用父类的实例作为原型,可能有潜在问题,如计算量超大等 Fun.prototype = superClass.prototype; subClass.prototype = new Fun(); subClass.prototype.constructor = subClass; //提供 superClass 属性,这个属性可以弱化父类子类之间的耦合 //否则,在子类中调用父类的构造函数就需要指明父类,此时只需调用这个属性即可 subClass.superClass = superClass.prototype; if(superClass.prototype.constructor == Object.prototype.constructor){ superClass.prototype.constructor = superClass; } }, /** * 描述:shr 的js 类定义 * @param subClassName 当前类 * @param superClass 超类 * @param prototype 当前类体 * @return 返回创建好的JS类 */ defineClass:function(subClassName,superClass,prototype){ var clzPath=subClassName.substr(0,subClassName.lastIndexOf('.')); var ns=Namespace.register(clzPath); var subClass=eval(subClassName + "=function(){};"); shr.inherit(subClass,superClass); for(var p in prototype){ eval(subClassName + ".prototype." + p.toString() + "=prototype." + p.toString()); } }, /** * 描述: 创建对象 * @param {clazz} 创建该类的对象 */ createObject:function(clazz){ var obj=new clazz(); if(clazz.superClass!=null){ obj.superClass=clazz.superClass; } //对JS类中的方法 作AOP处理 shr.aspectClassFun(clazz,obj); return obj; }, /** * 描述:对JS类中的方法作AOP处理 * @param {} url * @return {} */ aspectClassFun:function(clazz,object){ var clazz_temp=clazz; while(clazz_temp!=null && clazz_temp!=undefined) { for(var p in clazz_temp.prototype){ var methodName=p.toString(); var beforeMethodFun=p.toString() + "_before"; var afterMethodFun=p.toString() + "_after"; var aroundMethodFun=p.toString() + "_replace"; if(eval("object." + beforeMethodFun)!=null) { shr.aspectBefore(object,p.toString(),eval("object." + beforeMethodFun)); } if(eval("object." + afterMethodFun)!=null){ shr.aspectAfter(object,p.toString(),eval("object." + afterMethodFun)); } if(eval("object." + aroundMethodFun)!=null){ shr.aspectAround(object,p.toString(),eval("object." + aroundMethodFun)); } } clazz_temp=clazz_temp.superClass; } }, /** * 描述:JS类方法调用代理 * @param method 方法名称 * @param clazz JS类名称 * @param obj 调用对象 */ proxyCall:function(methodName,objectName){ var fun=null; if(objectName==null){ objectName="jsBinder"; } if( typeof(methodName)=="object") { fun=methodName; } else { if(typeof(objectName)=="object"){ fun=eval(objectName[methodName]); } else { fun=eval(objectName + "." + methodName); } } if (!fun) { return; } var paramArray=[]; if(arguments.length>2) { paramArray=new Array(); for(var nIndex=2;nIndex').text(value).html(); }, htmlDecode: function(value) { return $('
').html(value).text(); }, /** * 转义符换成普通字符 */ strEscape: function (str) { var arrEntities = { 'lt': '<', 'gt': '>', 'nbsp': ' ', 'amp': '&', 'quot': '"' }; var result = ''; if (str) { result = str.replace(/&(lt|gt|nbsp|amp|quot);/ig, function (all, t) { return arrEntities[t]; }); } return result; }, getRealId: function(id, uuid) { id = this.convertId(id); if (uuid) { id = id + uuid; } return id; }, getValueByRole: function (role, $element, id, context, isFromWF) { var value; var handler = { 'checkbox': function(){ var value; if (typeof $element.attr("checked") == 'undefined') { value = 0; } else { var _v_ = $element.shrCheckbox('getValue'); if(_v_){ value= 1; }else{ value = 0; } } return value; }, 'editGrid': function () { var collection = $element.jqGrid('getAllPageData'); return collection; }, 'shrMultiLangBox': function () { return $element.shrMultiLangBox('getTransformedValue'); }, 'datetimepicker': function(){ return $element.shrDateTimePicker('getValue'); }, 'numberField': function () { return $element.shrNumberField('getValue'); }, 'shrFieldDisplay': function() { return $element.shrFieldDisplay('getOriginalValue') || $element.shrFieldDisplay('getValue'); } } //兼容ie下select控件'01'value值会被浏览器改变为'1' if(shr.getBowserInfo().browser == 'IE'){ handler.select = function() { return $element.shrSelect('getValue').value; } } //查看状态下的分录role为grid if(role === 'grid' && _self.getOperateState() === 'VIEW'){ role = 'editGrid'; } if (handler.hasOwnProperty(role)) { value = handler[role](); } else { value = shr.createObject(shr.framework.Widget).getInputValue(id, context, isFromWF); } return value; }, getFieldValue: function (fieldName, uuid, context) { var id = this.getRealId(fieldName, uuid); var $element = $('#' + id, context); var role = $element.attr('ctrlrole'); var value = this.getValueByRole(role, $element, id, context,false); return value; }, /** * 根据字段id和方法名来执行方法 * 使用该方法的前提是具有ctrlrole属性,并且组件中有传入的方法名对应的方法 * fieldId:是字段的id * methodName:方法名 * arguments:执行的方法要传递的参数 * context:上下文,可选参数,如果某些iframe中获取不到元素,则需要传上下文 */ execByFieldIdAndMethod: function (fieldId, methodName, _arguments, context) { var id = this.getRealId(fieldId); var $element = $('#' + id, context); try { if ($element.length == 0) { throw 'can not find the suitable element'; } var ctrlrole = $element.attr('ctrlrole'); if (!ctrlrole) { throw 'this elment has no ctrlrole attribute' } var componentName = this.getComponentNameByCtrlrole(ctrlrole); if (_arguments) { return $element[componentName](methodName, _arguments); } return $element[componentName](methodName); } catch (e) { console.error(e); } }, /** * 根据字段id和方法名来执行方法 * 使用该方法的前提是具有ctrlrole属性,并且组件中有传入的方法名对应的方法 * $element:是jquery对象 * methodName:方法名 * arguments:执行的方法要传递的参数 */ execByElementAndMethod: function ($element, methodName, _arguments) { try { if ($element.length == 0) { throw 'can not find the suitable element'; } var ctrlrole = $element.attr('ctrlrole'); if (!ctrlrole) { throw 'this elment has no ctrlrole attribute' } var componentName = this.getComponentNameByCtrlrole(ctrlrole); if (_arguments) { return $element[componentName](methodName, _arguments); } return $element[componentName](methodName); } catch (e) { console.error(e); } }, /** * 根据ctrlrole获取对应的组件名称 */ getComponentNameByCtrlrole: function (ctrlrole) { var componentName; var mapping = { 'checkbox': 'shrCheckbox', 'radio':'shrRadio', 'select':'shrSelect', 'text':'shrTextField', 'shrSetIndexCode':'shrSetIndexCode', 'shrDetailTips':'shrDetailTips', 'shrFastFilter':'shrFastFilter', 'shrGridConfig':'shrGridConfig', 'shrIconUpload':'shrIconUpload', 'intlCell':'shrIntlCell', 'shrMessageTips':'shrMessageTips', 'multiSelect':'shrMultiSelect', 'shrSaveFilterSchemeDialog':'shrSaveFilterSchemeDialog', 'shrSpreadChooseAll':'shrSpreadChooseAll', 'shrTableDialog':'shrTableDialog', 'textarea':'shrTextarea', 'shrMultiLangBox': 'shrMultiLangBox', 'datetimepicker': 'shrDateTimePicker', 'dateSpanPicker':'shrDateSpanPicker', 'numberField': 'shrNumberField', 'shrFieldDisplay': 'shrFieldDisplay', 'promptBox':'shrPromptBox', } if (mapping.hasOwnProperty(ctrlrole)) { componentName = mapping[ctrlrole]; }else{ throw 'can not find the suitable component'; } return componentName; }, setModelFieldValue: function(model, fieldName, value) { if (fieldName.indexOf('.') != -1) { var fields = fieldName.split('.'); var subModel; for (var i = 0, length = fields.length - 1; i < length; i++) { fieldName = fields[i]; subModel = model[fieldName]; if (typeof subModel == 'undefined') { subModel = {}; model[fieldName] = subModel; } model = subModel; } fieldName = fields[fields.length - 1]; } model[fieldName] = value; }, setTamplateModelFieldValue: function(model, fieldName, value) { if (fieldName.indexOf('.') != -1) { var fields = fieldName.split('.'); fieldName = fields.join('_'); } model[fieldName] = value; }, /** * 增加表单数据进行加密传输 * 表单数据有些格式数据会被防火墙或者网络安全策略拦截,导致保存失败 * @param data */ encryptFormModelData:function(data){ var option={model:data.model}; var encryptObj = shr.encryptForObj(option, null); data.model = encryptObj.obj['model']; data.encryptKeys='encryptKeys:' + $.allEncrypt('model'); }, addEncryptParams:function(postData,key,value){ var option ={}; option[key]=value; var encryptObj = $.encryptForObj(option, null); $.extend(postData, encryptObj.obj); if (!postData.encryptKeys){ postData.encryptKeys = encryptObj.keyStr; } else if(shr.arrayIndexOf(postData.encryptKeys.split(','),encryptObj.keyStr) == -1 && key != 'encryptKeys') { postData.encryptKeys = postData.encryptKeys+','+ encryptObj.keyStr; } }, /** * 增加接口数据进行加密传输 * @param postData */ addEncryptPostData: function(postData,isAllEncrypt){ if(postData){ var encryptKeysStr = postData.encryptKeys; var needEncryptKey = shr.needEncryptKey(); if(encryptKeysStr && encryptKeysStr.indexOf('encryptKeys:') != -1){ encryptKeysStr = $.allDecrypt(encryptKeysStr.substring(12,encryptKeysStr.length)); }else if(encryptKeysStr && encryptKeysStr.indexOf('encryptKeys:') < 0){ var optEncryptKeysArray = encryptKeysStr.split(','); optEncryptKeysArray.forEach(function(item){ if(shr.arrayIndexOf(needEncryptKey,item) < 0){ needEncryptKey.push(item); } }); } if(postData.encryptKeys && encryptKeysStr){ var encryptKeys = encryptKeysStr; for(var key in postData){ if(shr.arrayIndexOf(encryptKeys.split(','),key) != -1 && key != 'encryptKeys'){ try { if($.allDecrypt(postData[key])){ postData[key] = $.allDecrypt(postData[key]); } } catch (error) {} } } postData.encryptKeys = ''; }else if(!postData.encryptKeys){ postData.encryptKeys = ''; } } for(var key in postData){ if(postData[key] && !Array.isArray(postData[key])){ if(!isAllEncrypt && shr.arrayIndexOf(needEncryptKey,key) >= 0){ shr.addEncryptParams(postData, key, postData[key]); }else if(isAllEncrypt && shr.arrayIndexOf(['method','serviceName','uipk','encryptKeys'],key) < 0){ shr.addEncryptParams(postData, key, postData[key]); } } } if(postData.encryptKeys){ postData.encryptKeys = 'encryptKeys:' + $.allEncrypt(postData.encryptKeys); } }, needEncryptKey: function(){ return ['filterItems','filter', 'fastFilterItems','sorterItems','advancedFilter','custom_params', 'tree_params','columnModel','queryMode','exportPrivteProtected', 'keyField','dataPerm','fieldName_key','searchFilterItems','categoryFilter', 'contractFilter','dynamicSql','model','order']; }, //将url参数转换成对象类型,并且参数值做了 decodeURIComponent,所以 仅供与dealPostParam去使用,别的地方不可以使用 urlParamsToObject: function(url) { var queryString = url.split('?').length > 1?url.split('?')[1]:''; var paramsArr = queryString.split('&'); var paramObj = {}; for ( var i = 0; i < paramsArr.length; i++) { var pos = paramsArr[i].indexOf('=');// 查找name=value if (pos == -1) continue;// 如果没有找到就跳过 var argname = paramsArr[i].substring(0, pos);// 提取name var value = paramsArr[i].substring(pos + 1);// 提取value try { paramObj[argname] = decodeURIComponent(value); } catch (error) { paramObj[argname] = value; } } return paramObj; }, dealPostParam: function(option){ var isHasKey = false; var isUrlHasKey = false; if(option.data){ if(option.data.noEncrypt) return; var encryptKey = shr.needEncryptKey(); var optEncryptKeys = option.data.encryptKeys; if(optEncryptKeys && optEncryptKeys.indexOf('encryptKeys:') < 0){ var optEncryptKeysArray = optEncryptKeys.split(','); optEncryptKeysArray.forEach(function(item){ if(shr.arrayIndexOf(shr.needEncryptKey(),item) < 0){ encryptKey.push(item); } }); } for(var item in option.data){ if(shr.arrayIndexOf(encryptKey,item) >= 0){ isHasKey = true; } } if(option.url.indexOf('/shr/dynamic.do') >= 0){ encryptKey.forEach(function(item){ if(option.url.indexOf(item) >= 0){ isUrlHasKey = true; } }); } } if(option.url.indexOf('getListData') >= 0 || isUrlHasKey){ var paramObj = shr.urlParamsToObject(option.url); option.url = option.url.split('?')[0]; $.extend(option.data,paramObj); shr.addEncryptPostData(option.data); option.type = 'POST'; }else if(option.data && option.data.method == 'callService'){ shr.addEncryptPostData(option.data,true); }else if(option.data && option.data.method == 'exportToExcel' || option.data && option.data.method == 'newTask'){ shr.addEncryptPostData(option.data); }else if(option.data && option.data.method == 'getCompareResults'){ option.data.a = $.allEncrypt(option.data.a); option.data.b = $.allEncrypt(option.data.b); option.data.encryptKeys='encryptKeys:' + $.allEncrypt('a,b'); }else if(isHasKey){ shr.addEncryptPostData(option.data); } }, doAction: function(option) { //shr.dealPostParam会修改options,防止影响外部参数引用 var option = $.extend(true,{},option); // disible button if (option.target) { var $target = $(option.target); if ($target.is('button')) { $target.addClass('shrbtn-disabled'); $target.attr('disabled', 'disabled'); } } //拼接请求URL if(option.url == null){ if(option.param != null) { option.url = "?method=" + option.action + "&" + option.param; } else { option.url="?method=" + option.action; } } //默认传输格式为json if(option.dataType==null){ option.dataType = "json"; } //默认请求超时时间为ajaxTimeout if(option.timeout==null) { option.timeout=this.ajaxTimeout; } //默认表单名称为form /*if(option.form==null){ option.form="form"; }*/ //默认提交方式为异步方式 if(option.async==null){ option.async=true; } //默认阻塞界面 if(option.showBlock == null){ option.showBlock = true; } // add check data this._addCommonExtParam( option ); this.dealPostParam( option ); //var timer=null; var requestOption = { url: option.url, data: option.data, /* 默认ajax数据交互格式为json */ dataType: option.dataType, type: option.type, async: option.async, timeout: option.timeout, success: function(obj, textStatus) { if (option.showBlock == true) { clearTimeout(timer); $.block.hide(); } if(obj == null){ option.success(null); return ; } if (option.dataType == 'json') { //自行处理返回 if(option.ignoreHandlerMessage && option.ignoreHandlerMessage == true){ option.success(obj, textStatus); return; } if(obj.result == "success") { var message = obj.successMessage; if (!message) { message = $.shrI18n.common.tips.operateSuccess; } shr.showSuccess({ message: message, hideAfter: 3 }); //如果是portal跳转过来,top为0,否则为60px if (isFromPortal()) { $("ul[class='messenger messenger-fixed messenger-theme-air messenger-on-top messenger-theme-future']").css('top', 0); } else { $("ul[class='messenger messenger-fixed messenger-theme-air messenger-on-top messenger-theme-future']").css('top', '60px'); } //调用回调函数 if(option.success) { option.success(obj.data, obj.uiItems, obj.script); } } else if(obj.result == "error") { var message = obj.summary; // if (!$.isEmptyObject(obj.detailInfo)) { // message = message + '
' + obj.detailInfo; // } if (!message) { message = $.shrI18n.common.tips.operateFail; } shr.showError({message: message}); //调用回调函数 if(option.error) { option.error(obj.data, obj.uiItems, obj.script); } } } else { if(option.success != null) { shr.showInfo({ message: $.shrI18n.common.tips.operateSuccess, hideAfter: 3 }); shr.stopAllMask(); //调用回调函数 if(option.success) { option.success(obj); } } } }, error:function(response, textStatus, errorThrown) { return shr.handleError(option, response, textStatus, errorThrown); }, complete:function(jqXHR, textStatus){ if(option.complete && waf.isFunction(option.complete)){ option.complete.call(this, jqXHR, textStatus); } /*if (option.showBlock == true) { clearTimeout(timer); $.block.hide(); }*/ if (option.target) { var $target = $(option.target); if ($target.is('button')) { $target.removeClass('shrbtn-disabled'); $target.removeAttr('disabled'); } } } }; var messageOptions = { //successMessage : '操作成功!', errorMessage : $.shrI18n.common.tips.operateFail, progressMessage : $.shrI18n.common.tips.operating, showCloseButton: true, singleton: true, hideAfter: null }; shr.msgHideAll(); //锁定BODY if (option.showBlock == true) { /*$.block.show({ text: '正在执行,请稍候...' });*/ timer = setTimeout(function() { $.block.show({ text: $.shrI18n.common.loadingText.runningPlsWait }); }, shr.blockMinTime); } _top.Messenger().run(messageOptions, requestOption); /*//锁定BODY if(option.showBlock==true){ timer=setTimeout(function(){ waf.block.show({text:waf.localeResourceObj.AJAX_ASYNC_BLOCK_INFO}); }, 500); }*/ /*报出提交事件 */ /*$('#' + option.form).trigger("onSubmit"); 提交 $('#' + option.form).ajaxSubmit(requestOption);*/ }, //检测数组中是否包含某个字符串 arrayIndexOf: function(arr,key){ if(!Array.isArray(arr)){ return -1; } var bol = -1; arr.forEach(function(item,index){ if(item === key){ bol = index; } }); return bol; }, /** * 判断是否是一个json */ isJSON: function(str) { if (typeof str == 'string') { try { var obj = JSON.parse(str); if(typeof obj == 'object' && obj ){ return true; }else{ return false; } } catch(e) { return false; } } }, doWithBatchAction: function(option) { //shr.dealPostParam会修改options,防止影响外部参数引用 var option = $.extend(true,{},option); // disible button if (option.target) { var $target = $(option.target); if ($target.is('button')) { $target.addClass('shrbtn-disabled'); $target.attr('disabled', 'disabled'); } } //拼接请求URL if(option.url == null){ if(option.param != null) { option.url = "?method=" + option.action + "&" + option.param; } else { option.url="?method=" + option.action; } } //默认传输格式为json if(option.dataType==null){ option.dataType = "json"; } //默认请求超时时间为ajaxTimeout if(option.timeout==null) { option.timeout=this.ajaxTimeout; } //默认表单名称为form /*if(option.form==null){ option.form="form"; }*/ //默认提交方式为异步方式 if(option.async==null){ option.async=true; } //默认阻塞界面 if(option.showBlock == null){ option.showBlock = true; } // add check data this._addCommonExtParam( option ); shr.dealPostParam( option ); //var timer=null; var requestOption = { url: option.url, data: option.data, /* 默认ajax数据交互格式为json */ dataType: option.dataType, type: option.type, async: option.async, timeout: option.timeout, success: function(obj, textStatus) { if (option.showBlock == true) { clearTimeout(timer); $.block.hide(); } if(obj == null){ option.success(null); return ; } if (option.dataType == 'json') { if(obj.result == "success") { // var message = obj.successMessage; // if (!message) { // message = '操作成功!'; // } // shr.showInfo({ // message: message, // hideAfter: 3 // }); //调用回调函数 if(option.success) { option.success(obj.data, obj.uiItems, obj.script); } } else if(obj.result == "error") { var message = obj.summary; // if (!$.isEmptyObject(obj.detailInfo)) { // message = message + '
' + obj.detailInfo; // } if (!message) { message = $.shrI18n.common.tips.operateFail; } shr.showError({message: message}); //调用回调函数 if(option.error) { option.error(obj.data, obj.uiItems, obj.script); } } } else { if(option.success != null) { // shr.showInfo({ // message: "操作成功!", // hideAfter: 3 // }); //调用回调函数 if(option.success) { option.success(obj); } } } }, error:function(response, textStatus, errorThrown) { return shr.handleError(option, response, textStatus, errorThrown); }, complete:function(jqXHR, textStatus){ if(option.complete && waf.isFunction(option.complete)){ option.complete.call(this, jqXHR, textStatus); } /*if (option.showBlock == true) { clearTimeout(timer); $.block.hide(); }*/ if (option.target) { var $target = $(option.target); if ($target.is('button')) { $target.removeClass('shrbtn-disabled'); $target.removeAttr('disabled'); } } } }; var messageOptions = { //successMessage : '操作成功!', errorMessage : $.shrI18n.common.tips.operateFail, progressMessage : $.shrI18n.common.tips.operating, showCloseButton: true, singleton: true, hideAfter: null }; shr.msgHideAll(); //锁定BODY if (option.showBlock == true) { /*$.block.show({ text: '正在执行,请稍候...' });*/ timer = setTimeout(function() { $.block.show({ text: $.shrI18n.common.loadingText.runningPlsWait }); }, shr.blockMinTime); } var messageFun; if($.isFunction(_top.Messenger)){ messageFun = _top.Messenger(); }else{ messageFun = Messenger(); } messageFun.run(messageOptions, requestOption); /*//锁定BODY if(option.showBlock==true){ timer=setTimeout(function(){ waf.block.show({text:waf.localeResourceObj.AJAX_ASYNC_BLOCK_INFO}); }, 500); }*/ /*报出提交事件 */ /*$('#' + option.form).trigger("onSubmit"); 提交 $('#' + option.form).ajaxSubmit(requestOption);*/ }, /** *此请求,要求success函数一定要进行回调重写 */ doAjaxNeedSuccess: function(option) { option.successResultSelfHandler = true; return $.doAjax(option); }, doAjax: function(option) { //拼接请求URL if(option.url == null && option.action){ if(option.param != null) { option.url = "?method=" + option.action + "&" + option.param; } else { option.url= "?method=" + option.action; } } if (option.data && !(option.data.method) && option.action) { option.data.method = option.action; } //默认传输格式为json if(option.dataType==null){ option.dataType = "json"; } //默认请求超时时间为ajaxTimeout if(option.timeout==null) { option.timeout=this.ajaxTimeout; } //默认表单名称为form /*if(option.form==null){ option.form="form"; }*/ //默认提交方式为异步方式 if(option.async==null){ option.async=true; } //默认阻塞界面 /*if(option.showBlock==null){ option.showBlock = true; }*/ // add check data this._addCommonExtParam( option ); //var timer=null; var requestOption = { url: option.url, data: option.data, /* 默认ajax数据交互格式为json */ dataType: option.dataType, type: option.type, async: option.async, timeout: option.timeout, error: function(response, textStatus, errorThrown) { if(option.error && $.isFunction(option.error)){ return option.error.call(this, response, textStatus, errorThrown); } else { return shr.handleError(option, response, textStatus, errorThrown); } }, complete: function(jqXHR, textStatus){ if(option.complete && $.isFunction(option.complete)){ option.complete.call(this, jqXHR, textStatus); } if (option.showBlock == true) { clearTimeout(timer); $.block.hide(); } } }; if (option.success) { requestOption.success = function(obj, textStatus) { //解锁BODY if (option.showBlock == true) { clearTimeout(timer); $.block.hide(); } if(obj == null){ option.success(null); return ; } if(option.successResultSelfHandler === true){ option.success(obj, textStatus); return; } if (option.dataType == 'json') { if(obj.result == "success") { if(option.success != null) { //调用回调函数 option.success(obj.data, obj.uiItems, obj.script); } } else if(obj.result == "error") { //$('body').html(obj); //var message = obj.summary + '
' + obj.detailInfo; var message = obj.summary; shr.showError({message: message}); if(option.error != null) { option.error(obj); } } else { option.success(obj); } } else { if(option.success != null) { //调用回调函数 option.success(obj); } } }; } //锁定BODY if (option.showBlock == true) { timer = setTimeout(function() { $.block.show({ text: $.shrI18n.common.loadingText.runningPlsWait }); }, shr.blockMinTime); } if(option.contentType){ requestOption.contentType = option.contentType; } if(option.headers){ requestOption.headers = option.headers; } return $.ajax(requestOption); }, /** * 判断是否是session失效,重定向到登录页面 */ checkIsRedirectLogin: function(response) { var content; if (typeof response == 'string') { content = response; } else if (typeof response == 'object' && response.responseText) { content = response.responseText; } if (content && content.indexOf('action="login?') != -1) { shr.redirectLogin(); return true; } return false; }, /** * 重定向登录页面 */ redirectLogin: function() { _top.location.href = _top.location.href }, doGet: function(option) { //拼接请求URL if(option.url == null){ if(option.param != null) { option.url = "?method=" + option.action + "&" + option.param; } else { option.url="?method=" + option.action; } } //默认传输格式为json if(option.dataType==null){ option.dataType = "html"; } //默认请求超时时间为ajaxTimeout if(option.timeout==null) { option.timeout=this.ajaxTimeout; } //默认提交方式为异步方式 if(option.async==null){ option.async = true; } //添加shruicode this._addShruicode( option.data ); //var timer=null; var url = option.url; var requestOption = { url: option.url, data: option.data, /* 默认ajax数据交互格式为json */ dataType: option.dataType, type: option.type, async: option.async, timeout: option.timeout, success: function(obj, textStatus) { //obj返回可能为空 var $response; try { $response = $(obj); }catch (e){ console.log('response data exception: null data response.'); } if ($response && $response.filter('meta[content=error-page]').length > 0) { var regexp1 = /