如何在没有单独的点击事件处理程序的情况下处理多个表单提交

How to handle multiple form submits without individual click event handlers

我的 mvc 应用程序中有两个表单,所有表单都是动态显示的,我如何绑定 ajax 对那些表单提交按钮的调用而不丢失验证。 以下是我的代码。

 //form1
        <form id="form1" action="" method="post" enctype="multipart/form-data">
                                                    <input type="text" name="fname1" id="fname1" placeholder="Full Name">
                                                                                                    <input type="email" name="femail1" id="femail1" placeholder="your@email.com">
                                                    <input id="send1" type="button" >
                                                </form>

    //form2

    <form id="form1" action="" method="post" enctype="multipart/form-data">
                                                <input type="text" name="fname1" id="fname1" placeholder="Full Name">

                                                <input type="email" name="femail1" id="femail1" placeholder="your@email.com">
                                                <input id="button2" type="button">
                                            </form>



//Jquery code

    $('#button1').click(function(e){
            e.preventDefault();

            var fname           =$('#fname1').val();
            var femail          =$('#femail1').val();
            var fphone          =$('#fphone1').val();

            var error           =0;

            $('#fname1,#femail1,#fphone1').css('border', '');

            if(fname=='Full Name' || fname==''){
                $('#fname1') .css('border','solid 1px red');
                error=1;

            }

            var emailPattern = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/;
            if(femail == 'your@email.com' || !emailPattern.test(femail)) {           
                $('#femail1').css('border','solid 1px red');                 
                error = 1;
            }


            if(fphone=='____-_____' || fphone==''){
                $('#fphone1').css('border','solid 1px red');
                error=1;

            }   



          //do ajax call


            return false;



        });

//jquery code for button 2

    $('#button2').click(function(e){
            e.preventDefault();

            var fname           =$('#fname1').val();
            var femail          =$('#femail1').val();
            var fphone          =$('#fphone1').val();

            var error           =0;

            $('#fname1,#femail1,#fphone1').css('border', '');

            if(fname=='Full Name' || fname==''){
                $('#fname1') .css('border','solid 1px red');
                error=1;

            }

            var emailPattern = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/;
            if(femail == 'your@email.com' || !emailPattern.test(femail)) {           
                $('#femail1').css('border','solid 1px red');                 
                error = 1;
            }


            if(fphone=='____-_____' || fphone==''){
                $('#fphone1').css('border','solid 1px red');
                error=1;

            }   



          //do ajax call


            return false;



        });

就像我说的,这些表单是动态加载的,我需要像上面那样执行 ajax 调用。

如果您要在每个按钮点击的点击处理程序中执行的代码相同,您可以考虑使用更通用的 jQuery 选择器来连接您的表单 submit 事件。目前您是使用 Id 作为 jQuery 选择器。由于 Id 在文档中应该是唯一的,因此它仅适用于单个元素。这意味着您需要连接多个点击处理程序,每个 id 一个(这就是您现在正在做的)

向您的所有表单添加一个 html 5 数据属性,并使用它来连接您的表单 submit 事件。

我在这里向表单添加一个 data-ajax-form 数据属性。

<form id="form1" action="someUrl" method="post" data-ajax-form>

</form>

现在,在连接 ajax 表单提交行为时,为您的 jQuery 选择器使用这个新的数据属性。

$(function() {

    $(document).on("submit","[data-ajax-form]",function(e) {

        e.preventDefault();

        var $form=$(this);
        alert("Submitting the form");
        var data = $form.serialize();
        alert("serialized form : "+data);

        //Your other common code

        $.post($form.attr("action"),data).done(function(res) {

            //do something with the response
            console.log(res);
        });
    });

});

使用 jQuery on 连接事件将使其与 DOM 当前和未来的元素一起工作。所以你需要将它用于动态注入的元素。我在这里使用 $(document)on 方法。您可以在那里使用更具体的选择器。例如,您可以使用容器 div id(您的表单动态添加到其中)

$("#yourFormContainerDiv").on("submit","[data-ajax-form]",function(e) {

});

假设 yourFormContainerDiv 是一个 div 的 ID,您的页面有 ,并且您的动态表单将添加到其中。

您也可以考虑使用像 jQuery validate. The mvc helper methods render the input element markups with the relevant attribute used by this library (based on the view model property type/data annotations). Take a look at Adding validation

这样的客户端验证库

您正在寻找 JQuery 中称为事件委派的功能。通常,您将事件连接到元素,但是当您拥有动态元素时,这就会成为一个问题。

在这种情况下,您可以 "delegate" 将您的事件发送给父级并让它处理其子内容。例如,下面的代码有 2 个按钮,然后动态添加了第 3 个按钮。

我所做的是将事件连接到父 div,然后使用下面的语法进行事件委托。您可以在此处了解更多信息 https://learn.jquery.com/events/event-delegation/

    <script>
    $(document).ready(function () {
        // event delegation
        $(".parent").on("click","button", function () {
            alert("Post form");
        })

        // dynamically add 3rd button
        $(".parent").append("<button>Button 3</button>");
    })
</script>

<div class="parent">
    <button>Button 1</button>
    <button>Button 2</button>
</div>