modal-form.js 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. (function (w) {
  2. /**
  3. * 表单弹窗
  4. * @param opt
  5. * @constructor
  6. */
  7. LA.ModalForm = function (opt) {
  8. var number = 1,
  9. defUrl = opt.defaultUrl,
  10. btn = opt.buttonSelector,
  11. area = opt.area,
  12. title = opt.title,
  13. lang = {
  14. submit: opt.lang.submit,
  15. reset: opt.lang.reset,
  16. save_failed: opt.lang.save_failed,
  17. },
  18. nullFun = function (a, b) {},
  19. handlers = {
  20. saved: opt.saved || nullFun,
  21. success: opt.success || nullFun,
  22. error: opt.error || nullFun
  23. },
  24. lay = w.layer,
  25. forceRefresh = opt.forceRefresh,
  26. disableReset = opt.disableReset,
  27. idx = {},
  28. $layWin = {},
  29. queryString = opt.query,
  30. building,
  31. submitting,
  32. $btn;
  33. (!btn) || $(btn).off('click').click(function () {
  34. var t = $(this), num = t.attr('number'), url;
  35. $btn = t;
  36. if (!num) {
  37. num = number;
  38. t.attr('number', number);
  39. number++;
  40. }
  41. url = t.data('url') || defUrl; // 给弹窗页面链接追加参数
  42. if (url.indexOf('?') == -1) {
  43. url += '?'+queryString+'=1'
  44. } else if (url.indexOf(queryString) == -1) {
  45. url += '&'+queryString+'=1'
  46. }
  47. build(url, num);
  48. });
  49. btn || setTimeout(function () {
  50. build(defUrl, number)
  51. }, 400);
  52. // 开始构建弹窗
  53. function build(url, num) {
  54. if (!url || building) return;
  55. if ($layWin[num]) { // 阻止同个类型的弹窗弹出多个
  56. $layWin[num].show();
  57. try { lay.restore(idx[num]); } catch (e) {}
  58. return;
  59. }
  60. $(w.document).one('pjax:complete', function () { // 跳转新页面时移除弹窗
  61. rm(num);
  62. });
  63. building = 1;
  64. (!$btn) || $btn.button('loading');
  65. $.get(url, function (tpl) {
  66. building = 0;
  67. if ($btn) {
  68. $btn.button('reset');
  69. setTimeout(function () {
  70. $btn.find('.waves-ripple').remove();
  71. }, 50);
  72. }
  73. popup(tpl, num);
  74. });
  75. }
  76. // 弹出弹窗
  77. function popup(tpl, num) {
  78. tpl = LA.AssetsLoader.filterScriptAndAutoLoad(tpl).render();
  79. var t = $(tpl), $form, btns = [lang.submit], opts = {
  80. type: 1,
  81. area: formatArea(area),
  82. content: tpl,
  83. title: title,
  84. yes: submit,
  85. cancel: function () {
  86. if (forceRefresh) { // 是否强制刷新
  87. $layWin[num] = idx[num] = null;
  88. } else {
  89. $layWin[num].hide();
  90. return false;
  91. }
  92. }
  93. };
  94. if (!disableReset) {
  95. btns.push(lang.reset);
  96. opts.btn2 = function () { // 重置按钮
  97. $form = $form || $('#'+t.find('form').attr('id'));
  98. $form.trigger('reset');
  99. return false;
  100. };
  101. }
  102. opts.btn = btns;
  103. idx[num] = lay.open(opts);
  104. $layWin[num] = w.$('#layui-layer' + idx[num]);
  105. // 提交表单
  106. function submit () {
  107. if (submitting) return;
  108. $form = $form || w.$('#'+t.find('form').attr('id')); // 此处必须重新创建jq对象,否则无法操作页面元素
  109. LA.Form({
  110. $form: $form,
  111. disableRedirect: true,
  112. before: function () {
  113. $form.validator('validate');
  114. if ($form.find('.has-error').length > 0) {
  115. return false;
  116. }
  117. submitting = 1;
  118. $layWin[num].find('.layui-layer-btn0').button('loading');
  119. },
  120. after: function (success, res) {
  121. $layWin[num].find('.layui-layer-btn0').button('reset');
  122. submitting = 0;
  123. handlers.saved(success, res);
  124. if (!success) {
  125. return handlers.error(success, res);
  126. }
  127. if (res.status) {
  128. handlers.success(success, res);
  129. rm(num);
  130. return;
  131. }
  132. handlers.error(success, res);
  133. LA.error(res.message || lang.save_failed);
  134. }
  135. });
  136. }
  137. }
  138. function formatArea(area) {
  139. if (w.screen.width <= 800) {
  140. return ['100%', '100%'];
  141. }
  142. return area;
  143. }
  144. // 移除弹窗
  145. function rm(num) {
  146. lay.close(idx[num]);
  147. $layWin[num] && $layWin[num].remove();
  148. $layWin[num] = null;
  149. }
  150. };
  151. })(top || window);