#javascript #jquery #forms #jsp #el
#javascript #jquery #формы #jsp #el
Вопрос:
У меня есть JSP «password_reset_status», на который ссылается электронное письмо, отправляемое моим веб-приложением в ответ на запрос сброса пароля. JSP способен отображать 1 из 3 параметров:
- Форма для ввода нового пароля, если код сброса в ссылке совпадает с кодом в базе данных
- Сообщение о том, что код сброса неверен
- Сообщение о том, что произошла ошибка (нет кода сброса для пользователя, срок действия кода истек, проблемы с подключением к базе данных и т.д.)
Весь код работает, за исключением отправки формы. У меня есть проверка jQuery в форме, которая предотвращает отправку до тех пор, пока входные данные не станут действительными. Это работает так, как и должно быть. Однако, когда входные данные действительны (я знаю, что они действительны, потому что я настроил их для отображения проверок и крестиков рядом с допустимыми и недопустимыми полями, а атрибуты поля указывают, что они действительны), он не выполняет свой атрибут «action», если это какой-либо javascript, отличный от «alert ()» (даже не предупреждение со строкой)!
У меня есть аналогичная система для других форм в моем веб-приложении (единственными отличиями являются поля, которые должны быть проверены, и функция ajax, вызываемая для отправки данных), и все они ведут себя так, как должны. Однако все они находятся на обычной HTML-странице. Как вы думаете, проблема может быть вызвана тем фактом, что это JSP?
Вот код для тела JSP:
<!--The action normally contains an AJAX function that populates the text of "createNewPasswordStatusMessage", but the alert was put there for debugging purposes (it won't even launch the alert! -->
<body>
<c:catch var="e">
<c:choose>
<c:when test="${sessionScope.passwordResetStatus == applicationScope.passwordResetStates.passwordResetCodeCorrect}">
<div id="content">
<h1 id="title"><!--Title of my web app--></h1>
<form id="createNewPasswordForm" action="javascript:alert("What is going on?")" method="post">
<div class="formRows"> <label class="nameLabels" for="newPassword">New password:</label> <input class="formFields" type="password" name="newPassword"/> </div>
<div class="formRows"> <label class="nameLabels" for="confirmNewPassword">Confirm:</label> <input class="formFields" type="password" name="confirmNewPassword"/> </div>
<div class="formRows"> <input type="hidden" name="ID" value="${sessionScope.ID}"/></div>
<div class="formRows"> <input type="hidden" name="firstName" value="${sessionScope.firstName}"/></div>
<div class="formRows"> <input type="hidden" name="action" value="createNewPassword"/> </div>
<div class="formRows"> <input id="newPasswordFormSubmitButton" type="submit" value="Submit new password"/> </div>
</form>
<p id="createNewPasswordStatusMessage"></p>
</div>
</c:when>
<c:when test="${sessionScope.passwordResetStatus == applicationScope.passwordResetStates.passwordResetCodeIncorrect}">
<!-- Message stating that password is incorrect. Omitted for brevity. -->
</c:when>
<c:when test="${sessionScope.passwordResetStatus == applicationScope.passwordResetStates.passwordResetCodeExpired}">
<!-- Message stating that reset code has expired or that an error may have occurred. Omitted for brevity. -->
</c:when>
</c:choose>
</c:catch>
<c:if test="${e!=null}">The caught exception is:
<div id="content">
<h1 id="title"><!--Title of my web app--></h1>
<p id="statusMessage">"<c:out value="${e}" /></p>
</div>
</c:if>
</body>
Я не хотел заваливать людей заголовком документа, который содержит javascript (после устранения ошибки он будет помещен в отдельный файл javascript). Javascript проверки работает, в то время как простое предупреждение — нет, поэтому я думаю, что это может быть связано с JSP-кодом формы. Кто-нибудь может указать мне правильное направление?
Редактировать
Итак, подведем итог:
- действие=»(некоторый URL)» РАБОТАЕТ
- действие =»alert()» РАБОТАЕТ (отображает IP сервера)
- действие=»(любой другой javascript)» НЕ РАБОТАЕТ
Ответ №1:
Попробуйте добавить свой обработчик с помощью
$('#createNewPasswordForm').submit(callback)
Комментарии:
1. Проблема в том, что плагин проверки также подключает прослушиватель к событию отправки. Итак, что происходит, так это то, что оба прослушивателя выполняются одновременно (что приводит к отправке формы без предварительной проверки).
2. тогда не было бы лучше, если бы функция отправки выполнялась в конце функции проверки? Возможно, вы захотите проверить отложенный API jQuery. jqapi.com/#p=deferred.promise
3. Спасибо. Это выглядит возможным решением… Я мог бы пойти по этому пути, если кто-то не может понять, почему это не работает (поскольку это должно!).
4. Вам следует практиковать ненавязчивый javascript и добавлять обработчики в свои файлы javascript, а не непосредственно в html. Возможно, это просто какое-то странное поведение вашего браузера или, возможно, jQuery берет на себя управление системой событий, так что браузер никогда не просматривает атрибут action.
5. Хотел обновить этот пост. Оказывается, проблема заключалась в ошибке в моем коде! Хотя спасибо за помощь. И это единственный javascript в теле моего HTML. Я просто нахожу, что включение действия отправки в атрибут action больше соответствует тому, как регулярно отправляются формы. Другой метод требует добавления дополнительного прослушивателя; я хотел бы свести это к минимуму, кроме того, мне нечего было бы указать для атрибута action, который необходим для правильной формы HTML (если я не ввожу фиктивное значение).