0

二重の質問で申し訳ありません。このパスワード変更フォームをクラックしようとすると、いくつかの問題が発生します。これは、「if」ステートメントが true を返す場合にのみフォームを送信することについて、ここでの以前の質問の続きです。

パスワードが多くの要件に準拠していることを確認するために、if/else ステートメントを実行するkeyup関数があります。たとえば、7 文字より長い場合、大文字が含まれている場合、数字が 2 つ含まれている場合などです。keyup 関数内の else ステートメントで 0 として設定するグローバル変数 'rtnTrue = 1' を作成しました (要件の 1 つに失敗した場合、rtnTrue = 0)。したがって、rtnTrue = 1 の場合はフォームを送信でき、それ以外の場合は送信できないという理論があります。

私には2つの問題があります:

  1. 変数 global を使用しても、ユーザーがパスワード入力ボックスに何かを入力したときにのみ rtnTrue が発生するため、submit アクションに別のルールを設定する必要があります。たとえば、何も入力せずに単に送信を押した場合、いずれにせよ rtnTrue = 1 なので送信されます。pwd.length == 0 の行に沿って何かが必要ですが、この変数が keyup 関数内にあるため、その方法がよくわかりませんか?
  2. ボックスに間違ったことを入力して [送信] をクリックすると、コールバック アラートが 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;
        });
    }
}
4

2 に答える 2

0

目標を達成するための簡単な方法が必要な場合は、JSFiddle を変更しました。0 または 1 の代わりに true / false を使用してみてください。現在、ユーザーが入力するたびにフォームを送信しようとしています。私が JSFiddle で行ったことを見ることができます。

最初の変数を false に設定して、ユーザーが何も入力せずに送信ボタンをクリックしても送信されないようにします。

http://jsfiddle.net/ZncQx/22/

var passwordFine = false;
于 2013-05-20T01:31:06.930 に答える