【问题标题】:Form Validation with jQuery before submitting via Ajax request在通过 Ajax 请求提交之前使用 jQuery 进行表单验证
【发布时间】:2013-02-17 09:02:16
【问题描述】:

我正在尝试在使用 Ajax 请求将表单提交到我的 php 脚本之前验证我的表单。我查看了 stackoverflow 并没有找到可行的方法。

我有 3 个输入和一个提交按钮:

<input type="text" name="full-name" id="full-name" value="" placeholder="Full Name" />
<input type="text" name="email" id="email" value="" placeholder="Email" />
<textarea name="message" id="message" value="" rows="8" placeholder="Message"></textarea>
<input type="submit" id="contact-submit" class="contact-submit" value="Submit">
<div id="messageResponse" class="center" style="display:none;"></div>

$(document).ready(function() {

    function validator(){
        return $('form').validate();
    }

    $('form').on('submit', function(e) {
        e.preventDefault();

        $.ajax({
            dataType: 'html',
            type: 'post',
            url: 'mail.php',
            data: $('#contact-form').serialize(),
            beforeSubmit: validator,
            success: function(responseData) {
                $('#contact-submit').remove();
                $('#messageResponse').fadeIn(1000);
                $('#messageResponse').html(responseData);
            },
            error: function(responseData){
                console.log('Ajax request not recieved!');
            }
        });

        // resets fields
        $('input#full-name').val("");
        $('input#email').val("");
        $('textarea#message').val("");
    })
});

我应该为此使用插件吗?我想要的只是名称、电子邮件和消息,以使用红色边框颜色进行验证。这让我很头疼,明天我将与客户会面以完成该网站。如果找不到可行的解决方案,我不会提问。

我也尝试过使用它:jQuery Form Validator Plugin

【问题讨论】:

  • 仅供参考,你可以链接东西`$('#messageResponse').fadeIn(1000).html(responseData);`
  • 使用 jQuery Validate 插件时,您的 ajax 函数会进入内置的 submitHandler 回调函数,该回调函数仅在有效表单上触发。见:docs.jquery.com/Plugins/Validation/validate#toptions
  • 所以我们可以得到正确的标签和答案,你能确认你使用的是the jQuery Validate plugin吗?谢谢。

标签: jquery ajax validation


【解决方案1】:

你的$('form').validate()指的是jQuery Validate plugin吗?

如果是这样,当 jQuery Validate 插件已经内置了 提交事件处理程序回调函数时,使用 submit 处理程序绝对没有意义,而这正是您所需要的 em> 放置你的 ajax。

As per the documentation for the Validate pluginsubmitHandler的回调函数为:

"表单有效时处理实际提交的回调。获取 形式作为唯一的论据。替换默认提交。 权利 验证后通过 Ajax 提交表单的地方。”

假设您的 ajax 函数是正确的,请尝试此代码:

$(document).ready(function () {

    $('#myform').validate({ // initialize the plugin
        // your rules and options,
        submitHandler: function (form) {
            $.ajax({
                dataType: 'html',
                type: 'post',
                url: 'mail.php',
                data: $(form).serialize(),
                success: function (responseData) {
                    $('#contact-submit').remove();
                    $('#messageResponse').fadeIn(1000);
                    $('#messageResponse').html(responseData);
                },
                error: function (responseData) {
                    console.log('Ajax request not recieved!');
                }
            });
            // resets fields
            $('input#full-name').val("");
            $('input#email').val("");
            $('textarea#message').val("");

            return false; // blocks redirect after submission via ajax
        }
    });

});

演示:http://jsfiddle.net/kUX2N/

【讨论】:

  • 你还应该使用回调:“invalidHandler: function(event, validator) { var errors = validator.numberOfInvalids(); if (errors) { // 显示消息等... } } " 来处理表单错误。
  • @Cairo,这完全没有必要,因为插件会自动显示验证错误消息。
  • 我只是想指出该处理程序的存在,但是是的,它绝对是可选的。
【解决方案2】:

beforeSubmit 是 malsup ajaxForm 插件的一个选项,而不是 jQuery ajax。仅当 validator() 返回 true 时才执行 ajax。

$('form').on('submit', function(e) {
    e.preventDefault();
    if (validator()){
        $.ajax({...});
    }
});

旁白:

您可以使用链来代替使用多行要求 jQuery 多次选择同一事物。

$('#messageResponse').fadeIn(1000).html(responseData);

同样,对多个元素做同样的事情

$('#full-name, #email, #message').val(""); 

【讨论】:

  • 当 jQuery Validate 插件已经内置了提交处理程序时,无需使用submit 处理程序。并且内置​​的submitHandler 仅在有效表单上触发。
  • @Sparky OP 没有指定 return $('form').validate(); 是什么,但如果他/她确认它是 jQuery Validate 插件,那么没有理由不更新答案。
  • 再看一遍,我同意......这并不完全清楚 .validate() 是 jQuery Validate 插件。我要回滚我的标签编辑并询问 OP。
猜你喜欢
  • 1970-01-01
  • 2012-08-23
  • 2023-03-02
  • 2023-04-02
  • 2021-11-15
  • 2017-02-18
  • 2015-03-15
  • 1970-01-01
  • 2016-09-25
相关资源
最近更新 更多