syUtil.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385
  1. /**
  2. * @author 孙宇
  3. *
  4. * @requires jQuery,EasyUI
  5. *
  6. * panel关闭时回收内存,主要用于layout使用iframe嵌入网页时的内存泄漏问题
  7. */
  8. $.fn.panel.defaults.onBeforeDestroy = function() {
  9. var frame = $('iframe', this);
  10. try {
  11. if (frame.length > 0) {
  12. for ( var i = 0; i < frame.length; i++) {
  13. frame[i].contentWindow.document.write('');
  14. frame[i].contentWindow.close();
  15. }
  16. frame.remove();
  17. if ($.browser.msie) {
  18. CollectGarbage();
  19. }
  20. }
  21. } catch (e) {
  22. }
  23. };
  24. /**
  25. * 使panel和datagrid在加载时提示
  26. *
  27. * @author 孙宇
  28. *
  29. * @requires jQuery,EasyUI
  30. *
  31. */
  32. $.fn.panel.defaults.loadingMessage = '加载中....';
  33. $.fn.datagrid.defaults.loadMsg = '加载中....';
  34. /**
  35. * @author 孙宇
  36. *
  37. * @requires jQuery,EasyUI
  38. *
  39. * 通用错误提示
  40. *
  41. * 用于datagrid/treegrid/tree/combogrid/combobox/form加载数据出错时的操作
  42. */
  43. var easyuiErrorFunction = function(XMLHttpRequest) {
  44. $.messager.progress('close');
  45. //update-begin--Author:zhoujf Date:20170608 for:TASK #2058 【提示风格】断网后,点击下一页提示信息--------------------
  46. try{
  47. var emsg = XMLHttpRequest.responseText.substring(XMLHttpRequest.responseText.indexOf('错误描述'),XMLHttpRequest.responseText.indexOf('错误信息'));
  48. if(emsg==undefined||emsg==''){
  49. emsg = "网络异常!";
  50. }
  51. $.messager.alert('错误',emsg);
  52. }catch(ex){
  53. $.messager.alert('错误',XMLHttpRequest.responseText==''?'网络异常!':XMLHttpRequest.responseText);
  54. }
  55. //update-end--Author:zhoujf Date:20170608 for:TASK #2058 【提示风格】断网后,点击下一页提示信息--------------------
  56. };
  57. $.fn.datagrid.defaults.onLoadError = easyuiErrorFunction;
  58. $.fn.treegrid.defaults.onLoadError = easyuiErrorFunction;
  59. $.fn.tree.defaults.onLoadError = easyuiErrorFunction;
  60. $.fn.combogrid.defaults.onLoadError = easyuiErrorFunction;
  61. $.fn.combobox.defaults.onLoadError = easyuiErrorFunction;
  62. $.fn.form.defaults.onLoadError = easyuiErrorFunction;
  63. /**
  64. * @author 孙宇
  65. *
  66. * @requires jQuery,EasyUI
  67. *
  68. * 为datagrid、treegrid增加表头菜单,用于显示或隐藏列,注意:冻结列不在此菜单中
  69. */
  70. var createGridHeaderContextMenu = function(e, field) {
  71. e.preventDefault();
  72. var grid = $(this);/* grid本身 */
  73. var headerContextMenu = this.headerContextMenu;/* grid上的列头菜单对象 */
  74. if (!headerContextMenu) {
  75. var tmenu = $('<div style="width:100px;"></div>').appendTo('body');
  76. var fields = grid.datagrid('getColumnFields');
  77. console.log('id='+grid.attr('id'));
  78. storage=$.localStorage;if(!storage)storage=$.cookieStorage;
  79. var cols = storage.get(grid.attr('id')+'hiddenColumns');
  80. var init=true;
  81. if(cols){
  82. init=false;
  83. }
  84. for ( var i = 0; i < fields.length; i++) {
  85. var fildOption = grid.datagrid('getColumnOption', fields[i]);
  86. console.log(fields[i]+'='+fildOption.hidden);
  87. if (!fildOption.hidden||fildOption.hidden==false) {
  88. $('<div iconCls="icon-ok" field="' + fields[i] + '"/>').html(fildOption.title).appendTo(tmenu);
  89. } else {
  90. if(init==false){
  91. for(var j=0;j<cols.length;j++){
  92. if(cols[j].field==fields[i]&&cols[j].visible!=false){
  93. //console.log(cols[j].field+'=='+cols[j].visible);
  94. $('<div iconCls="icon-empty" field="' + fields[i] + '"/>').html(fildOption.title).appendTo(tmenu);
  95. }
  96. }
  97. }
  98. }
  99. }saveHeader();//龙金波,修改bug 先存一个表头的hidden初始状态,避免隐藏字段第一次保存时就不对了
  100. headerContextMenu = this.headerContextMenu = tmenu.menu({
  101. onClick : function(item) {
  102. var field = $(item.target).attr('field');
  103. if (item.iconCls == 'icon-ok') {
  104. grid.datagrid('hideColumn', field);
  105. $(this).menu('setIcon', {
  106. target : item.target,
  107. iconCls : 'icon-empty'
  108. });saveHeader(field,true);//龙金波添加保存表头
  109. } else if (item.iconCls == 'icon-empty') {
  110. grid.datagrid('showColumn', field);
  111. $(this).menu('setIcon', {
  112. target : item.target,
  113. iconCls : 'icon-ok'
  114. });saveHeader(field,false);//龙金波添加保存表头
  115. }else{
  116. //恢复表头
  117. }
  118. }
  119. });
  120. }
  121. headerContextMenu.menu('show', {
  122. left : e.pageX,
  123. top : e.pageY
  124. });
  125. };
  126. $.fn.datagrid.defaults.onHeaderContextMenu = createGridHeaderContextMenu;
  127. $.fn.treegrid.defaults.onHeaderContextMenu = createGridHeaderContextMenu;
  128. /**
  129. * @author 孙宇
  130. *
  131. * @requires jQuery,EasyUI
  132. *
  133. * 扩展validatebox,添加验证两次密码功能
  134. */
  135. $.extend($.fn.validatebox.defaults.rules, {
  136. eqPwd : {
  137. validator : function(value, param) {
  138. return value == $(param[0]).val();
  139. },
  140. message : '密码不一致!'
  141. }
  142. });
  143. /**
  144. * @author 夏悸
  145. *
  146. * @requires jQuery,EasyUI
  147. *
  148. * 扩展tree,使其支持平滑数据格式
  149. */
  150. $.fn.tree.defaults.loadFilter = function(data, parent) {
  151. var opt = $(this).data().tree.options;
  152. var idFiled, textFiled, parentField;
  153. if (opt.parentField) {
  154. idFiled = opt.idFiled || 'id';
  155. textFiled = opt.textFiled || 'text';
  156. parentField = opt.parentField;
  157. var i, l, treeData = [], tmpMap = [];
  158. for (i = 0, l = data.length; i < l; i++) {
  159. tmpMap[data[i][idFiled]] = data[i];
  160. }
  161. for (i = 0, l = data.length; i < l; i++) {
  162. if (tmpMap[data[i][parentField]] && data[i][idFiled] != data[i][parentField]) {
  163. if (!tmpMap[data[i][parentField]]['children'])
  164. tmpMap[data[i][parentField]]['children'] = [];
  165. data[i]['text'] = data[i][textFiled];
  166. tmpMap[data[i][parentField]]['children'].push(data[i]);
  167. } else {
  168. data[i]['text'] = data[i][textFiled];
  169. treeData.push(data[i]);
  170. }
  171. }
  172. return treeData;
  173. }
  174. return data;
  175. };
  176. /**
  177. * @author 孙宇
  178. *
  179. * @requires jQuery,EasyUI
  180. *
  181. * 扩展treegrid,使其支持平滑数据格式
  182. */
  183. $.fn.treegrid.defaults.loadFilter = function(data, parentId) {
  184. var opt = $(this).data().treegrid.options;
  185. var idFiled, textFiled, parentField;
  186. if (opt.parentField) {
  187. idFiled = opt.idFiled || 'id';
  188. textFiled = opt.textFiled || 'text';
  189. parentField = opt.parentField;
  190. var i, l, treeData = [], tmpMap = [];
  191. for (i = 0, l = data.length; i < l; i++) {
  192. tmpMap[data[i][idFiled]] = data[i];
  193. }
  194. for (i = 0, l = data.length; i < l; i++) {
  195. if (tmpMap[data[i][parentField]] && data[i][idFiled] != data[i][parentField]) {
  196. if (!tmpMap[data[i][parentField]]['children'])
  197. tmpMap[data[i][parentField]]['children'] = [];
  198. data[i]['text'] = data[i][textFiled];
  199. tmpMap[data[i][parentField]]['children'].push(data[i]);
  200. } else {
  201. data[i]['text'] = data[i][textFiled];
  202. treeData.push(data[i]);
  203. }
  204. }
  205. return treeData;
  206. }
  207. return data;
  208. };
  209. /**
  210. * @author 孙宇
  211. *
  212. * @requires jQuery,EasyUI
  213. *
  214. * 扩展combotree,使其支持平滑数据格式
  215. */
  216. $.fn.combotree.defaults.loadFilter = $.fn.tree.defaults.loadFilter;
  217. /**
  218. * @author 孙宇
  219. *
  220. * @requires jQuery,EasyUI
  221. *
  222. * 防止panel/window/dialog组件超出浏览器边界
  223. * @param left
  224. * @param top
  225. */
  226. var easyuiPanelOnMove = function(left, top) {
  227. var l = left;
  228. var t = top;
  229. if (l < 1) {
  230. l = 1;
  231. }
  232. if (t < 1) {
  233. t = 1;
  234. }
  235. var width = parseInt($(this).parent().css('width')) + 14;
  236. var height = parseInt($(this).parent().css('height')) + 14;
  237. var right = l + width;
  238. var buttom = t + height;
  239. var browserWidth = $(window).width();
  240. var browserHeight = $(window).height();
  241. if (right > browserWidth) {
  242. l = browserWidth - width;
  243. }
  244. if (buttom > browserHeight) {
  245. t = browserHeight - height;
  246. }
  247. $(this).parent().css({/* 修正面板位置 */
  248. left : l,
  249. top : t
  250. });
  251. };
  252. try {
  253. $.fn.dialog.defaults.onMove = easyuiPanelOnMove;
  254. $.fn.window.defaults.onMove = easyuiPanelOnMove;
  255. $.fn.panel.defaults.onMove = easyuiPanelOnMove;
  256. } catch (e) {
  257. // TODO: handle exception
  258. }
  259. /**
  260. * @author 孙宇
  261. *
  262. * @requires jQuery,EasyUI,jQuery cookie plugin
  263. *
  264. * 更换EasyUI主题的方法
  265. *
  266. * @param themeName
  267. * 主题名称
  268. */
  269. changeTheme = function(themeName) {
  270. var $easyuiTheme = $('#easyuiTheme');
  271. var url = $easyuiTheme.attr('href');
  272. var href = url.substring(0, url.indexOf('themes')) + 'themes/' + themeName + '/easyui.css';
  273. $easyuiTheme.attr('href', href);
  274. var $iframe = $('iframe');
  275. if ($iframe.length > 0) {
  276. for ( var i = 0; i < $iframe.length; i++) {
  277. var ifr = $iframe[i];
  278. $(ifr).contents().find('#easyuiTheme').attr('href', href);
  279. }
  280. }
  281. $.cookie('easyuiThemeName', themeName, {
  282. expires : 7
  283. });
  284. };
  285. /**
  286. * @author 孙宇
  287. *
  288. * @requires jQuery
  289. *
  290. * 将form表单元素的值序列化成对象
  291. *
  292. * @returns object
  293. */
  294. serializeObject = function(form) {
  295. var o = {};
  296. $.each(form.serializeArray(), function(index) {
  297. if (o[this['name']]) {
  298. o[this['name']] = o[this['name']] + "," + this['value'];
  299. } else {
  300. o[this['name']] = this['value'];
  301. }
  302. });
  303. return o;
  304. };
  305. /**
  306. * @author 孙宇
  307. *
  308. * 增加formatString功能
  309. *
  310. * 使用方法:formatString('字符串{0}字符串{1}字符串','第一个变量','第二个变量');
  311. *
  312. * @returns 格式化后的字符串
  313. */
  314. formatString = function(str) {
  315. for ( var i = 0; i < arguments.length - 1; i++) {
  316. str = str.replace("{" + i + "}", arguments[i + 1]);
  317. }
  318. return str;
  319. };
  320. /**
  321. * @author 孙宇
  322. *
  323. * 接收一个以逗号分割的字符串,返回List,list里每一项都是一个字符串
  324. *
  325. * @returns list
  326. */
  327. stringToList = function(value) {
  328. if (value != undefined && value != '') {
  329. var values = [];
  330. var t = value.split(',');
  331. for ( var i = 0; i < t.length; i++) {
  332. values.push('' + t[i]);/* 避免他将ID当成数字 */
  333. }
  334. return values;
  335. } else {
  336. return [];
  337. }
  338. };
  339. /**
  340. * @author 孙宇
  341. *
  342. * @requires jQuery
  343. *
  344. * 改变jQuery的AJAX默认属性和方法
  345. */
  346. $.ajaxSetup({
  347. type : 'POST',
  348. error : function(XMLHttpRequest, textStatus, errorThrown) {
  349. $.messager.progress('close');
  350. $.messager.alert('错误', XMLHttpRequest.responseText==''?'网络异常!':XMLHttpRequest.responseText);
  351. }
  352. });
  353. function clearLocalstorage(){
  354. storage=$.localStorage;
  355. if(!storage)
  356. storage=$.cookieStorage;
  357. storage.removeAll();
  358. $.messager.alert('信息', "浏览器缓存清除成功!");
  359. }
  360. //update-begin--Author:钟世云 Date:20150610 for:online支持树配置--------------------
  361. //如果在最外层页面,创建tools对象
  362. if (window.top == window) {
  363. var tools = {msg : "这是一个工具对象,可以把常用属性放到这个对象上。如:在任意页面用top.currDatagri可以获取当前的datagrid"};
  364. }
  365. //update-end--Author:钟世云 Date:20150610 for:online支持树配置----------------------