|
373 | 373 | } |
374 | 374 |
|
375 | 375 | // исключение недопустимых символов (вообще) |
376 | | - target.value = target.value.replace( |
377 | | - /[=+,`~!?%#$^&:{}()<>|"'*/\\]/g, |
378 | | - '' |
379 | | - ); |
| 376 | + const invalidCharacters = /[=+,`;~!?%#№$^&:{}()<>|"'*/\\]/g; |
| 377 | + |
| 378 | + if (invalidCharacters.test(target.value)) { |
| 379 | + errors.push( |
| 380 | + 'Введите корректную почту, например: [email protected]' |
| 381 | + ); |
| 382 | + target.classList.add('is-invalid'); |
| 383 | + invalidFeed.textContent = |
| 384 | + 'Введите корректную почту, например: [email protected]'; |
| 385 | + } |
| 386 | + |
| 387 | + target.value = target.value.replace(invalidCharacters, ''); |
380 | 388 |
|
381 | 389 | // отдельная обработка пробелов через событие "beforeinput" (попытка исключить непонятный возврат "каретки" в начало строки/инпута при вводе пробела) |
382 | 390 | target.addEventListener('beforeinput', (event) => { |
|
889 | 897 | // ** организация "дополнительной" логики для валидации полей ввода/инпутов в модальных окнах (при/в "submit" состояниях) |
890 | 898 | function additionalFormInputsValidation(allModalInputs, modalBodyForm) { |
891 | 899 | const validErrors = []; |
| 900 | + // определение минимального количества букв/символов (для каждого инпут/типа поля) |
| 901 | + const minLengths = { |
| 902 | + 'modal-surname-input': 3, |
| 903 | + 'modal-name-input': 2, |
| 904 | + 'modal-patronymic-input': 5, |
| 905 | + 'modal-contact-input': { |
| 906 | + phone: 18, |
| 907 | + 'extra-phone': 18, |
| 908 | + vk: 7, |
| 909 | + email: 6, |
| 910 | + facebook: 5, |
| 911 | + twitter: 3, |
| 912 | + 'extra-contact': 3, |
| 913 | + }, |
| 914 | + }; |
| 915 | + // использование названий как в drop-down меню |
| 916 | + const contactTypeLabels = { |
| 917 | + phone: 'Телефон', |
| 918 | + 'extra-phone': 'Доп. телефон', |
| 919 | + vk: 'Vk', |
| 920 | + email: 'Email', |
| 921 | + facebook: 'Facebook', |
| 922 | + twitter: 'Twitter', |
| 923 | + 'extra-contact': 'Доп. контакт', |
| 924 | + }; |
892 | 925 |
|
893 | 926 | allModalInputs.forEach((input) => { |
894 | 927 | const parent = input.parentNode; |
|
915 | 948 | input.classList.add('is-invalid'); // выделение инпута "красным" |
916 | 949 | } |
917 | 950 | } else { |
918 | | - // отображение ошибок |
919 | | - if (input.classList.contains('is-invalid')) { |
920 | | - return; // если "is-invalid".. оставляем |
| 951 | + // проверка минимальной длины вводимых данных |
| 952 | + const inputClass = Object.keys(minLengths).find((className) => |
| 953 | + input.classList.contains(className) |
| 954 | + ); |
| 955 | + |
| 956 | + // для полей ФИО |
| 957 | + if (inputClass && typeof minLengths[inputClass] === 'number') { |
| 958 | + if (input.value.length < minLengths[inputClass]) { |
| 959 | + const fieldName = { |
| 960 | + 'modal-surname-input': 'Фамилия', |
| 961 | + 'modal-name-input': 'Имя', |
| 962 | + 'modal-patronymic-input': 'Отчество', |
| 963 | + }[inputClass]; |
| 964 | + |
| 965 | + validErrors.push( |
| 966 | + `Поле "${fieldName}" должно быть не менее ${minLengths[inputClass]} символов!` |
| 967 | + ); |
| 968 | + input.classList.add('is-invalid'); |
| 969 | + if (feedback) |
| 970 | + feedback.textContent = validErrors[validErrors.length - 1]; |
| 971 | + } |
| 972 | + } |
| 973 | + |
| 974 | + // для строк контактов |
| 975 | + if (input.classList.contains('modal-contact-input')) { |
| 976 | + const hiddenInput = parent.querySelector('.modal-hidden-input'); |
| 977 | + const contactType = hiddenInput ? hiddenInput.value : ''; |
| 978 | + const minLength = minLengths['modal-contact-input'][contactType] || 0; |
| 979 | + const contactLabel = contactTypeLabels[contactType] || 'Контакт'; |
| 980 | + |
| 981 | + if (input.value.length < minLength) { |
| 982 | + validErrors.push( |
| 983 | + `Поле "${contactLabel}" должно быть не менее ${minLength} символов!` |
| 984 | + ); |
| 985 | + input.classList.add('is-invalid'); |
| 986 | + if (feedback) |
| 987 | + feedback.textContent = validErrors[validErrors.length - 1]; |
| 988 | + } |
921 | 989 | } |
922 | 990 |
|
923 | | - // а если данные валидны, отмена выделения/исключение сообщения |
924 | | - input.classList.remove('is-invalid'); |
925 | | - if (feedback) feedback.textContent = ''; |
| 991 | + // Если данные валидны, убираем ошибки |
| 992 | + if (!input.classList.contains('is-invalid')) { |
| 993 | + input.classList.remove('is-invalid'); |
| 994 | + if (feedback) feedback.textContent = ''; |
| 995 | + } |
926 | 996 | } |
927 | 997 | }); |
928 | 998 |
|
|
2091 | 2161 | .querySelector('.invalid-feedback'); |
2092 | 2162 | if ( |
2093 | 2163 | feedback && |
2094 | | - feedback.textContent.trim() !== |
2095 | | - 'Заполните поле "Отчество" или оставьте его пустым!' |
| 2164 | + feedback.textContent.trim() && |
| 2165 | + input.value.trim() !== '' |
2096 | 2166 | ) { |
2097 | 2167 | return true; // другие сообщения.. кнопка "Сохранить" будет не доступной |
2098 | 2168 | } |
|
0 commit comments