Javascript验证未按预期执行

时间:2013-05-06 16:39:48

标签: javascript jquery validation

我的JS验证码存在问题。当我提交表格并且有错误时,表格不应再继续下去。但是,代码并没有停止,而是继续到下一行,尽管仍然存在错误,但显示成功的消息。

我已经清楚地写过,如果字段为空,那么return false ......

为什么代码会继续到下一行,即使有return false

submit,您就会明白我的意思。

JS:

(function(window, $) {

    var Namespace = (function(Namespace) {

        Namespace = {

            // Main
            run : function() {
                this.validate.run('form');
            },              

            // Validation
            validate : {

                // error message span
                messageBox : '<span class="message" />',

                // add any field here
                fields : {
                    nameField : $('#contact-name'),
                    emailField : $('#contact-email'),
                    phoneField : $('#contact-phone')
                },

                // run validation
                run : function(formName) {

                    $(formName).on('submit', $.proxy(this.validateField, this));
                },

                validateField : function() {
                    for (var field in this.fields) {
                        if (this.fields.hasOwnProperty(field)) {
                            this.checkField(this.fields[field]);
                        }
                    }

                    $('#general-message-section').text('Form successfully sent, thank you!');
                    return false;
                },

                checkField : function(field) {

                    var messageBox = $(this.messageBox);

                    field.closest('li').find('.message').remove();

                    if (field.hasClass('required')) {
                        if (!field.val()) {
                            messageBox.text('This field is empty!');
                            field.closest('li').append(messageBox);
                            return false;
                        }
                    }

                    if (this.fields.emailField.val()) {
                        this.fields.emailField.closest('li').find('.message').remove();

                        if (!this.fields.emailField.val().match(this.regEx.email)) {
                            messageBox.text('Only email format accepted!');
                            this.fields.emailField.closest('li').append(messageBox);
                            return false;
                        }
                    }

                    if (this.fields.phoneField.val()) {
                        this.fields.phoneField.closest('li').find('.message').remove();

                        if (!this.fields.phoneField.val().match(this.regEx.numbers)) {
                            messageBox.text('Only numbers are accepted!');
                            this.fields.phoneField.closest('li').append(messageBox);
                            return false;
                        }
                    }
                },

                regEx : {
                    email : /^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$/,
                    numbers : /^[0-9]+$/
                }
            }
        };

        return Namespace;

    }(Namespace || {}));

    // make global
    window.Namespace = Namespace;

}(window, jQuery));

// run it...
Namespace.run();

HTML:

<p id="general-message-section"></p>
<form id="contact-form" method="post" action="#">
    <fieldset>

        <ul>
            <li>
                <label for="contact-name">Contact name *:</label>
                <input type="text" id="contact-name" tabindex="1" class="required" autofocus />
            </li>
            <li>
                <label for="contact-email">Contact email address *:</label>
                <input type="text" id="contact-email" tabindex="2" class="required" />
            </li>
            <li>
                <label for="contact-phone">Contact phone number:</label>
                <input type="text" id="contact-phone" tabindex="3" />
            </li>
            <li>
                <input type="submit" id="submit-btn" tabindex="4" value="Submit" />
            </li>
        </ul>
    </fieldset>
</form>

非常感谢

2 个答案:

答案 0 :(得分:2)

我猜你错过了验证逻辑中的检查。你的代码:

validateField : function() {
    for (var field in this.fields) {
        if (this.fields.hasOwnProperty(field)) {
            this.checkField(this.fields[field]);
        }
    }

    $('#general-message-section').text('Form successfully sent, thank you!');
    return false;
},

调用checkField但不检查其结果(可能是错误的)。我想你可以有类似的东西:

validateField : function() {
    for (var field in this.fields) {
        if (this.fields.hasOwnProperty(field)) {
            if(!this.checkField(this.fields[field])) {
                alert("There are errors!");
                return false;
            }
        }
    }

    $('#general-message-section').text('Form successfully sent, thank you!');
    return false;
},

当然return true; checkField如果它是正确的(最后),或者它也不会起作用。

答案 1 :(得分:1)

这将检查所有必填字段并将valid设置为false,如果任何checkField()返回false但不会中断For循环,它将检查循环和中断后有效是否为false:

        validateField : function() {
            var valid = true;
            for (var field in this.fields) {
                if (this.fields.hasOwnProperty(field)) {
                    if(this.checkField(this.fields[field]) === false) valid = false;
                }
            }
            if(!valid) return false;

            $('#general-message-section').text('Form successfully sent, thank you!');
        }

jsfiddle