将多个动态表单存储到对象中并使用jquery post方法发布和上传

Posted

技术标签:

【中文标题】将多个动态表单存储到对象中并使用jquery post方法发布和上传【英文标题】:Store multiple dynamic form into object and post and upload using jquery post method 【发布时间】:2017-06-28 23:39:33 【问题描述】:

我有一个动态表单,当用户按下选项卡或转到下一个选项卡时,用户在表单 1 中输入数字时会创建一个动态表单,它将在表单 1 下方创建一个动态表单,用户可以输入数据和日期并附加文件.

每次用户在表单 1 中输入一个数字并按 Tab 键时,表单 1 下方都会有一个动态表单 2,用户可以输入数据,并且应该保持直到用户填写表单 1 的所有字段及其表单 2 附件数据.

我已经设法使用 jquery 创建了它的动态过程,但我面临的问题是我无法保存此动态表单数据,正如您所见,我尝试获取数组数据,但当我尝试获取数组数据时它们为空使用控制台查看检查。

我想以这种方式保存这些数据:form 1 : textfield 1 -> hasmany -> form 2 (textfield, date, file) 然后将此数据发布到 php 文件以保存和上传文件。

任何想法或解决方案如何做到这一点?

jQuery 部分:

$(function () 

    $('#general').change(function () 
        extracted('general', 'general : ');
    );

    $('#in_uni_level').change(function () 
        extracted('in_uni_level', 'in uni level : ');
    );

    $('#in_section_level').change(function () 
        extracted('in_section_level', 'in section level : ');
    );

    $('#in_country_level').change(function () 
        extracted('in_country_level', 'in country level :‌ ');
    );

    function extracted(selection, Gtitle) 

        var brief = [];
        var contributor = [];
        var datepick = [];
        var file = [];
        $('#dynamic_table').find('[name=brief]').each(function () 
            brief.push(this.value);
        );
        $('#dynamic_table').find('[name=contributor]').each(function () 
            contributor.push(this.value);
        );
        $('#dynamic_table').find('[name=datepick]').each(function () 
            datepick.push(this.value);
        );
        $('#dynamic_table').find('[name=file]').each(function () 
            file.push(this.value);
        );
        console.log(brief, contributor, datepick, file);
        //                $("#dynamic_table").empty();//clear dynamic table data each time focus change

        console.log($('#' + selection).val());

        var count = $('#' + selection).val();
        if (count > 0) 

            var nextStep = $(document.createElement('tbody'));

            var Dynamic_form_header =
                '<tr>' +
                '<th>' + Gtitle + '</th>' +
                '<th></th>' +
                '<th></th>' +
                '<th></th>' +
                '</tr>' +
                '<tr>' +
                '<th>Short Brief</th>' +
                '<th>Contributers count</th>' +
                '<th>date</th>' +
                '<th>Related doc</th>' +
                '</tr>';

            var Dynamic_form_body = '';
            for (var i = 0; i < count; i++) 
                Dynamic_form_body +=
                    '<tr>' +
                    '<td><input type="text" name="brief[]" id="brief" ' +
                    '</td>' +
                    '<td><input type="text" name="contributor[]" id="contributor"' +
                    '</td>' +
                    '<td><input type="text" name="datepick[]" class="datepicker"' +
                    '</td>' +
                    '<td><input type="file" name="file[]" id="doc"' +
                    '</td>' +
                    '</tr>';
            
            nextStep.html(Dynamic_form_header + Dynamic_form_body);

            nextStep.appendTo("#dynamic_table");
        

        // default
        $('#dynamic_table').live('click', function () 
            $('.datepicker').datepicker();

        );
    



        $("#Submit_form").click(function () 

            $.post("Requests/spc.php", //Required URL of the page on server
                   // Data Sending With Request To Server
                    Save_Form: true,
                    brief: brief,
                    contributor: contributor,
                    datepick: datepick,
                    file: file,
                ,
                function (response)   // Required Callback Function
                    //======== disable loading for onclick event ==========
                    $("#loading_gif").hide();
                    $("#add_user_btn").removeAttr('disabled');
                    //======== disable loading for onclick event ==========

                    //$("#Response").text(response);
                    if (response == "save") 
                        $("#Response").text("ارسال دعوتنامه  با موفقیت صورت گرفت.").css(color: 'green');
                    
                );
        );
);

HTML 部分:

<form id="form" method="post" action=""
      enctype="multipart/form-data">

    <table class='styled-table' cellspacing='0' 
           border='1'>
        <tr>
            <td>
                <label for="general">general</label>
                <div class="cleaner h10"></div>

                <label for="in_uni_level">in uni level</label>
                <div class="cleaner h10"></div>

                <label for="in_section_level">in section level</label>
                <div class="cleaner h10"></div>

                <label for="in_country_level">in country level</label>
                <div class="cleaner h10"></div>
            </td>
            <td>
                <input type="text" id="general" 
                       name="general"/>
                <div class="cleaner h10"></div>

                <input type="text" id="in_uni_level"
                       name="in_uni_level"/>
                <div class="cleaner h10"></div>

                <input type="text" id="in_section_level"
                       name="in_section_level"/>
                <div class="cleaner h10"></div>

                <input type="text" id="in_country_level"
                       name="in_country_level"/>
                <div class="cleaner h10"></div>
            </td>
        </tr>
    </table>

    <div class="cleaner h30"></div>

    <table class='styled-table' id="dynamic_table"
           cellspacing='0'  border='1'>

    </table>

</form>

<button id="Submit_form">Submit</button>

快照:

【问题讨论】:

【参考方案1】:

您遇到的问题是您没有在第二个表单上为每个字段调用 change 函数,因此它可以捕获数据以将其推送到数组中。我稍微更改了您的代码,但似乎正在做您想做的事情。我还加了一个小提琴。

此外,您可能不想每次都在 change 上使用 push 值,因为如果用户返回编辑字段会怎样。它会将其添加到数组中而不是替换它。

您还必须在这里处理一些您没有实现的多维数组,因为如果用户在第一种形式中选择超过 1 个,您将必须存储 x 数量的数组以与原始请求相关联.

$(function () 

  var brief = [];
  var contributor = [];
  var datepick = [];
  var file = [];

    $('#general').change(function () 
        extracted('general', 'general : ');
    );

    $('#in_uni_level').change(function () 
        extracted('in_uni_level', 'in uni level : ');
    );

    $('#in_section_level').change(function () 
        extracted('in_section_level', 'in section level : ');
    );

    $('#in_country_level').change(function () 
        extracted('in_country_level', 'in country level : ');
    );

    $(document).on('change', '#brief', function () 
        brief.push(this.value);
    );

    $(document).on('change', '#contributor', function () 
        contributor.push(this.value);
    );

    $(document).on('change', '#datepick', function () 
        datepick.push(this.value);
    );

    $(document).on('change', '#file', function () 
        file.push(this.value);
    );

    function extracted(selection, Gtitle) 

        $('#dynamic_table').find('[name=brief]').each(function () 
            brief.push(this.value);
        );
        $('#dynamic_table').find('[name=contributor]').each(function () 
            contributor.push(this.value);
        );
        $('#dynamic_table').find('[name=datepick]').each(function () 
            datepick.push(this.value);
        );
        $('#dynamic_table').find('[name=file]').each(function () 
            file.push(this.value);
        );
        console.log(brief, contributor, datepick, file);
        //                $("#dynamic_table").empty();//clear dynamic table data each time focus change

        console.log($('#' + selection).val());

        var count = $('#' + selection).val();
        if (count > 0) 

            var nextStep = $(document.createElement('tbody'));

            var Dynamic_form_header =
                '<tr>' +
                '<th>' + Gtitle + '</th>' +
                '<th></th>' +
                '<th></th>' +
                '<th></th>' +
                '</tr>' +
                '<tr>' +
                '<th>Short Brief</th>' +
                '<th>Contributers count</th>' +
                '<th>date</th>' +
                '<th>Related doc</th>' +
                '</tr>';

            var Dynamic_form_body = '';
            for (var i = 0; i < count; i++) 
                Dynamic_form_body +=
                    '<tr>' +
                    '<td><input type="text" name="brief[]" id="brief" ' +
                    '</td>' +
                    '<td><input type="text" name="contributor[]" id="contributor"' +
                    '</td>' +
                    '<td><input type="text" name="datepick[]" class="datepicker"' +
                    '</td>' +
                    '<td><input type="file" name="file[]" id="doc"' +
                    '</td>' +
                    '</tr>';
            
            nextStep.html(Dynamic_form_header + Dynamic_form_body);

            nextStep.appendTo("#dynamic_table");
        

        // default
        $('#dynamic_table').on('click', function () 
            $('.datepicker').datepicker();
        );
    
);

https://jsfiddle.net/eqrbsgs8/

【讨论】:

感谢回复 我想在提交按钮上获取数据,但我还没有放入表单,所以我认为多维数组的问题会消失 完成您的代码并编辑问题,以便我们看到所有内容 你添加到我的代码中的部分出现错误:Uncaught TypeError: $(...).on is not a function

以上是关于将多个动态表单存储到对象中并使用jquery post方法发布和上传的主要内容,如果未能解决你的问题,请参考以下文章

Angular with Jquery - 如何将 jQuery 包含到工厂中并在多个控制器之间使用/共享该工厂?

如何使用jquery重置表单中的多个选择框?

Jquery -> php -> mysql 和动态表单字段

WPF:将列表动态绑定到(某些)对象的属性

将 JQuery Datepicker 动态添加到表单元素

如何使用 jquery 和 Ajax 将多个文件字段保存到 django