2012-04-15 4 views
1

Ich möchte ein Formular durch eine AJAX-Anfrage von Thr Ergebnis der Folge zu stoppen ... Dies ist der Code, den ich versuchte zu verwenden: Die Funktion chreg() sollte einen Booleschen geben zurückgegeben von die Ajax-Anfrage, aber nicht!Stop überreichen von Javascript AJAX Anfrage

Javascript:

function chreg() { 

user = document.getElementById('nome').value; 
passw1 = document.getElementById('passw1').value; 
passw2 = document.getElementById('passw2').value; 
mai = document.getElementById('mail').value; 
dat = 'use='+encodeURIComponent(user)+'&pas='+encodeURIComponent(passw1)+'&pas2='+encodeURIComponent(passw2)+'&mail='+encodeURIComponent(mai); 

htp = new XMLHttpRequest; 
htp.onreadystatechange = function(){ 

    if (htp.readyState == 4 && htp.status == 200){ 
     if (htp.responseText == "true"){ 
      alert('true'); 
     return true; 
     } 
     else { 
     document.getElementById('er2').innerHTML = '<br/><h3>'+tag_esc(decodeURIComponent(htp.responseText))+'</h3>'; 
     return false; 
     } 


    } 
}; 
a = Math.random 
    htp.open("POST","checklog.php?a="+a,true); 
    htp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
    htp.send(dat); 
} 

Und der HTML:

<form action="reg.php" method="POST" onsubmit="return chreg(this);"> 
<table id="tab2"><tr><td> 

<label for="user1">Username: <input type="text" name="user" id="nome" /></label></td>  <td> 
<label for="mail">Indirizzo e-mail: <input type="text" name="mail" id="mail" /></label> </td> 
</tr> 
<tr><td><label for="pass1">Password: <input type="password" name="pass1" id="passw1" /> </label></td> 
    <td><label for="pass2">Password (conferma): <input type="password" name="pass2" id="passw2" /></label></td></tr> 
    <tr><td colspan="2"><br /><input type="submit" class="st" value="Registrati" /></td> </tr> 

</table> 
<div id="er2"></div> 
</form> 

Aber es funktioniert nicht! Hilfe Vielen Dank!

Antwort

1

Sie werden nicht in der Lage sein, um es, wie es steht funktioniert, weil AJAX asynchrone standardmäßig ist. Das bedeutet, dass Ihre Methode chreg die Anforderung initiiert und sofort zurückgibt, bevor die Anforderung abgeschlossen und ihr Ergebnis bekannt geworden ist. Dies ist ein Problem, weil Sie nicht von chreg zurückkehren können, bevor das Ergebnis bekannt ist, da Sie dieses Ergebnis wissen müssen was zurückgeben.

Eine Lösung wäre die Anfrage synchron zu machen, indem Sie den dritten Parameter zu ändern hier:

// you will not need to set onreadystatechange at all 

htp.open("POST","checklog.php?a="+a,false); // false = synchronous 
htp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
htp.send(dat); 
if (htp.responseText == "true"){ 
    alert('true'); 
    return true; 
} 
else { 
    document.getElementById('er2').innerHTML = '<br/><h3>'+tag_esc(decodeURIComponent(htp.responseText))+'</h3>'; 
    return false; 
} 

Dies ist nicht die beste Lösung, weil es die Benutzeroberfläche für die Dauer des Antrags Perren könnte am Ende, die ist unerwünscht. Um jedoch das asynchrone Modell zurück (das dieses Problem nicht hat) wird stärker einbezogen werden, weil es Ihnen Dinge zu tun erfordert „rückwärts“:

  1. Funktion chreg aufgerufen und macht den AJAX-Request; es immer gibt false zurück (so wird das Formular nicht übermittelt)
  2. Wenn der onreadystatechanged -Handler, den Sie installiert haben, erkennt, dass der AJAX abgeschlossen ist, überprüft es die Antwort.
  3. Wenn die Antwort logisch wahr ist (das Formular muss tatsächlich gesendet werden), dann verwenden Sie form.submit, um es zu tun.
+0

danke für die Antwort ... Aber das Einreichen hört nicht auf! – user260031

+0

@ user1296041: Ich habe gerade zwei Zeilen (einschließlich der mit 'send') zum Beispielcode hinzugefügt - hast du es auf diese Weise versucht und es hat nicht funktioniert? – Jon

+0

Ich habe diese Seite nicht neu geladen, also habe ich den neuen Code nicht gesehen ... IT WORKS !!! Danke vielmals! – user260031

1

Ihre Erfolgshandlerfunktion gibt entweder wahr oder falsch zurück, aber Ihre Hauptmethode chreg nicht.

Sie müssen in Ihrer chreg Methode false zurückgeben, um das Senden des Formulars zu stoppen.

[...] 
    htp.send(dat); 
    return false; 

Da Sie die Formulareinreichung durch Ajax sind Handhabung, werden Sie wahrscheinlich das Formular nicht wollen atall ein Postback zu tun.

+0

Dank für Antwort, aber wenn die Funktion chreg false zurückgibt, gibt es auch falsch, wenn die Ajax-Antwort wahr ist! und das Einreichen stoppt! – user260031

+0

Sie verwenden Ajax, das von Natur aus asynchron ist. Warum möchten Sie das Formular senden, wenn die Ajax-Antwort wahr ist? Sie bearbeiten die Formularübermittlung in der Ajax-Anfrage richtig? –

0
<!DOCTYPE html> 
<html> 
<body> 

<h1>My First JavaScript</h1> 

<p>Please input a number.</p> 

<input id="demo" type="text"> 

<script> 
function myFunction() 
{ 
var x=document.getElementById("demo").value; 
if(x==""||isNaN(x)) 
     { 
     alert("Not Numeric"); 
     } 
} 
</script>