dialog-form.js 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. (function (w) {
  2. /**
  3. * 表单弹窗
  4. * @param opt
  5. * @constructor
  6. */
  7. LA.DialogForm = 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. (!$btn) || $btn.button('reset');
  68. popup(tpl, num);
  69. });
  70. }
  71. // 弹出弹窗
  72. function popup(tpl, num) {
  73. var t = $(tpl), $form, btns = [lang.submit], opts = {
  74. type: 1,
  75. area: area,
  76. content: tpl,
  77. title: title,
  78. yes: submit,
  79. cancel: function () {
  80. if (forceRefresh) { // 是否强制刷新
  81. $layWin[num] = idx[num] = null;
  82. } else {
  83. $layWin[num].hide();
  84. return false;
  85. }
  86. }
  87. };
  88. if (!disableReset) {
  89. btns.push(lang.reset);
  90. opts.btn2 = function () { // 重置按钮
  91. $form = $form || $('#'+t.find('form').attr('id'));
  92. $form.trigger('reset');
  93. return false;
  94. };
  95. }
  96. opts.btn = btns;
  97. idx[num] = lay.open(opts);
  98. $layWin[num] = w.$('#layui-layer' + idx[num]);
  99. // 提交表单
  100. function submit (index, layero) {
  101. if (submitting) return;
  102. submitting = 1;
  103. $form = $form || w.$('#'+t.find('form').attr('id')); // 此处必须重新创建jq对象,否则无法操作页面元素
  104. $layWin[num].find('.layui-layer-btn0').button('loading');
  105. LA.Form({
  106. $form: $form,
  107. disableRedirect: true,
  108. after: function (success, res) {
  109. $layWin[num].find('.layui-layer-btn0').button('reset');
  110. submitting = 0;
  111. handlers.saved(success, res);
  112. if (!success) {
  113. return handlers.error(success, res);;
  114. }
  115. if (res.status) {
  116. handlers.success(success, res);
  117. rm(num);
  118. return;
  119. }
  120. handlers.error(success, res);
  121. LA.error(res.message || lang.save_failed);
  122. }
  123. });
  124. }
  125. }
  126. // 移除弹窗
  127. function rm(num) {
  128. lay.close(idx[num]);
  129. $layWin[num] && $layWin[num].remove();
  130. $layWin[num] = null;
  131. }
  132. };
  133. })(top || window);