fast.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323
  1. define(['jquery', 'bootstrap', 'toastr', 'layer', 'lang'], function ($, undefined, Toastr, Layer, Lang) {
  2. var Fast = {
  3. config: {
  4. //toastr默认配置
  5. toastr: {
  6. "closeButton": true,
  7. "debug": false,
  8. "newestOnTop": false,
  9. "progressBar": false,
  10. "positionClass": "toast-top-center",
  11. "preventDuplicates": false,
  12. "onclick": null,
  13. "showDuration": "300",
  14. "hideDuration": "1000",
  15. "timeOut": "5000",
  16. "extendedTimeOut": "1000",
  17. "showEasing": "swing",
  18. "hideEasing": "linear",
  19. "showMethod": "fadeIn",
  20. "hideMethod": "fadeOut"
  21. }
  22. },
  23. api: {
  24. //发送Ajax请求
  25. ajax: function (options, success, failure) {
  26. options = typeof options == 'string' ? {url: options} : options;
  27. var index = Layer.load();
  28. options = $.extend({
  29. type: "POST",
  30. dataType: 'json',
  31. success: function (ret) {
  32. Layer.close(index);
  33. if (ret.hasOwnProperty("code")) {
  34. var data = ret.hasOwnProperty("data") && ret.data != "" ? ret.data : null;
  35. var msg = ret.hasOwnProperty("msg") && ret.msg != "" ? ret.msg : "";
  36. if (ret.code === 1) {
  37. if (typeof success == 'function') {
  38. var onAfterResult = success.call(undefined, data);
  39. if (!onAfterResult) {
  40. return false;
  41. }
  42. }
  43. Toastr.success(msg ? msg : __('Operation completed'));
  44. } else {
  45. Toastr.error(msg ? msg : __('Operation failed'));
  46. }
  47. } else {
  48. Toastr.error(__('Unknown data format'));
  49. }
  50. }, error: function () {
  51. Layer.close(index);
  52. if (typeof failure == 'function') {
  53. var onAfterResult = failure.call(undefined, data);
  54. if (!onAfterResult) {
  55. return false;
  56. }
  57. }
  58. Toastr.error(__('Network error'));
  59. }
  60. }, options);
  61. $.ajax(options);
  62. },
  63. //修复URL
  64. fixurl: function (url) {
  65. if (url.substr(0, 1) !== "/") {
  66. var r = new RegExp('^(?:[a-z]+:)?//', 'i');
  67. if (!r.test(url)) {
  68. url = Config.moduleurl + "/" + url;
  69. }
  70. }
  71. return url;
  72. },
  73. //获取修复后可访问的cdn链接
  74. cdnurl: function (url) {
  75. return /^(?:[a-z]+:)?\/\//i.test(url) ? url : Config.upload.cdnurl + url;
  76. },
  77. //查询Url参数
  78. query: function (name, url) {
  79. if (!url) {
  80. url = window.location.href;
  81. }
  82. name = name.replace(/[\[\]]/g, "\\$&");
  83. var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"),
  84. results = regex.exec(url);
  85. if (!results)
  86. return null;
  87. if (!results[2])
  88. return '';
  89. return decodeURIComponent(results[2].replace(/\+/g, " "));
  90. },
  91. //上传文件
  92. upload: function (file, callback) {
  93. var data = new FormData();
  94. data.append("file", file);
  95. $.ajax({
  96. url: "ajax/upload",
  97. data: data,
  98. cache: false,
  99. contentType: false,
  100. processData: false,
  101. type: 'POST',
  102. dataType: 'json',
  103. success: function (ret) {
  104. if (ret.hasOwnProperty("code")) {
  105. var data = ret.hasOwnProperty("data") && ret.data != "" ? ret.data : null;
  106. var msg = ret.hasOwnProperty("msg") && ret.msg != "" ? ret.msg : "";
  107. if (ret.code === 1) {
  108. if (typeof callback == 'function') {
  109. var onAfterResult = success.call(undefined, data);
  110. if (!onAfterResult) {
  111. return false;
  112. }
  113. }
  114. if ($('.summernote').size() > 0 && data && typeof data.url !== 'undefined') {
  115. $('.summernote').summernote("insertImage", data.url, 'filename');
  116. }
  117. Toastr.success(__('Operation completed'));
  118. } else {
  119. Toastr.error(msg ? msg : __('Operation failed'));
  120. }
  121. } else {
  122. Toastr.error(__('Unknown data format'));
  123. }
  124. }, error: function () {
  125. Toastr.error(__('Network error'));
  126. }
  127. });
  128. },
  129. open: function (url, title, options) {
  130. title = title ? title : "";
  131. url = Fast.api.fixurl(url);
  132. url = url + (url.indexOf("?") > -1 ? "&" : "?") + "dialog=1";
  133. var area = [$(window).width() > 800 ? '800px' : '95%', $(window).height() > 600 ? '600px' : '95%'];
  134. Layer.open($.extend({
  135. type: 2,
  136. title: title,
  137. shadeClose: true,
  138. shade: false,
  139. maxmin: true,
  140. moveOut: true,
  141. area: area,
  142. content: url,
  143. zIndex: Layer.zIndex,
  144. skin: 'layui-layer-noborder',
  145. success: function (layero, index) {
  146. var that = this;
  147. //$(layero).removeClass("layui-layer-border");
  148. Layer.setTop(layero);
  149. var frame = Layer.getChildFrame('html', index);
  150. var layerfooter = frame.find(".layer-footer");
  151. Fast.api.layerfooter(layero, index, that);
  152. //绑定事件
  153. if (layerfooter.size() > 0) {
  154. // 监听窗口内的元素及属性变化
  155. // Firefox和Chrome早期版本中带有前缀
  156. var MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver
  157. // 选择目标节点
  158. var target = layerfooter[0];
  159. // 创建观察者对象
  160. var observer = new MutationObserver(function (mutations) {
  161. Fast.api.layerfooter(layero, index, that);
  162. mutations.forEach(function (mutation) {
  163. });
  164. });
  165. // 配置观察选项:
  166. var config = {attributes: true, childList: true, characterData: true, subtree: true}
  167. // 传入目标节点和观察选项
  168. observer.observe(target, config);
  169. // 随后,你还可以停止观察
  170. // observer.disconnect();
  171. }
  172. }
  173. }, options ? options : {}));
  174. return false;
  175. },
  176. layerfooter: function (layero, index, that) {
  177. var frame = Layer.getChildFrame('html', index);
  178. var layerfooter = frame.find(".layer-footer");
  179. if (layerfooter.size() > 0) {
  180. $(".layui-layer-footer", layero).remove();
  181. var footer = $("<div />").addClass('layui-layer-btn layui-layer-footer');
  182. footer.html(layerfooter.html());
  183. if ($(".row", footer).size() === 0) {
  184. $(">", footer).wrapAll("<div class='row'></div>");
  185. }
  186. footer.insertAfter(layero.find('.layui-layer-content'));
  187. }
  188. var heg = frame.outerHeight();
  189. var titHeight = layero.find('.layui-layer-title').outerHeight() || 0;
  190. var btnHeight = layero.find('.layui-layer-btn').outerHeight() || 0;
  191. var oldheg = heg + titHeight + btnHeight;
  192. var maxheg = $(window).height() < 600 ? $(window).height() : 600;
  193. if (frame.outerWidth() < 768 || that.area[0].indexOf("%") > -1) {
  194. maxheg = $(window).height();
  195. }
  196. // 如果有.layer-footer或窗口小于600则重新排
  197. if (layerfooter.size() > 0 || oldheg < maxheg || that.area[0].indexOf("%") > -1) {
  198. var footerHeight = layero.find('.layui-layer-footer').outerHeight() || 0;
  199. footerHeight = 0;
  200. if (oldheg >= maxheg) {
  201. heg = Math.min(maxheg, oldheg) - titHeight - btnHeight - footerHeight;
  202. }
  203. layero.css({height: heg + titHeight + btnHeight + footerHeight});
  204. layero.find("iframe").css({height: heg});
  205. }
  206. if (layerfooter.size() > 0) {
  207. footer.on("click", ".btn", function () {
  208. if ($(this).hasClass("disabled") || $(this).parent().hasClass("disabled")) {
  209. return;
  210. }
  211. $(".btn:eq(" + $(this).index() + ")", layerfooter).trigger("click");
  212. });
  213. }
  214. },
  215. success: function (options, callback) {
  216. var type = typeof options === 'function';
  217. if (type) {
  218. callback = options;
  219. }
  220. return Layer.msg(__('Operation completed'), $.extend({
  221. offset: 0, icon: 1
  222. }, type ? {} : options), callback);
  223. },
  224. error: function (options, callback) {
  225. var type = typeof options === 'function';
  226. if (type) {
  227. callback = options;
  228. }
  229. return Layer.msg(__('Operation failed'), $.extend({
  230. offset: 0, icon: 2
  231. }, type ? {} : options), callback);
  232. },
  233. toastr: Toastr,
  234. layer: Layer
  235. },
  236. lang: function () {
  237. var args = arguments,
  238. string = args[0],
  239. i = 1;
  240. string = string.toLowerCase();
  241. //string = typeof Lang[string] != 'undefined' ? Lang[string] : string;
  242. if (typeof Lang[string] != 'undefined') {
  243. if (typeof Lang[string] == 'object')
  244. return Lang[string];
  245. string = Lang[string];
  246. } else if (string.indexOf('.') !== -1 && false) {
  247. var arr = string.split('.');
  248. var current = Lang[arr[0]];
  249. for (var i = 1; i < arr.length; i++) {
  250. current = typeof current[arr[i]] != 'undefined' ? current[arr[i]] : '';
  251. if (typeof current != 'object')
  252. break;
  253. }
  254. if (typeof current == 'object')
  255. return current;
  256. string = current;
  257. } else {
  258. string = args[0];
  259. }
  260. return string.replace(/%((%)|s|d)/g, function (m) {
  261. // m is the matched format, e.g. %s, %d
  262. var val = null;
  263. if (m[2]) {
  264. val = m[2];
  265. } else {
  266. val = args[i];
  267. // A switch statement so that the formatter can be extended. Default is %s
  268. switch (m) {
  269. case '%d':
  270. val = parseFloat(val);
  271. if (isNaN(val)) {
  272. val = 0;
  273. }
  274. break;
  275. }
  276. i++;
  277. }
  278. return val;
  279. });
  280. },
  281. init: function () {
  282. // 对相对地址进行处理
  283. $.ajaxSetup({
  284. beforeSend: function (xhr, setting) {
  285. setting.url = Fast.api.fixurl(setting.url);
  286. }
  287. });
  288. // 绑定ESC关闭窗口事件
  289. $(window).keyup(function (e) {
  290. if (e.keyCode == 27) {
  291. if ($(".layui-layer").size() > 0) {
  292. var index = 0;
  293. $(".layui-layer").each(function () {
  294. index = Math.max(index, parseInt($(this).attr("times")));
  295. });
  296. if (index) {
  297. Layer.close(index);
  298. }
  299. }
  300. }
  301. });
  302. //公共代码
  303. //配置Toastr的参数
  304. Toastr.options = Fast.config.toastr;
  305. }
  306. };
  307. //将Layer暴露到全局中去
  308. window.Layer = Layer;
  309. //将Toastr暴露到全局中去
  310. window.Toastr = Toastr;
  311. //将语言方法暴露到全局中去
  312. window.__ = Fast.lang;
  313. //将Fast渲染至全局
  314. window.Fast = Fast;
  315. //默认初始化执行的代码
  316. Fast.init();
  317. return Fast;
  318. });