|
58 | 58 | .classList.toggle('show-search-input'); |
59 | 59 | }); |
60 | 60 |
|
61 | | - // ** обновление валидационного сообщения (изменение состояния input(a)) |
62 | | - function updateFormInputValidMsg(input) { |
63 | | - const parentNode = input.parentNode; |
64 | | - const invalidFeed = parentNode.querySelector('.invalid-feedback'); |
65 | | - |
66 | | - if (!invalidFeed) return; // если/вдруг такое сообщение не предусмотренно для input(а) |
67 | | - |
68 | | - input.classList.remove('is-invalid'); |
69 | | - |
70 | | - if (input.placeholder) { |
71 | | - switch (input.placeholder) { |
72 | | - case 'Фамилия': |
73 | | - invalidFeed.textContent = 'Заполните поле "Фамилия"!'; |
74 | | - break; |
75 | | - case 'Имя': |
76 | | - invalidFeed.textContent = 'Заполните поле "Имя"!'; |
77 | | - break; |
78 | | - case 'Отчество': |
79 | | - invalidFeed.textContent = 'Заполните поле "Отчество"!'; |
80 | | - break; |
81 | | - case 'Ф.И.О.': |
82 | | - invalidFeed.textContent = 'Введите Ф.И.О.!'; |
83 | | - break; |
84 | | - case 'Дата рождения': |
85 | | - invalidFeed.textContent = |
86 | | - 'Укажите дату рождения, в диапазоне: от 1900 года до "текущего"!'; |
87 | | - break; |
88 | | - case 'Год начала обучения': |
89 | | - invalidFeed.textContent = |
90 | | - 'Укажите год начала обучения, в диапазоне: от 2000 по "текущий"!'; |
91 | | - break; |
92 | | - case 'Год окончания обучения': |
93 | | - invalidFeed.textContent = |
94 | | - 'Укажите год окончания обучения, в диапазоне: от 2004 по "..."!'; |
95 | | - break; |
96 | | - case 'Факультет': |
97 | | - invalidFeed.textContent = 'Определите факультет (не менее 3-х букв)!'; |
98 | | - break; |
99 | | - default: |
100 | | - invalidFeed.textContent = 'Заполните поле!'; |
101 | | - break; |
102 | | - } |
103 | | - } |
104 | | - } |
105 | | - |
106 | 61 | // ** организация валидации для ввода данных/фильтрационного инпута (для формы без submit) |
107 | 62 | function searchFormInputValidation(input) { |
108 | | - if (input.type === 'number') { |
109 | | - // исключение ввода не цифр, через прослушку клавиатуры (ряд исключений) |
110 | | - input.addEventListener('keydown', (event) => { |
111 | | - const pressedKey = event.key; |
112 | | - const target = event.target; |
113 | | - const targetParentNode = target.parentNode; |
114 | | - const invalidFeed = targetParentNode.querySelector('.invalid-feedback'); |
115 | | - |
116 | | - if (event.ctrlKey || event.altKey || event.shiftKey) { |
117 | | - return; |
118 | | - } |
119 | | - |
120 | | - if ( |
121 | | - !pressedKey.match(/[0-9]/) && |
122 | | - ![ |
123 | | - 'Tab', |
124 | | - 'Backspace', |
125 | | - 'Enter', |
126 | | - 'Delete', |
127 | | - 'ArrowUp', |
128 | | - 'ArrowRight', |
129 | | - 'ArrowDown', |
130 | | - 'ArrowLeft', |
131 | | - ].includes(pressedKey) |
132 | | - ) { |
133 | | - target.classList.add('is-invalid'); |
134 | | - invalidFeed.textContent = 'Некорректный ввод! Только цифры!'; |
135 | | - event.preventDefault(); |
136 | | - } else { |
137 | | - target.classList.remove('is-invalid'); |
138 | | - updateFormInputValidMsg(target); |
139 | | - } |
140 | | - }); |
141 | | - } |
142 | | - |
143 | 63 | input.addEventListener('input', (event) => { |
144 | 64 | const target = event.target; |
145 | 65 | const targetParentNode = target.parentNode; |
146 | 66 | const invalidFeed = targetParentNode.querySelector('.invalid-feedback'); |
147 | 67 |
|
148 | | - if (target.type === 'text') { |
149 | | - // только русские буквы и дефис (для двойных-фамилий), без цифр/символов и необоснованных пробелов |
150 | | - if ( |
151 | | - /[^а-яА-ЯёЁ\s-]/.test(target.value) || |
152 | | - /\s{2,}/.test(target.value) || |
153 | | - /^\s|\s$/.test(target.value) |
154 | | - ) { |
155 | | - target.classList.add('is-invalid'); |
| 68 | + // принудительное исключение пробелов (в начале строки) |
| 69 | + target.value = target.value.replace(/^\s+/, ''); |
| 70 | + |
| 71 | + // только русские буквы (без цифр/символов), "один" дефис (для двойных фамилий) и без необоснованных пробелов |
| 72 | + if ( |
| 73 | + /[^а-яА-ЯёЁ\s-]/.test(target.value) || |
| 74 | + (target.value.match(/-/g) || []).length > 1 || |
| 75 | + /\s{2,}/.test(target.value) |
| 76 | + ) { |
| 77 | + target.classList.add('is-invalid'); |
| 78 | + |
| 79 | + if (/[^а-яА-ЯёЁ\s-]/.test(target.value)) { |
156 | 80 | invalidFeed.textContent = |
157 | | - 'Некорректный ввод! Измените раскладку клавиатуры и/или исключите цифры/знаки, пробелы!'; |
| 81 | + 'Некорректный ввод! Измените раскладку клавиатуры и/или исключите цифры/знаки!'; |
| 82 | + } else if ((target.value.match(/-/g) || []).length > 1) { |
| 83 | + invalidFeed.textContent = 'Некорректный ввод! Только ОДИН дефис!'; |
158 | 84 | } else { |
159 | | - target.classList.remove('is-invalid'); |
160 | | - updateFormInputValidMsg(target); |
161 | | - } |
162 | | - } else if (target.type === 'number') { |
163 | | - // ограничение по длине ввода |
164 | | - if (target.value.length > 4) { |
165 | | - target.classList.add('is-invalid'); |
166 | | - invalidFeed.textContent = 'Некорректный ввод! Не более 4 цифр!'; |
167 | | - } else { |
168 | | - target.classList.remove('is-invalid'); |
169 | | - updateFormInputValidMsg(target); |
| 85 | + invalidFeed.textContent = |
| 86 | + 'Некорректный ввод! Только ОДИН пробел между словами!'; |
170 | 87 | } |
| 88 | + } else { |
| 89 | + target.classList.remove('is-invalid'); |
| 90 | + invalidFeed.textContent = ''; // очистка сообщения об ошибке |
171 | 91 | } |
172 | 92 | }); |
173 | 93 | } |
|
0 commit comments