2016-04-05 7 views
0

電子メールが規格に適合しない場合、エラーメッセージを表示する電子メール検証フィールドを作成しようとしています。このために私はイベントとしてkeyupを使用したので、ユーザーが間違った電子メールを入力するとすぐにメッセージが表示されます。jQueryキーアップが遅れてトリガーされないようにします

しかし、このようにユーザーがメッセージを表示するたびにメッセージが表示されるため、遅延を追加してこの機能を検出することができましたが、実際には遅延が追加されますが、メッセージが表示されるたびに表示されます。

ユーザーが特定の期間停止した後に初めてイベントが呼び出されるようにする方法を知っていますか?

JSFiddle

<table> 
    <tr> 
     <td>Email</td> 
     <td> 
      <input type="text" class="email" value="[email protected]"> 
     </td> 
     <td><span class="message"></span></td> 
    </tr> 
</table> 
function isEmail(email) { 
    var regex = /^([a-zA-Z0-9_.+-])+\@(([a-zA-Z0-9-])+\.)+([a-zA-Z0-9]{2,4})+$/; 
    return regex.test(email); 
} 

$('.email').on('keyup', function() { 
    var delay = (function() { 
     var timer = 0; 
     return function(callback, ms) { 
      clearTimeout(timer); 
      timer = setTimeout(callback, ms); 
     }; 
    })(); 

    var email = $('.email').val(); 
    $(this).closest('tr').find('.message').hide(); 

    if (isEmail(email) == false) { 
     delay(function() { 
      $('.email').closest('tr').find('.message').hide().html('Invalid email.').fadeIn('fast'); 
     }, 1000); 
    } else { 
     $(this).closest('tr').find('.message').hide(); 
    } 
}); 
+0

それは同様に遅延なく動作するようにあなたが遅延バディを必要とするのはなぜ見える – Santhucool

+0

遅延を削除し、代わりに「からkeyup」 –

+0

@santhucoolの「ぼかし」イベントを使用するので、私はユーザーが何かを入力するたびに入力が有効になることをユーザーに気付かせるのは簡単ですが、遅れなくてもユーザーが何か入力するたびにメッセージが退色し続けます。だから私は、ユーザーのキーアップイベントだけが入力されたと考えていた – Bart

答えて

0

あなたのタイムアウトのロジックは、上記に少し欠陥があります。ユーザーが入力を曖昧にして電子メールの正当性を確認することは、検証なしでユーザーが電子メールを入力できる優れた方法であることに注意してください。あなたがしたい場合は、最初のぼかしイベントに続いてキーを押すたびに電子メールの有効性をチェックできます。 ?このような何か:

function checkEmailValidity($el) { 
    var regex = /^([a-zA-Z0-9_.+-])+\@(([a-zA-Z0-9-])+\.)+([a-zA-Z0-9]{2,4})+$/; 
    var $msg = $el.closest('tr').find('.message').hide(); 
    if (!regex.test($el.val())) 
     $msg.html('Invalid email.').fadeIn('fast'); 
} 

var timer;  
$('.email').on({ 
    blur: function() { 
     $(this).data('hasBlurred', true); 
     checkEmailValidity($(this)); 
    }, 
    keyup: function() { 
     clearTimeout(timer); 
     timer = setTimeout(function() { 
      $(this).data('hasBlurred') && checkEmailValidity($(this)); 
     }.bind(this), 250); 
    } 
}); 

Working example

+0

電子メールはすでに別の時間。しかし、まだ注文を送信する前に変更することができます。したがって、ユーザーは電子メール全体を再入力する代わりに.comを.netに変更するだけで済みます。したがって、理想的な状況は、ユーザーが一定の時間入力した後まで、keyupイベントを遅らせることです。 – Bart