formX.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. /**
  2. * 表单扩展模块
  3. * date:2020-03-11 License By http://easyweb.vip
  4. */
  5. layui.define(['form'], function (exports) {
  6. var $ = layui.jquery;
  7. var form = layui.form;
  8. var verifyText = {
  9. phoneX: '请输入正确的手机号',
  10. emailX: '邮箱格式不正确',
  11. urlX: '链接格式不正确',
  12. numberX: '只能填写数字',
  13. dateX: '日期格式不正确',
  14. identityX: '请输入正确的身份证号',
  15. psw: '密码必须5到12位,且不能出现空格',
  16. equalTo: '两次输入不一致',
  17. digits: '只能输入整数',
  18. digitsP: '只能输入正整数',
  19. digitsN: '只能输入负整数',
  20. digitsPZ: '只能输入正整数和0',
  21. digitsNZ: '只能输入负整数和0',
  22. minlength: '最少输入{minlength}个字符',
  23. maxlength: '最多输入{maxlength}个字符',
  24. min: '值不能小于{min}',
  25. max: '值不能大于{max}'
  26. };
  27. /** 扩展验证规则 */
  28. var verifyList = {
  29. /* 手机号 */
  30. phoneX: function (value, item) {
  31. var reg = /^1\d{10}$/;
  32. if (value && !reg.test(value)) {
  33. return verifyText.phoneX;
  34. }
  35. },
  36. /* 邮箱 */
  37. emailX: function (value, item) {
  38. var reg = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
  39. if (value && !reg.test(value)) {
  40. return verifyText.emailX;
  41. }
  42. },
  43. /* 网址 */
  44. urlX: function (value, item) {
  45. var reg = /(^#)|(^http(s*):\/\/[^\s]+\.[^\s]+)/;
  46. if (value && !reg.test(value)) {
  47. return verifyText.urlX;
  48. }
  49. },
  50. /* 数字 */
  51. numberX: function (value, item) {
  52. if (value && isNaN(value)) {
  53. return verifyText.numberX;
  54. }
  55. },
  56. /* 日期 */
  57. dateX: function (value, item) {
  58. var reg = /^(\d{4})[-\/](\d{1}|0\d{1}|1[0-2])([-\/](\d{1}|0\d{1}|[1-2][0-9]|3[0-1]))*$/;
  59. if (value && !reg.test(value)) {
  60. return verifyText.dateX;
  61. }
  62. },
  63. /* 身份证 */
  64. identityX: function (value, item) {
  65. var reg = /(^\d{15}$)|(^\d{17}(x|X|\d)$)/;
  66. if (value && !reg.test(value)) {
  67. return verifyText.identityX;
  68. }
  69. },
  70. /* 密码 */
  71. psw: function (value, item) {
  72. if (value && !/^[\S]{5,12}$/.test(value)) {
  73. return verifyText.psw
  74. }
  75. },
  76. /* 重复 */
  77. equalTo: function (value, item) {
  78. if (value != $($(item).attr('lay-equalTo')).val()) {
  79. var text = $(item).attr('lay-equalToText');
  80. return text ? text : verifyText.equalTo;
  81. }
  82. },
  83. /* 整数 */
  84. digits: function (value, item) {
  85. var reg = /^-?\d+$/;
  86. if (value && !reg.test(value)) {
  87. return verifyText.digits;
  88. }
  89. },
  90. /* 正整数 */
  91. digitsP: function (value, item) {
  92. var reg = /^[1-9]\d*$/;
  93. if (value && !reg.test(value)) {
  94. return verifyText.digitsP;
  95. }
  96. },
  97. /* 负整数 */
  98. digitsN: function (value, item) {
  99. var reg = /^-[1-9]\d*$/;
  100. if (value && !reg.test(value)) {
  101. return verifyText.digitsN;
  102. }
  103. },
  104. /* 非负整数 */
  105. digitsPZ: function (value, item) {
  106. var reg = /^\d+$/;
  107. if (value && !reg.test(value)) {
  108. return verifyText.digitsPZ;
  109. }
  110. },
  111. /* 非正整数 */
  112. digitsNZ: function (value, item) {
  113. var reg = /^-[1-9]\d*|0/;
  114. if (value && !reg.test(value)) {
  115. return verifyText.digitsNZ;
  116. }
  117. },
  118. /* h5 */
  119. h5: function (value, item) {
  120. if (value) {
  121. var minlength = $(item).attr('minlength');
  122. var maxlength = $(item).attr('maxlength');
  123. var min = $(item).attr('min');
  124. var max = $(item).attr('max');
  125. if (minlength && value.length < minlength) {
  126. return verifyText.minlength.replace(/{minlength}/g, minlength);
  127. }
  128. if (maxlength && value.length > maxlength) {
  129. return verifyText.maxlength.replace(/{maxlength}/g, maxlength);
  130. }
  131. if (min && value * 1 < min * 1) {
  132. return verifyText.min.replace(/{min}/g, min);
  133. }
  134. if (max && value * 1 > max * 1) {
  135. return verifyText.max.replace(/{max}/g, max);
  136. }
  137. }
  138. }
  139. };
  140. var formX = {
  141. init: function () {
  142. form.verify(verifyList);
  143. },
  144. /* 赋值表单,解决top.layui.form.val无效的问题 */
  145. formVal: function (filter, object) {
  146. formX.val(filter, object);
  147. },
  148. /* 赋值表单,解决top.layui.form.val无效的问题 */
  149. val: function (filter, object) {
  150. $('.layui-form[lay-filter="' + filter + '"]').each(function () {
  151. var $item = $(this);
  152. for (var f in object) {
  153. if (!object.hasOwnProperty(f)) continue;
  154. var $elem = $item.find('[name="' + f + '"]');
  155. if ($elem.length > 0) {
  156. var type = $elem[0].type;
  157. if (type === 'checkbox') { // 如果为复选框
  158. $elem[0].checked = object[f];
  159. } else if (type === 'radio') { // 如果为单选框
  160. $elem.each(function () {
  161. if (this.value == object[f]) {
  162. this.checked = true;
  163. }
  164. });
  165. } else { // 其它类型的表单
  166. $elem.val(object[f]);
  167. }
  168. }
  169. }
  170. });
  171. form.render(null, filter);
  172. },
  173. /* 渲染select */
  174. renderSelect: function (param) {
  175. var defaultOption = {
  176. elem: undefined,
  177. data: [],
  178. name: undefined,
  179. value: undefined,
  180. hint: '请选择',
  181. initValue: undefined,
  182. method: 'get',
  183. where: undefined,
  184. header: undefined,
  185. async: true,
  186. done: undefined,
  187. error: undefined
  188. };
  189. param = $.extend(defaultOption, param);
  190. if (typeof param.data === 'string') {
  191. $.ajax({
  192. url: param.data,
  193. type: param.method,
  194. data: param.where,
  195. dataType: 'json',
  196. header: param.header,
  197. async: param.async,
  198. success: function (result, status, xhr) {
  199. if (result.data) {
  200. param.data = result.data;
  201. formX.renderSelect(param);
  202. } else {
  203. param.error && param.error(xhr, result);
  204. }
  205. },
  206. error: param.error
  207. });
  208. } else {
  209. var html = param.hint ? ('<option value="">' + param.hint + '</option>') : '';
  210. for (var i = 0; i < param.data.length; i++) {
  211. if (param.name && param.value) {
  212. html += ('<option value="' + param.data[i][param.value] + '"' + (param.data[i][param.value] === param.initValue ? ' selected' : '') + '>' + param.data[i][param.name] + '</option>');
  213. } else {
  214. html += ('<option value="' + param.data[i] + '"' + (param.data[i] === param.initValue ? ' selected' : '') + '>' + param.data[i] + '</option>');
  215. }
  216. }
  217. $(param.elem).html(html);
  218. var $form = $(param.elem).parent('.layui-form');
  219. if ($form.length === 0) {
  220. $form = $(param.elem).parentsUntil('.layui-form').last().parent();
  221. }
  222. form.render('select', $form.attr('lay-filter'));
  223. param.done && param.done(param.data);
  224. }
  225. },
  226. /* 验证码倒计时 */
  227. startTimer: function (elem, time, format) {
  228. if (!time) time = 60;
  229. if (!format) {
  230. format = function (t) {
  231. return t + 's';
  232. }
  233. }
  234. if (formX.timers[elem]) clearInterval(formX.timers[elem]);
  235. var orgHtml = $(elem).html();
  236. $(elem).html(format(time));
  237. $(elem).attr('disabled', 'disabled');
  238. $(elem).addClass('layui-btn-disabled');
  239. var timer = setInterval(function () {
  240. time--;
  241. if (time <= 0) {
  242. clearInterval(timer);
  243. $(elem).html(orgHtml);
  244. $(elem).removeAttr('disabled');
  245. $(elem).removeClass('layui-btn-disabled');
  246. } else {
  247. $(elem).html(format(time));
  248. }
  249. }, 1000);
  250. formX.timers[elem] = timer;
  251. },
  252. timers: {},
  253. /* 获取表单修改过的数据 */
  254. formUpdatedField: function (field, oldField) {
  255. if (typeof field == 'string') field = form.val(field);
  256. for (var key in field) {
  257. if (!field.hasOwnProperty(key)) continue;
  258. if (field[key] === oldField[key]) delete field[key];
  259. }
  260. if (Object.keys(field).length > 0) return field;
  261. }
  262. };
  263. formX.init();
  264. exports('formX', formX);
  265. });