【问题标题】:jQuery form: on submit validation issue + stay on the same page after submitjQuery表单:提交验证问题+提交后留在同一页面
【发布时间】:2018-06-01 14:40:51
【问题描述】:

我不是程序员,只是想修复和改进我的联系表。现在它是一个 HTML 表单(名称、电子邮件、4 个复选框作为主题、消息)。和 mail.php(更新:method="POST")。一切正常,我收到所有表单数据。

但我找到了一个脚本来验证姓名、电子邮件和消息输入,这里是:

<script>
        $(document).ready(function() {
            <!-- Real-time Validation -->
            <!--Name can't be blank-->
            $('#contact_name').on('input', function() {
                var input=$(this);
                var is_name=input.val();
                if(is_name){input.removeClass("invalid").addClass("valid");}
                else{input.removeClass("valid").addClass("invalid");}
            });

            <!--Email must be an email -->
            $('#contact_email').on('input', function() {
                var input=$(this);
                var re = /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/;
                var is_email=re.test(input.val());
                if(is_email){input.removeClass("invalid").addClass("valid");}
                else{input.removeClass("valid").addClass("invalid");}
            });

            <!--Message can't be blank -->
            $('#contact_message').keyup(function(event) {
                var input=$(this);
                var message=$(this).val();
                console.log(message);
                if(message){input.removeClass("invalid").addClass("valid");}
                else{input.removeClass("valid").addClass("invalid");}   
            });

            <!-- After Form Submitted Validation-->
            $("#button").click(function(event){
                var form_data=$(".myform").serializeArray();
                var error_free=true;
                for (var input in form_data){
                    var element=$("#contact_"+form_data[input]['name']);
                    var valid=element.hasClass("valid");
                    var error_element=$("span", element.parent());
                    if (!valid){error_element.removeClass("error").addClass("error_show"); error_free=false;}
                    else{error_element.removeClass("error_show").addClass("error");}
                }
                if (!error_free){
                    event.preventDefault(); 
                }
                else{
                    alert('No errors: Form will be submitted');
                }
            }); 
        });
</script>

最初,它在输入字段旁边显示错误消息,我决定不使用它们(HTML 中的跨度,CSS 中的“错误”和“errow_show”类),只留下输入字段突出显示(“有效”绿色/“无效的”红色 CSS 类)。

我觉得问题出在以下几行:

var error_element=$("span", element.parent());
if (!valid){error_element.removeClass("error").addClass("error_show"); error_free=false;}
else{error_element.removeClass("error_show").addClass("error");}

此脚本会突出显示空名称、无效电子邮件和空消息。但是,当我单击“发送”按钮时,脚本尽管突出显示了无效字段,但仍显示警报“没有错误。表单将被提交”并将表单发送给我。 问题似乎在最后一部分。我不知道如何从这个脚本中正确删除“span”、“error”和“error_show”(第二个 IF 之前的 3 行)。如果所有内容都有效,我希望我的表单将所有内容发送给我,如果某些内容无效,则不发送任何内容(“禁用按钮”?)。没有任何警报。如果它也可以在提交后保持在同一页面上......这将是一个理想的事情(Submit form and stay on same page?Submit a form using jQueryjQuery AJAX submit form)。任何帮助将不胜感激!:)

更新:表单 html:(现在删除为不必要的)

更新 2:好吧,伙计们,这个(奇怪?不正确?半正确?)代码我突然做出检查并正确突出显示为“有效”/“无效”所有 3 个必填字段(姓名、电子邮件、消息)并在#button_send 点击时显示正确的警报(稍后我将删除它们),甚至将带有非必需未验证复选框的整个表单发送给我:

$('#button_send').click(function(){
if ($('#contact_name').hasClass('valid') && $('#contact_email').hasClass('valid') && $('#contact_message').hasClass('valid')) {
                    alert('No errors');
                    $('.form').submit();
                } else {
                    alert('Errors');
                    return false;
                }
            });

感谢大家的每一条建议和帮助

【问题讨论】:

  • 您是否从 html 中删除了跨度?
  • 是的,我删除了跨度。以及来自 CSS 的“error”和“error_show”类。
  • 不要介意这个 html 和验证脚本中的不同名称(mail.php / process.php、#button / #button_send、#myForm / .form 等),我“同步”他们在测试之前。 ;)

标签: javascript jquery


【解决方案1】:

您想阻止按钮的默认操作,然后在您准备好时调用提交。

http://api.jquery.com/event.preventDefault/

        <!-- After Form Submitted Validation-->
        $("#button").click(function(event){
            // prevent the form from being submitted
            event.preventDefault();

            var form_data=$(".myform").serializeArray();
            var error_free=true;
            for (var input in form_data){
                var element=$("#contact_"+form_data[input]['name']);
                var valid=element.hasClass("valid");
                var error_element=$("span", element.parent());
                if (!valid){error_element.removeClass("error").addClass("error_show"); error_free=false;}
                else{error_element.removeClass("error_show").addClass("error");}
            }
            if (error_free) {
                alert('No errors: Form will be submitted');
                // submit the form if no errors
                $( ".myform" ).submit(); 
            }
            else{
                alert('Errors shown');
            }
        }); 
    });

【讨论】:

  • 感谢您的回答!抱歉,我会尝试进一步澄清:演示 CSS 中有“error”和“error_show”类,HTML 的输入字段下有“span”。我删除了它们。但它们仍在此脚本中(从 var error_element=$("span") 开始向下 3 行/行,并且(可能)导致问题。:|
  • 我插入了您的代码代替我的代码,现在当我点击“发送”按钮时,当一切有效且某些内容无效且不发送任何内容时,它会显示“无错误。将提交表单”两种情况... :|
【解决方案2】:

问题:

您看到的行为是因为您删除了代码用来验证/无效表单的控件。如果没有这些控件,由于它的编写方式,无论输入的实际有效性如何,它都会默认为有效状态。

解决方案 #1:

如果您有备份,那么简单的操作就是恢复到您触摸它之前的状态,然后将“隐藏”作为属性添加到您的跨度中。这样,您的用户就不会看到它们,但仍会为您验证输入。

解决方案 #2:

如果您不能这样做,那么您需要修改提交代码以验证剩余的控件及其类。我没有你的完整代码来测试这个,但我相信这样的东西会起作用:

<!-- After Form Submitted Validation-->
$("#button").click(function(event){
    var error_free=false;
    $.each($('.myform > input'), function() {
        error_free = $(this).hasClass('valid');
        if (!error_free){
            event.preventDefault();
            return false;
        }
    });
    if (error_free){
      alert('No errors: Form will be submitted');
    }               
});

上面的 sn-p 循环使用类 'myform' 对控件内部的任何输入进行循环,并检查它们是否具有 'valid' 类,然后根据情况设置变量 true 或 false。如果它检测到有一个无效的控件,它会退出循环并且不继续发布表单。

希望对您有所帮助。

【讨论】:

  • 谢谢!我现在将尝试这两种解决方案,看看会发生什么。然后,我会在这里再次发表评论。;)
  • 没有用,我可能弄坏了一些东西。:|我有一个奇怪的想法,因为“有效”和“无效”类是由验证的前 3 段正确添加的:你能帮我用 IF ELSE 组合删除该验证的最后一段吗,即:如果“#contact_name”有类“有效”,“#contact_email”有类“有效”,“#contact_message 有类“有效”,然后按钮只是发布我的表单,如果没有 - 什么都没有发生?我的表单让我发疯。:)
  • 解决方案 2 就是这样做的。它会检查表单中该类的所有输入。您是否收到任何控制台错误?
  • 我的最后两个想法(可能不是很好):输入字段被包裹在 div id 中以用于 CSS 样式,并且可能将“有效”和“无效”添加到输入字段的“父母”,这就是为什么最后一段中的提交验证“没有看到”它们?...另一个:有 4 个复选框(也是输入,不需要,未验证),也许它们破坏了提交时的整个验证?
  • 我不太明白你的意思。是否可以使用您的 html 更新您的问题并检查您的开发者控制台是否有任何错误?
【解决方案3】:

如果你想保存它,我建议你做后端验证。

如果在您的 HTML 表单中,方法设置为“post”,这会很神奇;

    $(document).ready(function() {
        <!-- Real-time Validation -->
        <!--Name cant be blank-->
        $("#contact_name").on('input', function() {
            var input=$(this);
            var is_name=input.val();
            if(is_name){input.removeClass("invalid").addClass("valid");}
            else{input.removeClass("valid").addClass("invalid");}
        });

        <!--Email must be an email -->
        $("#contact_email").on('input', function() {
            var input=$(this);
            var re = /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/;
            var is_email=re.test(input.val());
            if(is_email){input.removeClass("invalid").addClass("valid");}
            else{input.removeClass("valid").addClass("invalid");}
        });

        <!--Message cant be blank -->
        $("#contact_message").keyup(function(event) {
            var input=$(this);
            var message=$(this).val();
            console.log(message);
            if(message){input.removeClass("invalid").addClass("valid");}
            else{input.removeClass("valid").addClass("invalid");}   
        });

        <!-- After Form Submitted Validation-->
        $("#button").click(function(event){
            event.preventDefault();
            var form_data=$(".myform").serializeArray();
            var error_free=true;
            for (var input in form_data){
                var element = $("#contact_"+form_data[input]['name']);
                var valid = element.hasClass("valid");
                if (!valid){
                    error_free=false;
                    element.addClass("invalid");
                }                  
            }
            if (error_free){
                //Submit the  form
                $.post({url: 'mail.php', data: form_data, dataType: 'json'}).done(function(){
                    //clear the fields
                    $("[id^=contact_]").val('');
                })
            }

        }); 
    });

【讨论】:

  • 感谢您愿意提供帮助! :) 方法是 POST... :|
  • 那么AJAX调用方法也需要POST,我编辑了我的答案!
  • 我已插入您修改过的代码,它发送的所有内容都没有任何警报(很好),尽管突出显示了无效字段。所以,那些行(我在帖子更新中单独列出)不是问题......
  • 当您在其中输入一些文本时,这些字段会突出显示,在提交消失后...我编辑了我的答案来做到这一点,您希望它在提交后做什么,或者如果字段未填写?
  • 如果某些内容被高亮显示为无效,我希望该按钮不执行任何操作,如果所有内容都有效,则发送所有内容....我不明白我的表单有什么问题,为什么实时验证有效并且提交验证不会...感谢您的时间和愿意提供帮助! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多