0

私は自分のフォームで多くの検証を行っており、最終ステップに到達したらthis.form.submit();、フォームを送信するために使用できます。そのステップに到達し、console.log を使用してみましたが、うまくいきました。しかし、フォームを送信せず、次のエラーが発生します。

Uncaught TypeError: Cannot call method 'submit' of undefined 

なぜ未定義になるのですか?

        $("#center").on('click', function(e) {

            var valid = true;
            var fields;
            var canSubmit;
            var readyForValidate;
            var emailValidation;

            var close        = $("#close");
            var errors       = $(".errors");
            var username     = $("#username");
            var pass         = $("#password");
            var repass       = $("#repassword");
            var pass_f       = $("#password_f");
            var repass_f     = $("#repassword_f");
            var email        = $("#email");
            var display      = $("#display");
            var incomplete   = $(':input', this.form).filter(function() {
                                   return $(this).val() == '';
                               });

            $(':input', this.form).each(function(i, ele) {
                e.preventDefault();
                if (ele.value.trim() == "") {
                    ele.style.border = '2px solid red';
                    valid = false;
                    errors.html("One of the fields are empty, please fill them up. <span id='close'>X</span>");
                    errors.fadeIn("slow");
                    close.click(function() {
                        errors.fadeOut("slow");
                        errors.html("");
                    });                     
                }
                else
                {
                    $(this).removeAttr('style');
                }
            });

            if(!incomplete.length) {
                fields = true;
            } else {
                fields = false;
            }

            if (fields) {
                if (!isValidEmailAddress(email.val())) {
                    errors.html("The entered email address is not valid. <span id='close'>X</span>");
                    errors.fadeIn("slow");
                    email.css("border", "solid 2px red");
                    close.click(function() {
                        errors.fadeOut("slow");
                        errors.html("");
                    });         
                } else if (pass.val() != repass.val()) {
                    errors.html("Your passwords for in-game are not equal! <span id='close'>X</span>");
                    errors.fadeIn("slow");  
                    pass.css("border", "solid 2px red");
                    repass.css("border", "solid 2px red");
                } else if (pass_f.val() != repass_f.val()) {
                    errors.html("Your passwords for forums are not equal! <span id='close'>X</span>");
                    errors.fadeIn("slow");  
                    pass_f.css("border", "solid 2px red");
                    repass_f.css("border", "solid 2px red");    
                } else if (pass.val().length < 5) {
                    errors.html("Your in-game password is too short! <span id='close'>X</span>");
                    errors.fadeIn("slow");  
                    pass.css("border", "solid 2px red");        
                } else if (pass_f.val().length < 5) {
                    errors.html("Your forums password is too short! <span id='close'>X</span>");
                    errors.fadeIn("slow");  
                    pass_f.css("border", "solid 2px red");
                } else if (
                pass_f.val() == repass_f.val()      && 
                pass.val() == repass.val()          && 
                isValidEmailAddress(email.val())    && 
                pass.val().length > 4               &&
                pass_f.val().length > 4) {

                    readyForValidate = true;

                } else {
                    readyForValidate = false;
                }

                if (readyForValidate) {
                    validateUsername(username.val()).done(function(data) {
                        if ($.trim(data) == 1) {
                            errors.html("That username already exists! Please use another.<span id='close'>X</span>");
                            errors.fadeIn("slow");  
                            username.css("border", "solid 2px red");                
                        } else {
                            validateEmail(email.val(), 'email').done(function(data) {
                                if ($.trim(data) == 1) {
                                    errors.html("That email is already registered. Please use another.<span id='close'>X</span>");
                                    errors.fadeIn("slow");  
                                    email.css("border", "solid 2px red");                               
                                }
                                else
                                {
                                        this.form.submit();
                                }
                            });                             
                        }
                    });
                }   
            }
        }); 

    }); 

    /**
    * Function check email
    * Checks if email is valid
    *
    * @param emailAddress Entered email address
    * @return email is valid
    **/

    function isValidEmailAddress(emailAddress) {
        var pattern = new RegExp(/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i);
        return pattern.test(emailAddress);
    }

    function validateUsername(username, type) {
        return $.post("js/ajax/ajax.php", { validateUsername : 1 });
    }

    function validateEmail(username, type) {
        return $.post("js/ajax/ajax.php", { validateEmail : 1 });
    }
4

2 に答える 2

0

それはthis文脈による

thisdoneハンドラー内の同じオブジェクトを指していません。

の参照を保存してthis から使用してみる

参照を保存して、done 内で使用することができます。

または$.proxy、 this コンテキストを使用してそれにバインドします。

于 2013-07-12T21:51:53.320 に答える
0

あなたはajaxdone()関数のスコープ内にいるので、存在しないので、this何もしませんか?$.ajaxthis.formthis.form.submit()

$("#center").on('click', function(e) {
   var self = this;

   .......

   validateEmail(email.val(), 'email').done(function(data) {
       self.form.submit();
   });
});
于 2013-07-12T21:52:20.990 に答える