1

ajaxリクエストの結果によってフォームの送信を停止したいのですが...これは私が使用しようとしたコードです:関数chreg()はajaxリクエストから与えられたブール値を返すはずですが、そうではありません!

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);   
}

そして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>

しかし、それは機能しません!どうもありがとう!

4

3 に答える 3

1

サクセスハンドラー関数はtrueまたはfalseを返しますが、mainchregメソッドは返しません。

chregフォームの送信を停止するには、メソッドでfalseを返す必要があります。

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

フォームの送信はajaxを介して処理しているため、フォームにポストバックを実行させたくない場合があります。

于 2012-04-15T19:03:59.307 に答える
1

AJAXはデフォルトで非同期であるため、そのままでは機能させることができません。つまり、chregメソッドはリクエストを開始し、リクエストが完了してその結果がわかる前にすぐに戻ります。chregを返すかを知るためにその結果が必要なため、結果がわかる前に戻ることができないため、これは問題です。

1つの解決策は、ここで3番目のパラメーターを変更して要求を同期させることです。

// 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;
}

これは、リクエストの期間中UIをロックしてしまう可能性があるため、最善の解決策ではありません。これは望ましくありません。ただし、非同期モデル(この問題はありません)に戻ると、「逆方向」に何かを行う必要があるため、より複雑になります。

  1. 関数chregが呼び出され、AJAXリクエストを行います。常に返されますfalse(フォームは送信されません)
  2. インストールしたonreadystatechangedハンドラーは、AJAXが完了したことを検出すると、応答をチェックします。
  3. 応答が論理的に真である場合(フォームを実際に送信する必要がある場合)、それを使用form.submitして実行します。
于 2012-04-15T19:08:55.180 に答える
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>
于 2013-10-22T10:48:51.793 に答える