form.js 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. mbui.define(['layer'], function (exports) {
  2. let layer = mbui.layer;
  3. var form = function (options) {
  4. // 默认配置选项
  5. var settings = $.extend({
  6. target: '#formBox',
  7. verify: {
  8. required: function (value) {
  9. if (!/[\S]+/.test(value)) {
  10. return '必填项不能为空';
  11. }
  12. },
  13. phone: function (value) {
  14. var EXP = /^1\d{10}$/;
  15. if (value && !EXP.test(value)) {
  16. return '手机号格式不正确';
  17. }
  18. },
  19. email: function (value) {
  20. var EXP = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
  21. if (value && !EXP.test(value)) {
  22. return '邮箱格式不正确';
  23. }
  24. },
  25. url: function (value) {
  26. var EXP = /^(#|(http(s?)):\/\/|\/\/)[^\s]+\.[^\s]+$/;
  27. if (value && !EXP.test(value)) {
  28. return '链接格式不正确';
  29. }
  30. },
  31. number: function (value) {
  32. if (value && isNaN(value)) {
  33. return '只能填写数字';
  34. }
  35. },
  36. date: function (value) {
  37. var EXP = /^(\d{4})[-\/](\d{1}|0\d{1}|1[0-2])([-\/](\d{1}|0\d{1}|[1-2][0-9]|3[0-1]))*$/;
  38. if (value && !EXP.test(value)) {
  39. return '日期格式不正确';
  40. }
  41. },
  42. identity: function (value) {
  43. //var EXP = /(^\d{15}$)|(^\d{17}(x|X|\d)$)/;
  44. var EXP = /^[1-9]\d{5}(18|19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}(\d|X|x)$/;
  45. if (value && !EXP.test(value)) {
  46. return '身份证号格式不正确';
  47. }
  48. }
  49. },
  50. errorClass: 'mbui-form-danger',
  51. successClass: 'mbui-form-success',
  52. errorMessageContainer: null, // 可以指定错误信息容器,例如:'div#error-message'
  53. submit: function (data) {
  54. console.log(data);
  55. }
  56. }, options);
  57. var formBox = $(settings.target);
  58. formBox.on('submit', function (event) {
  59. event.preventDefault();
  60. var isValid = true; //校验判断标识
  61. var field = {}; // 字段集合
  62. formBox.find('input,select,textarea').each(function () {
  63. if (isValid == false) {
  64. return false;
  65. }
  66. var $this = $(this),
  67. val = $this.val(),
  68. rule = $this.data('verify') || '',
  69. rules = rule.split('|'),
  70. errMsg = '';
  71. $this.removeClass(settings.errorClass); // 移除警示样式
  72. for (var i = 0; i < rules.length; i++) {
  73. var ruleName = rules[i],
  74. ruleFunc = settings.verify[ruleName];
  75. if (ruleFunc) {
  76. errMsg = ruleFunc(val);
  77. if (errMsg) {
  78. // 获取自定义必填项提示文本
  79. if (ruleName === 'required') {
  80. errMsg = $this.data('errortips') || errMsg;
  81. }
  82. isValid = false;
  83. break;
  84. }
  85. }
  86. }
  87. if (!isValid) {
  88. layer.error(errMsg);
  89. $this.removeClass(settings.successClass).addClass(settings.errorClass).focus();
  90. if (settings.errorMessageContainer) {
  91. $(settings.errorMessageContainer).text(errors.join('<br/>'));
  92. }
  93. } else {
  94. $this.removeClass(settings.errorClass).addClass(settings.successClass);
  95. }
  96. });
  97. //校验radio是否选中
  98. formBox.find('[data-verify="radio"]').each(function () {
  99. if (isValid == false) {
  100. return false;
  101. }
  102. var $this = $(this),errMsg = '至少要有一个单选按钮被选中';
  103. if ($this.find('[type="radio"]').is(':checked')) {
  104. console.log(errMsg);
  105. } else {
  106. errMsg = $this.data('errortips') || errMsg;
  107. isValid = false;
  108. }
  109. if (!isValid) {
  110. layer.error(errMsg);
  111. }
  112. });
  113. formBox.find('[data-verify="checkbox"]').each(function () {
  114. if (isValid == false) {
  115. return false;
  116. }
  117. var $this = $(this),errMsg = '至少要有一个多选按钮被选中';
  118. if ($this.find('[type="checkbox"]').is(':checked')) {
  119. console.log(errMsg);
  120. } else {
  121. errMsg = $this.data('errortips') || errMsg;
  122. isValid = false;
  123. }
  124. if (!isValid) {
  125. layer.error(errMsg);
  126. }
  127. });
  128. if (isValid) {
  129. // 如果所有验证都通过,则提交表单
  130. settings.submit(form.getValue(settings.target));
  131. }
  132. });
  133. };
  134. // 取值
  135. form.getValue = function (itemForm) {
  136. var nameIndex = {} // 数组 name 索引
  137. , field = {}
  138. , fieldElem = $(itemForm).find('input,select,textarea') // 获取所有表单域
  139. $.each(fieldElem, function (_, item) {
  140. var othis = $(this), init_name; // 初始 name
  141. item.name = (item.name || '').replace(/^\s*|\s*&/, '');
  142. if (!item.name) return;
  143. // 用于支持数组 name
  144. if (/^.*\[\]$/.test(item.name)) {
  145. var key = item.name.match(/^(.*)\[\]$/g)[0];
  146. nameIndex[key] = nameIndex[key] | 0;
  147. init_name = item.name.replace(/^(.*)\[\]$/, '$1[' + (nameIndex[key]++) + ']');
  148. }
  149. // 复选框和单选框未选中,不记录字段
  150. if (/^(checkbox|radio)$/.test(item.type) && !item.checked) return;
  151. field[init_name || item.name] = item.value;
  152. });
  153. return field;
  154. };
  155. // 输出接口
  156. exports('form', form);
  157. });