Вопрос: Client-side валидация в spring-формах и управление кнопкой submit'а
Привет всем!
Волею судеб занимаюсь поддержкой портального решения, написанного другими людьми, традиционно на текущий момент недоступными для консультации. Портал написан на Java с использованием Spring MVC и Spring Forms . В целом общее представление о том как Spring MVC работает имею, даже получается какой-то функционал допиливать и расширять, но некоторые вопросы ставят в тупик, даже не знаю куда копать. Итак, имеются spring-формы у которых задана валидация - как client-side, так и на сервере, например такой конструкцией:
<div class="control-group">
<form:label path="firstName" cssClass="control-label">Имя <common:requiredMark/></form:label>
<div class="controls">
<form:input path="firstName" required="required"
pattern="[- А-Яа-яЁё]+" title="Разрешены только буквы русского алфавита"
cssClass="input-xxlarge" maxlength="255"/>
<form:errors path="firstName" cssClass="help-inline" cssStyle="color: red;"/>
</div>
</div>
Соответственно, для текстового поля form:input задана валидация на обязательность и возможный набор символов, которая выполняется при submit'е до отправки формы на сервер. Также на форме используется блокировка кнопки submit'а для того чтобы не возникало двойной отправки, если сервер тупит, а пользователь нетерпеливо тыкает в кнопку, типа того:
<script type="text/javascript">
(function() {
$('#submit-btn').click(function() {
$('#submit-btn').attr('disabled', 'disabled');
$('form#myDto').attr('action', '<%= Url.CREATE_REQUEST %>');
$("#myForm [type=submit]").click();
});
В принципе, если все хорошо, то это работает корректно - кнопа дизейблится, форма отправляется, далее выполняются проверки на стороне сервера и, если есть ошибки, они отображаются в элементах form:errors. А вот если не проходит client-side валидация, то ошибки валидации отображаются, но кнопка сабмита остается неактивной (оно и понятно, выключить ее мы выключили, а вот включить - не включали). Но совершенно непонятно куда можно добавить включение кнопки, если валидация не выполнилась. А точнее, как я понимаю более правильное решение - выключать кнопку сабмита нужно после того как прошла валидация на клиенте, но как это перехватить - я не понимаю, так как явных функций валидации нигде не объявлено, вся валидация на клиенте исключительно прописана атрибутами spring-формы, типа "required". Пробовал вставлять что-то типа if ($('#form').isValid()), но js ругается, что подобного метода у объекта нет.
Куда, вообще, копать-то? Заранее всем спасибо!
Ответ:
Разобрался, принудительную валидацию можно вот таким образом выполнить:
$('#create-btn').click(function() {
var form = document.getElementById("createForm");
if (form.checkValidity()) {
$('#create-btn').attr('disabled', 'disabled');
$('form#MyDto').attr('action', '<%= Url.CREATE_REQUEST %>');
}
$("#createForm [type=submit]").click();
});