2

基本(入力されたユーザー名、最小の長さのユーザー名など)を確認できるだけでなく、ユーザー名や電子メールなどがまだ確認されていないことを確認できるように(データベース検索が必要)、フォームを検証したい。

$.post私はすべてのピースを持っています、そして遊んだ後、それが私の「失敗」カウンターに追加することを意図している間、ステートメントがそうしていないことを見つけるためにそれを絞り込みました。$.post本当に検証できるように、行から何らかの形式の出力を取得するにはどうすればよいですか(現在、ユーザー名が使用できない場合でも、フォームが送信されるため)。

これが私の<script>ものです(ただし、簡単にするために、ユーザー名の部分を表示するために短縮されています)。'usernameoff'が私のエラーブロックであることに注意してください。

function validateForm()
{
   // set variables
   var username=document.forms["registrationnew"]["username"].value;
   var usernamespace=username.indexOf(" ");

   // set fail counter variable to determine if any requirements failed
   var counter=0;

   // check that username isn't blank, containing spaces, too short, or taken
   if (username==null || username=="")
   {
      counter++;
      $('#usernameoff').html("Must enter a username");
   }
   else if (username.indexOf(" ") >= 0)
   {
      counter++;
      $('#usernameoff').html("Cannot contain spaces");
   }
   else if (username.length < 3)
   {
      counter++;
      $('#usernameoff').html("Must be at least three characters");
   }
   else
   {
      $.post("check_username.php", {username: username}, function(result)
      {
         if(result == 0)
         {
            $('#usernameoff').html("Available");
         }
         else
         {
            counter++;
            $('#usernameoff').html("Not available");
         }
      });
   }  

   // if any test failed, return false
   if (counter > 0)
   {
      document.getElementById("errorflag").innerHTML=counter;
      return false;
   }
}

$.post入力されたユーザー名がすでに使用されているかどうかを判断するためのクエリを実行します(0または1を返します)。私の問題は、どちらを返すかに関係なく、「counter」をインクリメントしないため、フォームが引き続き送信されることです。

4

1 に答える 1

1

最終テスト ( if (counter > 0)) は、AJAX 呼び出しが返される前に実行されます。これは AJAX の「非同期」部分です。

あなたの場合、最も簡単な解決策は$.post、同期呼び出しに置き換えることです。

$.ajax({
  type: "POST",
  url: "check_username.php", 
  data: {'username': username},
  async: false,
  success: function(result) { /* ... */ }
});

これにより、スクリプトが返されるのを待つ間に遅延が発生しますが、独自のサーバー上にあるため、遅延は最小限に抑える必要があります。

(同期呼び出しは常に可能であるとは限りません。詳細については、ドキュメントを.ajax()参照してください。)

于 2013-01-09T16:35:32.550 に答える