syExtEasyUI.js 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382
  1. var sy = sy || {};
  2. /**
  3. * 更改easyui加载panel时的提示文字
  4. *
  5. * @author Jeffrey
  6. *
  7. * @requires jQuery,EasyUI
  8. */
  9. $.extend($.fn.panel.defaults, {
  10. loadingMessage : '加载中....'
  11. });
  12. /**
  13. * 更改easyui加载grid时的提示文字
  14. *
  15. * @author Jeffrey
  16. *
  17. * @requires jQuery,EasyUI
  18. */
  19. $.extend($.fn.datagrid.defaults, {
  20. loadMsg : '数据加载中....'
  21. });
  22. /**
  23. * panel关闭时回收内存,主要用于layout使用iframe嵌入网页时的内存泄漏问题
  24. *
  25. * @author Jeffrey
  26. *
  27. * @requires jQuery,EasyUI
  28. *
  29. */
  30. $.extend($.fn.panel.defaults, {
  31. onBeforeDestroy : function() {
  32. var frame = $('iframe', this);
  33. try {
  34. if (frame.length > 0) {
  35. for (var i = 0; i < frame.length; i++) {
  36. frame[i].src = '';
  37. frame[i].contentWindow.document.write('');
  38. frame[i].contentWindow.close();
  39. }
  40. frame.remove();
  41. if (navigator.userAgent.indexOf("MSIE") > 0) {// IE特有回收内存方法
  42. try {
  43. CollectGarbage();
  44. } catch (e) {
  45. }
  46. }
  47. }
  48. } catch (e) {
  49. }
  50. }
  51. });
  52. /**
  53. * 防止panel/window/dialog组件超出浏览器边界
  54. *
  55. * @author Jeffrey
  56. *
  57. * @requires jQuery,EasyUI
  58. */
  59. sy.onMove = {
  60. onMove : function(left, top) {
  61. var l = left;
  62. var t = top;
  63. if (l < 1) {
  64. l = 1;
  65. }
  66. if (t < 1) {
  67. t = 1;
  68. }
  69. var width = parseInt($(this).parent().css('width')) + 14;
  70. var height = parseInt($(this).parent().css('height')) + 14;
  71. var right = l + width;
  72. var buttom = t + height;
  73. var browserWidth = $(window).width();
  74. var browserHeight = $(window).height();
  75. if (right > browserWidth) {
  76. l = browserWidth - width;
  77. }
  78. if (buttom > browserHeight) {
  79. t = browserHeight - height;
  80. }
  81. $(this).parent().css({/* 修正面板位置 */
  82. left : l,
  83. top : t
  84. });
  85. }
  86. };
  87. $.extend($.fn.dialog.defaults, sy.onMove);
  88. $.extend($.fn.window.defaults, sy.onMove);
  89. $.extend($.fn.panel.defaults, sy.onMove);
  90. /**
  91. *
  92. * 通用错误提示
  93. *
  94. * 用于datagrid/treegrid/tree/combogrid/combobox/form加载数据出错时的操作
  95. *
  96. * @author Jeffrey
  97. *
  98. * @requires jQuery,EasyUI
  99. */
  100. sy.onLoadError = {
  101. onLoadError : function(XMLHttpRequest) {
  102. if (parent.$ && parent.$.messager) {
  103. parent.$.messager.progress('close');
  104. parent.$.messager.alert('错误', XMLHttpRequest.responseText);
  105. } else {
  106. $.messager.progress('close');
  107. $.messager.alert('错误', XMLHttpRequest.responseText);
  108. }
  109. }
  110. };
  111. $.extend($.fn.datagrid.defaults, sy.onLoadError);
  112. $.extend($.fn.treegrid.defaults, sy.onLoadError);
  113. $.extend($.fn.tree.defaults, sy.onLoadError);
  114. $.extend($.fn.combogrid.defaults, sy.onLoadError);
  115. $.extend($.fn.combobox.defaults, sy.onLoadError);
  116. $.extend($.fn.form.defaults, sy.onLoadError);
  117. /**
  118. * 扩展combobox在自动补全模式时,检查用户输入的字符是否存在于下拉框中,如果不存在则清空用户输入
  119. *
  120. * @author Jeffrey
  121. *
  122. * @requires jQuery,EasyUI
  123. */
  124. $.extend($.fn.combobox.defaults, {
  125. onShowPanel : function() {
  126. var _options = $(this).combobox('options');
  127. if (_options.mode == 'remote') {/* 如果是自动补全模式 */
  128. var _value = $(this).combobox('textbox').val();
  129. var _combobox = $(this);
  130. if (_value.length > 0) {
  131. $.post(_options.url, {
  132. q : _value
  133. }, function(result) {
  134. if (result && result.length > 0) {
  135. _combobox.combobox('loadData', result);
  136. }
  137. }, 'json');
  138. }
  139. }
  140. },
  141. onHidePanel : function() {
  142. var _options = $(this).combobox('options');
  143. if (_options.mode == 'remote') {/* 如果是自动补全模式 */
  144. var _data = $(this).combobox('getData');/* 下拉框所有选项 */
  145. var _value = $(this).combobox('getValue');/* 用户输入的值 */
  146. var _b = false;/* 标识是否在下拉列表中找到了用户输入的字符 */
  147. for (var i = 0; i < _data.length; i++) {
  148. if (_data[i][_options.valueField] == _value) {
  149. _b = true;
  150. }
  151. }
  152. if (!_b) {/* 如果在下拉列表中没找到用户输入的字符 */
  153. $(this).combobox('setValue', '');
  154. }
  155. }
  156. }
  157. });
  158. /**
  159. * 扩展combogrid在自动补全模式时,检查用户输入的字符是否存在于下拉框中,如果不存在则清空用户输入
  160. *
  161. * @author Jeffrey
  162. *
  163. * @requires jQuery,EasyUI
  164. */
  165. $.extend($.fn.combogrid.defaults, {
  166. onShowPanel : function() {
  167. var _options = $(this).combogrid('options');
  168. if (_options.mode == 'remote') {/* 如果是自动补全模式 */
  169. var _value = $(this).combogrid('textbox').val();
  170. if (_value.length > 0) {
  171. $(this).combogrid('grid').datagrid("load", {
  172. q : _value
  173. });
  174. }
  175. }
  176. },
  177. onHidePanel : function() {
  178. var _options = $(this).combogrid('options');
  179. if (_options.mode == 'remote') {/* 如果是自动补全模式 */
  180. var _data = $(this).combogrid('grid').datagrid('getData').rows;/* 下拉框所有选项 */
  181. var _value = $(this).combogrid('getValue');/* 用户输入的值 */
  182. var _b = false;/* 标识是否在下拉列表中找到了用户输入的字符 */
  183. for (var i = 0; i < _data.length; i++) {
  184. if (_data[i][_options.idField] == _value) {
  185. _b = true;
  186. }
  187. }
  188. if (!_b) {/* 如果在下拉列表中没找到用户输入的字符 */
  189. $(this).combogrid('setValue', '');
  190. }
  191. }
  192. }
  193. });
  194. /**
  195. * 扩展validatebox,添加新的验证功能
  196. *
  197. * @author Jeffrey
  198. *
  199. * @requires jQuery,EasyUI
  200. */
  201. $.extend($.fn.validatebox.defaults.rules, {
  202. eqPwd : {/* 验证两次密码是否一致功能 */
  203. validator : function(value, param) {
  204. return value == $(param[0]).val();
  205. },
  206. message : '密码不一致!'
  207. }
  208. });
  209. /**
  210. * 扩展tree和combotree,使其支持平滑数据格式
  211. *
  212. * @author Jeffrey
  213. *
  214. * @requires jQuery,EasyUI
  215. *
  216. */
  217. sy.loadFilter = {
  218. loadFilter : function(data, parent) {
  219. var opt = $(this).data().tree.options;
  220. var idField, textField, parentField;
  221. if (opt.parentField) {
  222. idField = opt.idField || 'id';
  223. textField = opt.textField || 'text';
  224. parentField = opt.parentField || 'pid';
  225. var i, l, treeData = [], tmpMap = [];
  226. for (i = 0, l = data.length; i < l; i++) {
  227. tmpMap[data[i][idField]] = data[i];
  228. }
  229. for (i = 0, l = data.length; i < l; i++) {
  230. if (tmpMap[data[i][parentField]] && data[i][idField] != data[i][parentField]) {
  231. if (!tmpMap[data[i][parentField]]['children'])
  232. tmpMap[data[i][parentField]]['children'] = [];
  233. data[i]['text'] = data[i][textField];
  234. tmpMap[data[i][parentField]]['children'].push(data[i]);
  235. } else {
  236. data[i]['text'] = data[i][textField];
  237. treeData.push(data[i]);
  238. }
  239. }
  240. return treeData;
  241. }
  242. return data;
  243. }
  244. };
  245. $.extend($.fn.combotree.defaults, sy.loadFilter);
  246. $.extend($.fn.tree.defaults, sy.loadFilter);
  247. /**
  248. * 扩展treegrid,使其支持平滑数据格式
  249. *
  250. * @author Jeffrey
  251. *
  252. * @requires jQuery,EasyUI
  253. *
  254. */
  255. $.extend($.fn.treegrid.defaults, {
  256. loadFilter : function(data, parentId) {
  257. var opt = $(this).data().treegrid.options;
  258. var idField, treeField, parentField;
  259. if (opt.parentField) {
  260. idField = opt.idField || 'id';
  261. treeField = opt.textField || 'text';
  262. parentField = opt.parentField || 'pid';
  263. var i, l, treeData = [], tmpMap = [];
  264. for (i = 0, l = data.length; i < l; i++) {
  265. tmpMap[data[i][idField]] = data[i];
  266. }
  267. for (i = 0, l = data.length; i < l; i++) {
  268. if (tmpMap[data[i][parentField]] && data[i][idField] != data[i][parentField]) {
  269. if (!tmpMap[data[i][parentField]]['children'])
  270. tmpMap[data[i][parentField]]['children'] = [];
  271. data[i]['text'] = data[i][treeField];
  272. tmpMap[data[i][parentField]]['children'].push(data[i]);
  273. } else {
  274. data[i]['text'] = data[i][treeField];
  275. treeData.push(data[i]);
  276. }
  277. }
  278. return treeData;
  279. }
  280. return data;
  281. }
  282. });
  283. /**
  284. * 创建一个模式化的dialog
  285. *
  286. * @author Jeffrey
  287. *
  288. * @requires jQuery,EasyUI
  289. *
  290. */
  291. sy.modalDialog = function(options) {
  292. var opts = $.extend({
  293. title : '&nbsp;',
  294. width : 640,
  295. height : 480,
  296. modal : true,
  297. onClose : function() {
  298. $(this).dialog('destroy');
  299. }
  300. }, options);
  301. opts.modal = true;// 强制此dialog为模式化,无视传递过来的modal参数
  302. if (options.url) {
  303. opts.content = '<iframe id="" src="' + options.url + '" allowTransparency="true" scrolling="auto" width="100%" height="98%" frameBorder="0" name=""></iframe>';
  304. }
  305. return $('<div/>').dialog(opts);
  306. };
  307. /**
  308. * 更换主题
  309. *
  310. * @author Jeffrey
  311. * @requires jQuery,EasyUI
  312. * @param themeName
  313. */
  314. sy.changeTheme = function(themeName) {
  315. var $easyuiTheme = $('#easyuiTheme');
  316. var url = $easyuiTheme.attr('href');
  317. var href = url.substring(0, url.indexOf('themes')) + 'themes/' + themeName + '/easyui.css';
  318. $easyuiTheme.attr('href', href);
  319. var $iframe = $('iframe');
  320. if ($iframe.length > 0) {
  321. for (var i = 0; i < $iframe.length; i++) {
  322. var ifr = $iframe[i];
  323. try {
  324. $(ifr).contents().find('#easyuiTheme').attr('href', href);
  325. } catch (e) {
  326. try {
  327. ifr.contentWindow.document.getElementById('easyuiTheme').href = href;
  328. } catch (e) {
  329. }
  330. }
  331. }
  332. }
  333. sy.cookie('easyuiTheme', themeName, {
  334. expires : 7
  335. });
  336. };
  337. /**
  338. * 滚动条
  339. *
  340. * @author Jeffrey
  341. * @requires jQuery,EasyUI
  342. */
  343. sy.progressBar = function(options) {
  344. if (typeof options == 'string') {
  345. if (options == 'close') {
  346. $('#syProgressBarDiv').dialog('destroy');
  347. }
  348. } else {
  349. if ($('#syProgressBarDiv').length < 1) {
  350. var opts = $.extend({
  351. title : '&nbsp;',
  352. closable : false,
  353. width : 300,
  354. height : 60,
  355. modal : true,
  356. content : '<div id="syProgressBar" class="easyui-progressbar" data-options="value:0"></div>'
  357. }, options);
  358. $('<div id="syProgressBarDiv"/>').dialog(opts);
  359. $.parser.parse('#syProgressBarDiv');
  360. } else {
  361. $('#syProgressBarDiv').dialog('open');
  362. }
  363. if (options.value) {
  364. $('#syProgressBar').progressbar('setValue', options.value);
  365. }
  366. }
  367. };