二重の質問で申し訳ありません。このパスワード変更フォームをクラックしようとすると、いくつかの問題が発生します。これは、「if」ステートメントが true を返す場合にのみフォームを送信することについて、ここでの以前の質問の続きです。
パスワードが多くの要件に準拠していることを確認するために、if/else ステートメントを実行するkeyup関数があります。たとえば、7 文字より長い場合、大文字が含まれている場合、数字が 2 つ含まれている場合などです。keyup 関数内の else ステートメントで 0 として設定するグローバル変数 'rtnTrue = 1' を作成しました (要件の 1 つに失敗した場合、rtnTrue = 0)。したがって、rtnTrue = 1 の場合はフォームを送信でき、それ以外の場合は送信できないという理論があります。
私には2つの問題があります:
- 変数 global を使用しても、ユーザーがパスワード入力ボックスに何かを入力したときにのみ rtnTrue が発生するため、submit アクションに別のルールを設定する必要があります。たとえば、何も入力せずに単に送信を押した場合、いずれにせよ rtnTrue = 1 なので送信されます。pwd.length == 0 の行に沿って何かが必要ですが、この変数が keyup 関数内にあるため、その方法がよくわかりませんか?
- ボックスに間違ったことを入力して [送信] をクリックすると、コールバック アラートが 3 回表示されますが、その理由はわかりません。
これが私の JS コードです。かなり長いので、ここに JSFiddleを作成しました。
var rtnTrue = 1;
$('#password-info').hide();
$('#form-password-change #input-password').keyup(function() {
// keyup code here
// set password variable
var pwd = $(this).val();
// validate the length
if (pwd.length > 7) {
$('#length').removeClass('invalid').addClass('valid');
} else {
$('#length').removeClass('valid').addClass('invalid');
rtnTrue = 0;
}
// RegExp
// validate letter
if ( /([^a-z]*[a-z]){3,}/i.test(pwd) ) {
$('#letter').removeClass('invalid').addClass('valid');
} else {
$('#letter').removeClass('valid').addClass('invalid');
rtnTrue = 0;
}
// validate repeated letters (none repeated more than twice)
if ( /([A-Za-z])(.*?\1){2}/.test(pwd) ) {
$('#letter .repeated').removeClass('valid').addClass('invalid');
$('#letter').addClass('invalid-repeated');
} else {
$('#letter .repeated').removeClass('invalid').addClass('valid');
$('#letter').removeClass('invalid-repeated');
rtnTrue = 0;
}
// validate capital letter
if (pwd.match(/[A-Z]/)) {
$('#capital').removeClass('invalid').addClass('valid');
} else {
$('#capital').removeClass('valid').addClass('invalid');
rtnTrue = 0;
}
// validate number
if ( /([^\d]*[\d]){2,}/.test(pwd) ) {
$('#number').removeClass('invalid').addClass('valid');
} else {
$('#number').removeClass('valid').addClass('invalid');
rtnTrue = 0;
}
// validate repeated numbers (none repeated more than twice)
if ( /([\d])(.*?\1){2}/.test(pwd) ) {
$('#number .repeated').removeClass('valid').addClass('invalid');
$('#number').addClass('invalid-repeated');
} else {
$('#number .repeated').removeClass('invalid').addClass('valid');
$('#number').removeClass('invalid-repeated');
rtnTrue = 0;
}
passwordFormSubmit(); // New Function
}).focus(function() {
// focus code here
$('#password-info').slideDown('fast');
}).blur(function() {
// blur code here
$('#password-info').show();
});
function passwordFormSubmit() {
var local = rtnTrue;
if (rtnTrue==1) {
$('#form-password-change').submit(function(){
return true;
});
}else {
$('#form-password-change').submit(function(){
alert(rtnTrue);
return false;
});
}
}