jquery.validate.extension.js 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488
  1. (function ($) {
  2. $.extend($.validator.messages, {
  3. required: "필수 항목입니다.",
  4. remote: "항목을 수정하세요.",
  5. email: "유효하지 않은 E-Mail주소입니다.",
  6. url: "유효하지 않은 URL입니다.",
  7. date: "올바른 날짜를 입력하세요.",
  8. dateISO: "올바른 날짜(ISO)를 입력하세요.",
  9. number: "유효한 숫자가 아닙니다.",
  10. digits: "숫자만 입력 가능합니다.",
  11. creditcard: "신용카드 번호가 바르지 않습니다.",
  12. equalTo: "같은 값을 다시 입력하세요.",
  13. extension: "올바른 확장자가 아닙니다.",
  14. maxlength: $.validator.format("{0}자를 넘을 수 없습니다. "),
  15. minlength: $.validator.format("{0}자 이상 입력하세요."),
  16. rangelength: $.validator.format("문자 길이가 {0} 에서 {1} 사이의 값을 입력하세요."),
  17. range: $.validator.format("{0} 에서 {1} 사이의 값을 입력하세요."),
  18. max: $.validator.format("{0} 이하의 값을 입력하세요."),
  19. min: $.validator.format("{0} 이상의 값을 입력하세요.")
  20. });
  21. $.validator.methods.number = function (value, element) {
  22. return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:[\s\.,]\d{3})+)(?:[\.,]\d+)?$/.test(value);
  23. }
  24. $.validator.methods.min = function (value, element, param) {
  25. let globalizedValue = value.replace(",", ".");
  26. return this.optional(element) || globalizedValue >= param;
  27. }
  28. $.validator.methods.max = function (value, element, param) {
  29. let globalizedValue = value.replace(",", ".");
  30. return this.optional(element) || globalizedValue <= param;
  31. }
  32. $.validator.methods.range = function (value, element, param) {
  33. let globalizedValue = value.replace(",", ".");
  34. return this.optional(element) || (globalizedValue >= param[0] && globalizedValue <= param[1]);
  35. }
  36. $.validator.addMethod('hangul', function (value, element) { // (자음, 모음만 있는 한글은 처리하지 않습니다.)
  37. return this.optional(element) || validHangul(value);
  38. }, '한글로 입력해주세요.');
  39. $.validator.addMethod('alpha_num_under', function (value, element) {
  40. return this.optional(element) || /(^[a-zA-Z0-9\_]+$)/.test(value);
  41. }, '영문, 숫자, _ 가 아닙니다.');
  42. $.validator.addMethod('alpha_dash', function (value, element) {
  43. return this.optional(element) || /(^[a-zA-Z0-9\_\-]+$)/.test(value);
  44. }, '영문, 숫자, _ , - 가 아닙니다.');
  45. $.validator.addMethod('valid_tinymce', function (value, element) {
  46. return validTinyEditor($(element).attr('name'), $(element).attr('id'), value, 'valid');
  47. }, '내용을 입력해주세요');
  48. $.validator.addMethod('required_tinymce', function (value, element) {
  49. return validTinyEditor($(element).attr('name'), $(element).attr('id'), value, 'required');
  50. }, '내용을 입력해주세요');
  51. $.validator.addMethod("greaterThan", function (value, element, params) {
  52. let target = $(params).val();
  53. let isValueNumeric = !isNaN(parseFloat(value)) && isFinite(value);
  54. let isTargetNumeric = !isNaN(parseFloat(target)) && isFinite(target);
  55. if (isValueNumeric && isTargetNumeric) {
  56. return Number(value) > Number(target);
  57. }
  58. if (!/Invalid|NaN/.test(new Date(value))) {
  59. return new Date(value) > new Date(target);
  60. }
  61. }, '날짜를 확인해주세요.');
  62. $.validator.addMethod('is_phone', function (value) {
  63. return isValidPhone(value); // 성공예시 : 010-XXXX-XXXX 또는 010XXXXXXXX
  64. }, '연락처 형식이 잘못되었습니다.');
  65. $.validator.addMethod('is_ip', function (value) {
  66. return isValidIP(value); // 성공예시 : 192.168.56.101
  67. }, 'IP 형식이 잘못되었습니다.');
  68. $.validator.addMethod('is_comma_digits', function (value) { // 콤마(`,`)가 추가된 숫자형태 인가?
  69. return $.isNumeric(value.replace(',', ''));
  70. }, '숫자를 입력해주세요.');
  71. $.validator.addMethod("greaterThan", function (value, element, params) {
  72. if (!/Invalid|NaN/.test(new Date(value))) {
  73. return new Date(value) >= new Date($(params).val());
  74. }
  75. if(this.optional(element)) {
  76. return true;
  77. }
  78. return isNaN(value) && isNaN($(params).val()) || (Number(value) > Number($(params).val()));
  79. }, '기간 입력 날짜가 잘못되었습니다.');
  80. $.validator.addMethod("contains", function (value, element, param) { // [] 배열안에 문자가 포함되어 있는가?
  81. let contains = false;
  82. for (let i = 0; i < param.length; i++) {
  83. if (value.includes(param[i])) {
  84. contains = true;
  85. }
  86. }
  87. return this.optional(element) || contains;
  88. }, "");
  89. $.validator.addMethod('file_size', function (value, element, param) {
  90. return this.optional(element) || (element.files[0].size <= param * 1000000);
  91. }, '파일은 최대 `{0}MB`까지 첨부 가능합니다.');
  92. $.validator.addMethod('numeric', function (value, element, param) { // 숫자가 몇개 이상인지 확인
  93. let i = 0;
  94. let character = '';
  95. let count = 0;
  96. while (i <= value.length) {
  97. character = value.charAt(i); // 해당 index에 문자 반환
  98. if (!isNaN(character * 1)) {
  99. count++;
  100. }
  101. i++;
  102. }
  103. }, '소문자가 {0}개 이상 포함되어야 합니다.');
  104. $.validator.addMethod('uppercase', function (value, element, param) { // 대문자가 몇개 이상인지 확인
  105. let i = 0;
  106. let character = '';
  107. let count = 0;
  108. while (i <= value.length) {
  109. character = value.charAt(i); // 해당 index에 문자 반환
  110. if (character === character.toUpperCase()) {
  111. count++;
  112. }
  113. i++;
  114. }
  115. }, '대문자가 {0}개 이상 포함되어야 합니다.');
  116. $.validator.addMethod('lowercase', function (value, element, param) { // 소문자가 몇개 이상인지 확인
  117. let i = 0;
  118. let character = '';
  119. let count = 0;
  120. while (i <= value.length) {
  121. character = value.charAt(i); // 해당 index에 문자 반환
  122. if (character === character.toLowerCase()) {
  123. count++;
  124. }
  125. i++;
  126. }
  127. }, '소문자가 {0}개 이상 포함되어야 합니다.');
  128. // 이메일 유효성 확인
  129. $.validator.addMethod('is_email_able', function (value, element) {
  130. let ret = '';
  131. $.ajax({
  132. headers: {'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')},
  133. url: BASE_URL + '/api/isEmailAble',
  134. type: 'POST',
  135. dataType: 'JSON',
  136. async: false,
  137. cache: false,
  138. data: {email: value},
  139. success: function (res) {
  140. ret = res;
  141. }
  142. });
  143. return ret;
  144. }, '이 이메일은 사용하실 수 없습니다.');
  145. // 비밀번호 유효성 확인
  146. $.validator.addMethod('is_password_able', function (value, element) {
  147. let ret = '';
  148. $.ajax({
  149. headers: {'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')},
  150. url: BASE_URL + '/api/isPasswordAble',
  151. type: 'POST',
  152. dataType: 'JSON',
  153. async: false,
  154. cache: false,
  155. data: {password: value},
  156. success: function (res) {
  157. ret = res;
  158. }
  159. });
  160. return ret;
  161. }, '이 비밀번호는 사용하실 수 없습니다.');
  162. // 연락처 유효성 확인
  163. $.validator.addMethod('is_phone_able', function (value, element) {
  164. let ret = '';
  165. $.ajax({
  166. headers: {'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')},
  167. url: BASE_URL + '/api/isPhoneAble',
  168. type: 'POST',
  169. dataType: 'JSON',
  170. async: false,
  171. cache: false,
  172. data: {phone: value},
  173. success: function (res) {
  174. ret = res;
  175. }
  176. });
  177. return ret;
  178. }, '이 연락처는 사용하실 수 없습니다.');
  179. // 닉네임 유효성 확인
  180. $.validator.addMethod('is_nickname_able', function (value, element) {
  181. let ret = '';
  182. $.ajax({
  183. headers: {'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')},
  184. url: BASE_URL + '/api/isNicknameAble',
  185. type: 'POST',
  186. dataType: 'JSON',
  187. async: false,
  188. cache: false,
  189. data: {nickname: value},
  190. success: function (res) {
  191. ret = res;
  192. }
  193. });
  194. return ret;
  195. }, '이 닉네임은 사용하실 수 없습니다.');
  196. }(jQuery));
  197. function validHangul(fld) {
  198. let pattern = /([^가-힣\x20])/i;
  199. return (!pattern.test(fld) ? true : false);
  200. }
  201. function validTinyEditor(name, id, value, stype) {
  202. if (tinymce.editors.length > 0) {
  203. // let editorData = tinymce.activeEditor.getContent({format: 'raw'}); // tinymce 안에 데이터 조회
  204. let editorData = tinymce.EditorManager.get(id).getContent({format: 'raw'}); // tinymce 안에 데이터 조회
  205. // 아무 값이 없으면 영역을 비어둔다.
  206. if ($.inArray(editorData.toLowerCase().replace(/^\s*|\s*$/g, ''), ['&nbsp;', '<p>&nbsp;</p>', '<p><br/></p>', '<div><br/></div>', '<p></p>', '<br/>', '<p><br data-mce-bogus="1"/></p>', '<br data-mce-bogus="1"/>'], '') != -1) {
  207. tinymce.get(id).setContent('');
  208. }
  209. if (stype === "required") {
  210. if (!editorData || $.inArray(editorData.toLowerCase(), ['&nbsp;', '<p>&nbsp;</p>', '<p><br/></p>', '<p></p>', '<br/>', '<p><br data-mce-bogus="1"></p>', '<br data-mce-bogus="1">']) != -1) {
  211. // tinymce.get(column).focus(); // tinymce 에디터 영역에 포커스 이동
  212. tinymce.EditorManager.get(id).focus(); // $("#"+column).tinymce().focus();
  213. return false;
  214. }
  215. }
  216. } else {
  217. if (stype === "required" && !value) {
  218. document.getElementById(id).focus();
  219. return false;
  220. }
  221. }
  222. return true;
  223. }
  224. // IP4 Address 검사
  225. function isValidIP(value) {
  226. let format = /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;
  227. return (!value.match(format) ? false : true);
  228. }
  229. // 휴대폰 인가 확인
  230. function isValidPhone(value) {
  231. let phoneExp = /^\d{3}-\d{3,4}-\d{4}$/;
  232. let telExp = /^\d{2,3}-\d{3,4}-\d{4}$/;
  233. if (!phoneExp.test(value)) {
  234. return false; // 휴대폰 번호가 아니라면
  235. } else if (!telExp.test(value)) {
  236. return false; // 일반 전화번호가 아니라면
  237. } else {
  238. return true;
  239. }
  240. }
  241. /*
  242. * 부동소수점 숫자인지 음수부호도 포함하여 검사
  243. */
  244. function isDouble(x) {
  245. let reg = /^[-|+]?\d+\.?\d*$/;
  246. return reg.test(x);
  247. }
  248. /*
  249. * 부동소수점 숫자인지 검사
  250. * cf) 음수부호는 포함하지 않음
  251. */
  252. function isDoublePlus(x) {
  253. let reg = /^\d+\.?\d*$/;
  254. return reg.test(x);
  255. }
  256. /*
  257. * 정수인지 음수부호도 포함하여 검사
  258. */
  259. function isInteger(x) {
  260. let reg = /^[-|+]?\d+$/;
  261. return reg.test(x);
  262. }
  263. /*
  264. * 한글이 포함하는지 검사
  265. */
  266. function isHangle(value) {
  267. let regExp = /[ㄱ-ㅎ|ㅏ-ㅣ|가-힣]/g;
  268. return (regExp.test(value) ? true : false);
  269. }
  270. /*
  271. * 숫자(0~9)와 문자(A(a)~Z(z))로만 이루어진 문자열인지 검사
  272. * cf) space가 true면 공백문자를 포함한다.
  273. */
  274. function isAlphaNumeric(x, space) {
  275. let reg;
  276. if (space) {
  277. reg = /^[a-z A-Z0-9]+$/;
  278. } else {
  279. reg = /^[a-zA-Z0-9]+$/;
  280. }
  281. return reg.test(x);
  282. }
  283. /*
  284. * 문자(A(a)~Z(z))로만 이루어진 문자열인지 검사
  285. * cf) space가 true면 공백문자를 포함한다.
  286. */
  287. function isAlphabetic(x, space) {
  288. let reg;
  289. if (space) {
  290. reg = /^[a-z A-Z]+$/;
  291. } else {
  292. reg = /^[a-zA-Z]+$/;
  293. }
  294. return reg.test(x);
  295. }
  296. /*
  297. * email 형식의 문자열인지 검사
  298. */
  299. function isEmail(str) {
  300. let regEmil = /[a-z0-9]{2,}@[a-z0-9-]{2,}\.[a-z0-9]{2,}/i
  301. return regEmil.test(str);
  302. }
  303. /*
  304. * 입력값이 NULL인지 체크
  305. */
  306. function isNull(input) {
  307. return ((input.value == null && input.value == "") ? true : false);
  308. }
  309. /*
  310. * 입력값에 스페이스 이외의 의미있는 값이 있는지 체크
  311. * ex) if (isEmpty(form.keyword)) {
  312. * alert("검색조건을 입력하세요.");
  313. * }
  314. */
  315. function isEmpty(input) {
  316. return ((input.value == null && input.value.replace(/ /gi, "") == "") ? true : false);
  317. }
  318. /*
  319. * 입력값에 특정 문자(chars)가 있는지 체크
  320. * 특정 문자를 허용하지 않으려 할 때 사용
  321. * ex) if (containsChars(form.name,"!,*&^%$#@~;")) {
  322. * alert("이름 필드에는 특수 문자를 사용할 수 없습니다.");
  323. * }
  324. */
  325. function containsChars(input, chars) {
  326. for (let inx = 0; inx < input.value.length; inx++) {
  327. if (chars.indexOf(input.value.charAt(inx)) != -1) {
  328. return true;
  329. }
  330. }
  331. return false;
  332. }
  333. /*
  334. * 입력값이 특정 문자(chars)만으로 되어있는지 체크
  335. * 특정 문자만 허용하려 할 때 사용
  336. * ex) if (!containsCharsOnly(form.blood,"ABO")) {
  337. * alert("혈액형 필드에는 A,B,O 문자만 사용할 수 있습니다.");
  338. * }
  339. */
  340. function containsCharsOnly(input, chars) {
  341. for (let inx = 0; inx < input.value.length; inx++) {
  342. if (chars.indexOf(input.value.charAt(inx)) == -1) {
  343. return false;
  344. }
  345. }
  346. return true;
  347. }
  348. /*
  349. * 입력값이 알파벳인지 체크
  350. * 아래 isAlphabet() 부터 isNumComma()까지의 메소드가
  351. * 자주 쓰이는 경우에는 let chars 변수를
  352. * global 변수로 선언하고 사용하도록 한다.
  353. * ex) let uppercase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  354. * let lowercase = "abcdefghijklmnopqrstuvwxyz";
  355. * let number = "0123456789";
  356. * function isAlphaNum(input) {
  357. * let chars = uppercase + lowercase + number;
  358. * return containsCharsOnly(input,chars);
  359. * }
  360. */
  361. function isAlphabet(input) {
  362. let chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
  363. return containsCharsOnly(input, chars);
  364. }
  365. /*
  366. * 입력값이 알파벳 대문자인지 체크
  367. */
  368. function isUpperCase(input) {
  369. let chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  370. return containsCharsOnly(input, chars);
  371. }
  372. /*
  373. * 입력값이 알파벳 소문자인지 체크
  374. */
  375. function isLowerCase(input) {
  376. let chars = "abcdefghijklmnopqrstuvwxyz";
  377. return containsCharsOnly(input, chars);
  378. }
  379. /*
  380. * 입력값에 숫자만 있는지 체크
  381. */
  382. function isNumber(input) {
  383. let chars = "0123456789";
  384. return containsCharsOnly(input, chars);
  385. }
  386. /*
  387. * 입력값이 알파벳,숫자로 되어있는지 체크
  388. */
  389. function isAlphaNum(input) {
  390. let chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
  391. return containsCharsOnly(input, chars);
  392. }
  393. /*
  394. * 입력값이 숫자,대시(-)로 되어있는지 체크
  395. */
  396. function isNumDash(input) {
  397. let chars = "-0123456789";
  398. return containsCharsOnly(input, chars);
  399. }
  400. /*
  401. * 입력값이 숫자,콤마(,)로 되어있는지 체크
  402. */
  403. function isNumComma(input) {
  404. let chars = ",0123456789";
  405. return containsCharsOnly(input, chars);
  406. }
  407. /*
  408. * 입력값이 사용자가 정의한 포맷 형식인지 체크
  409. * 자세한 format 형식은 자바스크립트의 `regular expression`을 참조
  410. */
  411. function isValidFormat(input, format) {
  412. return ((input.value.search(format) != -1) ? true : false);
  413. }
  414. /*
  415. * 입력값이 이메일 형식인지 체크
  416. * ex) if (!isValidEmail(form.email)) {
  417. * alert("올바른 이메일 주소가 아닙니다.");
  418. * }
  419. */
  420. function isValidEmail(input) {
  421. let format = /^((\w[\-\.])+)@((\w[\-\.])+)\.([A-Za-z]+)$/;
  422. return isValidFormat(input, format);
  423. }
  424. // URL 형식이 맞는지 확인
  425. function isValidURL(data) {
  426. return /^(((http(s?))\:\/\/)?)([0-9a-zA-Z\-]+\.)+[a-zA-Z]{2,6}(\:[0-9]+)?(\/\S*)?/.test(data);
  427. }
  428. /*
  429. * 입력값이 전화번호 형식(숫자-숫자-숫자)인지 체크
  430. */
  431. // function isValidPhone(input) {
  432. // let format = /^(\d+)-(\d+)-(\d+)$/;
  433. // return isValidFormat(input, format);
  434. // }