Событие onsubmit не работает для отправки асинхронной формы

Я создал форму, используя теги struts. Я отправил форму асинхронно, используя тег отправки struts jquery. Теперь, прежде чем я отправлю свою форму, я хочу вызвать функцию javascript checkUser(), которая проверяет, есть ли какая-то ошибка на стороне клиента, и предотвращает отправку формы. Форма с функцией javascript выглядит следующим образом:

<script type="text/javascript">
    function loadXMLDoc() {

        var xmlhttp;
        var k = document.getElementById("register_userDetails_username").value;

        var urls = "pass.jsp?ver=" + k;

        if (window.XMLHttpRequest) {
            xmlhttp = new XMLHttpRequest();
        } else {
            xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
        }
        xmlhttp.onreadystatechange = function() {
            if (xmlhttp.readyState == 4) {
                document.getElementById("err1").innerHTML = xmlhttp.responseText;
            }
        };
        xmlhttp.open("GET", urls, true);
        xmlhttp.send();
    }
</script>
<script type="text/javascript">
      function checkuser() {
          alert("hi");  
            var i = document.getElementById('err1').innerHTML.search("Unavailable");
            alert(i);
            var j= document.getElementById('err1').innerHTML.search("Min length:8");
            alert(j);
            if (i!= -1 || j!=-1) {
                alert("hello");
                return false;
            } 
            alert("false");
            return false;
      } 

</script>



<%@ taglib prefix="s" uri="/struts-tags"%>
<%@ taglib prefix="sj" uri="/struts-jquery-tags"%>
<jsp:include page="menubar.jsp"></jsp:include>
<s:form action="register" method="post" theme="css_xhtml" cssClass="form1" style="margin:8px 211px" onsubmit="return checkuser()">
    <div class="searchHeader">Sign Up</div>  
    <div id="passwordMatchError">
        <s:property value="error"/>
    </div>
    <s:textfield label="Name" name="userDetails.name" maxlength="30"/>
    <s:textfield label="Username"  name="userDetails.username" onkeyup="loadXMLDoc()" maxlength="30">
        <div id="err1"></div>
    </s:textfield> 
    <s:password label="Password" name="userDetails.password" maxlength="45"/>
    <s:hidden name="userDetails.role" value='U' />
    <s:password name="confirmPassword" label="Confirm Password" maxlength="45"/>
    <s:radio label="Sex" name="userDetails.sex" list="#{'M':'Male','F':'Female'}" />
    <s:textfield label="Phone No" name="userDetails.phoneno" maxlength="10"/>
    <s:textfield label="E-mail" name="userDetails.email" maxlength="45"/>
    <div id="submitdivid"> 
        <sj:submit value="SUBMIT" cssClass="orangebuttonsmall" targets="mainContent" id="sas" />
    </div>
</s:form>

Теперь, когда я ввожу какое-то значение в поле имени пользователя, которое уже существует в БД, оно показывает строку Unavailable в div с идентификатором err.

В событии onsubmit формы я вызвал метод checkuser. Но с sj:submit событие onsubmit не работает. Может ли кто-нибудь помочь мне с тем, как вызвать эту работу onsubmit? Моя цель - предотвратить отправку формы, если существует строка Unavailable или Min Length:8 в div err. Любые альтернативные решения также принимаются.


person Gaurav Kumar    schedule 13.11.2013    source источник
comment
Как вы отнеслись к этому событию?   -  person Roman C    schedule 13.11.2013
comment
@RomanC Я вызвал метод checkuser() при запуске этого события. Там я проверил определенные условия, которые, если они верны, я хочу предотвратить отправку формы. Но с тегом sj:submit это событие не работает.   -  person Gaurav Kumar    schedule 14.11.2013
comment
У вас есть доказательства того, что событие было уволено? И я не понимаю, что не работает: предотвращение отправки формы или тег sj:submit.   -  person Roman C    schedule 14.11.2013
comment
@RomanC Проблема в том, что когда я использую тег sj:submit, событие onsubmit не запускается.   -  person Gaurav Kumar    schedule 18.11.2013
comment
В этом теге нет такого события.   -  person Roman C    schedule 18.11.2013
comment
@RomanC Полная сцена выглядит так. Я создал форму, используя ‹s:form›. Я вызвал функцию для события onsubmit этой формы, используя ‹s:form onsubmit=return someFunction()›. Теперь, если я использую ‹sj:submit› для отправки этой формы, то это событие не запускается, т.е. управление не переходит к этой функции someFunction(). И если я использую s:submit для отправки формы, событие срабатывает. теперь не понимаю в чем причина....   -  person Gaurav Kumar    schedule 20.11.2013
comment
Причина в том, что они воспроизводят различное поведение между обычным запросом и запросом Ajax. Если sj:submit ведет себя как s:submit, то между запросами должно быть переключение.   -  person Roman C    schedule 20.11.2013
comment
@RomanC Моя цель - вызвать функцию, когда я отправляю эту форму, и если в ней выполняются определенные проверки условий, то форма не должна быть отправлена. Как я могу сделать это, используя sj:submit?   -  person Gaurav Kumar    schedule 20.11.2013
comment
Вы можете использовать тег s:if, чтобы сделать выбор между двумя отправками.   -  person Roman C    schedule 20.11.2013


Ответы (1)


В голове:

<script type="text/javascript">
    $.subscribe('beforeSubmit', function(event,data) {
        event.originalEvent.options.submit = checkuser();          
    });
</script>

В вашем теге:

<sj:submit value = "SUBMIT" 
        cssClass = "orangebuttonsmall" 
         targets = "mainContent" 
              id = "sas" 
  onBeforeTopics = "beforeSubmit"
/>
person Andrea Ligios    schedule 13.11.2013
comment
Событие Onclick отлично работает с тегом, но это не мешает отправке формы. - person Gaurav Kumar; 13.11.2013
comment
если вы вернете false, так и должно быть. По крайней мере, это работает с ‹s:submit›, не уверен с ‹sj:submit› - person Andrea Ligios; 13.11.2013
comment
даа я согласен. Это работает с s:submit. Проблема заключается в sj:submit. С ним не работает... - person Gaurav Kumar; 13.11.2013
comment
Я последовательно переписал ответ; полностью непроверенное решение, просто попробуйте и дайте мне знать. Чтобы избежать путаницы, всегда возвращайте значение из вашей функции. - person Andrea Ligios; 13.11.2013
comment
@AndreaLigios: это не работает, и форма отправляется! Я использую последнюю версию struts jquery (3.7.0). насколько я просмотрел на code.google.com/p/ struts2-jquery/issues/detail?id=1039 этот параметр был предложен и не реализован - person Alireza Fattahi; 26.02.2014
comment
Хорошо, это была ошибка, но она должна были исправлены в 3.2.1 :| - person Andrea Ligios; 26.02.2014
comment
Я тоже использую 3.7.0 и только что проверил, исправление есть, строка 1130 :| Вы уверены, что он не работает? - person Andrea Ligios; 26.02.2014
comment
Извините за опоздание! Я обнаружил, что это не помешает проверке ajax, если форма имеет validateFunction и имеет validate=true! - person Alireza Fattahi; 19.03.2014