2012-01-28 5 views
1

シンプルなフォームを設定し、ajax + jqueryを使用して有効なユーザ名(DBには存在しません)と電子メールアドレス(有効な形式)を確認しますDB)私はそれをコーディングするメモ帳を使用しajax投稿を使用したユーザ名と電子メールアドレスのリアルタイム検証

<body> 
<div> 
<h5> Sign Up </h5> 
<hr /> 
<div> 
    Username:<input type="text" size="32" name="membername" id="username"><div id="usernameStatus"></div><br /> 
    Email:<input type="text" size="32" name="memberemail" id="memberemail"><div id="emailStatus"></div><br/> 
    Password:<input type="password" size="32" name="memberpwd"><br /> 
    <button id="signup" disabled="true">Sign Up</button> 
</div> 
<script>  
    function IsEmailValidAndNew() 
    { 
     var pattern = new RegExp(/^(("[\w-+\s]+")|([\w-+]+(?:\.[\w-+]+)*)|("[\w-+\s]+")([\w-+]+(?:\.[\w-+]+)*))(@((?:[\w-+]+\.)*\w[\w-+]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$)|(@\[?((25[0-5]\.|2[0-4][\d]\.|1[\d]{2}\.| 

[\d]{1,2}\.))((25[0-5]|2[0-4][\d]|1[\d]{2}|[\d]{1,2})\.){2}(25[0-5]|2[0-4][\d]|1[\d]{2}|[\d]{1,2})\]?$)/i); 
     var success=false; 
     $("#memberemail").change(function() 
     { 
      var email=$("#memberemail").val(); 
      success=patter.test(email); 
      if(success) 
      { 
       $("#usernameStatus").html('<img align="absmiddle" src="loading.gif"/> Checking email...'); 
       $.ajax(
       { 
        type: "POST", 
        url:"regcheckemail.php", 
        data:"memberemail="+email, 
        success: function(msg) 
        { 
         $("#emailStatus").ajaxComplete(function(event, request, settings) 
         { 
          if(msg=="OK") 
          { 
           $("#memberemail").removeClass("object_error"); 
           $("#memberemail").addClass("object_ok"); 
           $(this).html('<img align="absmiddle" src="checkmark.png"/>'); 
           success=true; 
          } 
          else 
          { 
           $("#memberemail").removeClass('object_ok'); 
           $("#memberemail").addClass("object_error"); 
           $(this).html(msg); 
           success=false; 
          } 
         } 
         ); 
        } 
       } 
       ); 
      } 
      else 
      { 
       $("#emailStatus").html("Provided email address is ill-formed"); 
       $("#memberemail").removeClass('object_ok'); // if necessary 
       $("#memberemail").addClass("object_error"); 
       success=false; 
      } 
     } 
     ); 
     return success; 
    } 

    function IsUserAlreadyExist() 
    { 
     var success=false; 
     $("#username").change(function() 
     { 
      var usr=$("#username").val(); 
      if(usr.length>=7) 
      { 
       $("#usernameStatus").html('<img align="absmiddle" src="loading.gif"/> Checking availability...'); 
       $.ajax(
       { 
        type: "POST", 
        url:"regcheckuser.php", 
        data:"username="+usr, 
        success: function(msg) 
        { 
         $("#usernameStatus").ajaxComplete(function(event, request, settings) 
         { 
          if(msg=="OK") 
          { 
           $("#username").removeClass("object_error"); 
           $("#username").addClass("object_ok"); 
           $(this).html('<img align="absmiddle" src="checkmark.png"/>'); 
           success=true; 
          } 
          else 
          { 
           $("#username").removeClass('object_ok'); 
           $("#username").addClass("object_error"); 
           $(this).html(msg); 
           success=false; 
          } 
         } 
         ); 
        } 
       } 
       ); 
      } 
      else 
      { 
       $("#usernameStatus").html("The username should have at least 7 characters"); 
       $("#username").removeClass('object_ok'); 
       $("#username").addClass("object_error"); 
       success=false; 
      } 
     }); 
     return success; 
    } 
    $(document).ready(function() 
    {  
     if(IsEmailValidAndNew() && IsUserAlreadyExist()) 
     { 
      $('button').find("#signup").attr("disabled","false"); 
     } 
     else 
     { 
      $('button').find("#signup").attr("disabled","true");  
     }   
    }); 
</script> 
</div> 
</body> 

を以下のように、それは動作しませんし、私は間違いを見つけることができません。私はあなたが埋め込まれたintellisenseとデバッグ機能のような素晴らしいオプションを持っているJavaScriptのコードに使用している良いツールを知りません。

+1

JavascriptのデバッグについてFireFox Webブラウザ用のFireBugプラグインをお勧めします。いくつかの 'console.log( "message")を追加することで、プラグインが提供するコンソールでスクリプトの流れを追跡できます! https://addons.mozilla.org/en-US/firefox/addon/firebug/ – yoshi

+1

はどこですか? jQueryライブラリファイルをインクルードしていると仮定できますか? – cosmorogers

+1

yoshiによると、既にChromeブラウザを使用している場合、デバッグツールが組み込まれています。 – nnnnnn

答えて

3

コードにはいくつかの問題があります。

  1. あなたの電子メールの正規表現は十分ではありません(これは実際にはコードの動作を停止するものではありませんが、私が気づいた最初のことです)。
  2. あなたのAJAX呼び出しが良いです非同期、ですが、Ajaxのレスポンスを受信する$.ajax()呼び出しを行う関数が完了することを意味します。あなたはajaxの成功のコールバックから何かをするためにこれを再構成する必要があります。
  3. ajaxComplete()関数は必要ありません。すでにその時点でajaxの成功ハンドラに入っていますので、現在のajaxComplete()のコードを直接成功関数に含めてください。
  4. ドキュメントからIsEmailValidAndNew()IsUserAlreadyExist()を一度呼び出して、「サインアップ」コントロールを無効または有効にしますが、その後で再度有効にするか無効にします。これらの関数をフィールドを検証するかのように呼び出していますが、実際にはフィールドのハンドラを変更するように設定されているため、フィールドが実際にユーザーによって変更されるまで、関数のコードは何も行いません。

後は、あなたの代わりにあなたのコードを構造化する可能性が一つの方法である:上記のコードのアイデアは、あなたが「サインアップ」ボタンを有効または無効にする必要がありますいくつかのポイントがあるということです

$(document).ready(function() { 
    var emailOK = false, 
     nameOK = false; 

    function setSubmitEnabling() { 
     $("#signup").prop("disabled", !(emailOK && nameOK)); 
    } 

    setSubmitEnabling(); 

    $("#username").change(function() { 
     var usr = $(this).val(); 
     if (usr.length < 7) { 
      $("#usernameStatus").html("The username should have at least 7 characters"); 
      $(this).removeClass('object_ok').addClass("object_error"); 
      nameOK = false; 
      setSubmitEnabling(); 
     } else { 
      // format seems OK, so do ajax call: 
      $("#usernameStatus").html('<img align="absmiddle" src="loading.gif"/> Checking availability...'); 
      $.ajax({ 
       type: "POST", 
       url:"regcheckuser.php", 
       data:"username="+usr, 
       success : function(msg) { 
        if(msg === "OK") 
        { 
         $("#username").removeClass("object_error") 
            .addClass("object_ok"); 
         $("#usernameStatus").html('<img align="absmiddle" src="checkmark.png"/>'); 

         nameOK = true; 
        } 
        else 
        { 
         $("#username").removeClass('object_ok') 
            .addClass("object_error"); 
         $("#usernameStatus").html(msg); 

         nameOK = false; 
        } 
        // now update button state 
        setSubmitEnabling(); 
       } 
      }); 
     } 
    }); 

    $("#memberemail").change(function() { 
     // basically the same thing as for the username field as shown above, 
     // except setting emailOK instead of nameOK, so I suggest you get the 
     // username part working first then come back to do this the same way 
    }); 

}); 

、および2つの無関係の条件に依存します。これらの条件ごとにフラグを作成し、フラグをチェックしてボタンを有効または無効にする関数setSubmitEnabling()を作成します。ページが読み込まれたときにすぐにその関数を呼び出して、最初の有効/無効状態を設定し、有効/無効状態を再評価する必要がある何かが変更されたときはいつでも再度呼び出します。

また、2つのフィールドごとに変更ハンドラを作成します。変更ハンドラはお互いに似ています。基本的には、最初のクイックバリデーションを行って長さとフォーマットがOKかどうかを確認し、そうであればAjaxを呼び出して一意性をテストします。

関連する問題