HTML, Javascript и JSP: форма не вступает в «действие» при нажатии кнопки отправки

#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 (если я не ввожу фиктивное значение).