【问题标题】:Submit multiple forms not working提交多个表格不起作用
【发布时间】:2017-01-13 17:48:35
【问题描述】:

我正在尝试实现一个功能,网站管理员可以通过选中复选框然后单击 SELECTED 按钮一次删除多个内容,如下所示。

这意味着我必须一次提交多个表单,并且我在网上查找了一种解决方法,但我似乎无法让它发挥作用。单击 SELECTED 按钮后,将调用 deleteRecords()。代码如下:

function deleteRecords() {

    //--- Creating array of selected rows ---
    var arrayOfIDs;
    arrayOfIDs = $('#table-style').find('[type="checkbox"]:checked').map(function(){
            return $(this).closest('tr').find('td:nth-child(2)').text();
        }).get();   

        //-- Declaring variables ---
        var delFlagForm;   //-- form
        var action;        //-- form action
        var formID;        //-- form id
        var submitFormStr; //-- string of forms' id's 

        //--- Creating form for each row selected ---
        for (var i = 0; i < arrayOfIDs.length; i++) {
            delFlagForm = document.createElement("form"); //-- Creating form 
            action = "/delete_flag/" + arrayOfIDs[i];            //-- Creating action link
            formID = 'form' + i;                          //-- Creating id (form0, form1, etc)
            delFlagForm.setAttribute("id", formID);       //-- Assigning id to form
            delFlagForm.setAttribute("method", "post");   //-- Assigning method to form 
            delFlagForm.setAttribute("action", action);   //-- Assigning action to form 

            //--- Creating string of forms' id's
            if (i != 0) submitFormStr += ' #' + formID;
            else submitFormStr = '#' + formID; 
        }

        //--- Submiting forms at once ---
        //-- For the table shown above, submitFormStr = "#form0 #form1" 
        $(submitFormStr).submit(); // = $('#form0 #form1').submit();
}

显然上面显示的代码应该是提交 form0 和 form1 从而删除选定的记录。但是,由于某种原因,表单没有提交,什么也没有发生。

你能发现任何错误吗?

----------- 编辑 - 解决方案 -----------

为了解决这个问题,我尝试使用 AJAX 忽略请求,现在正在工作。新代码如下所示:

<script>
        function deleteRecords() {
            var arr;
            arr = $('#table-style').find('[type="checkbox"]:checked').map(function(){
                return $(this).closest('tr').find('td:nth-child(2)').text();
            }).get();   

            var delFlagForm;
            var action; 
            var formID;
            var submitFormStr;

            for (var i = 0; i < arr.length; i++) {
                delFlagForm = document.createElement("form");
                action = "/delete_flag/" + arr[i];
                formID = 'form' + i;
                delFlagForm.setAttribute("id", formID);
                delFlagForm.setAttribute("method", "post");
                delFlagForm.setAttribute("action", action);

                ignoreRequest(delFlagForm);
            }
        }

        function ignoreRequest(form) {
            var formID = $('#' + form.id);
            var action = form.action;
            $.ajax({
                type: "POST",
                url: action, //action
                data: formID,

                success: function (data) {
                    location.reload();
                },
                error: function(jqXHR, text, error){
                    console.log(error);
                }
            });
            return false;
        }
    </script>

【问题讨论】:

  • $(submitFormStr).submit(); 而不是 $('submitFormStr').submit();
  • @DanielCorzo 是的,没有注意到这个缺陷,但它无论如何都不起作用。那行代码之后什么都没有发生
  • if (i != 0) submitFormStr += ', #' + formID;

标签: javascript form-submit multiple-forms


【解决方案1】:

不能同时提交多个表单。这是合乎逻辑的,因为提交表单时的默认行为是将服务器的响应作为新页面加载。

相反,我建议您更改 HTML 以便您需要提交的所有值都在一个表单中,或者创建一个包含您要提交的值的对象,然后将它们发送到您的服务器改用 AJAX (http://api.jquery.com/jquery.ajax/)。

【讨论】:

  • 每条记录都可以通过提交一个表单来单独删除,其中 action="/delete_flag/flagId' 所以我认为没有办法将所有值组合在一个中。另外注意,你能提供一个简单的例子来说明如何创建一个包含我要提交的值的对象吗?
  • 从逻辑上讲,您所做的只是告诉您的服务器要删除哪些内容 - 如果有技术限制迫使您为每个删除请求发出一个 HTTP 请求,那么您要么需要更改服务器代码,所以它可以处理删除多个项目的请求,或使用 AJAX 提交多个请求。我认为,如果您查看 jQuery 的 AJAX 方法的文档,您将了解如何创建数据对象并提交它。真的很简单。
  • 谢谢伙计!我在网上查了一个用法,我想出了一个解决方案。我会在 OP 上发布。
  • @AmericanUmlaut 你好!我面临着类似的问题。虽然你刚才说不可能一次提交多个表单,假设我提交一个包含多个对象信息的大表单(一个表格,每一行都有一个对象的信息),是否可以区分这些中的每一个在将它们保存到数据库时?我感谢你的时间。 stackoverflow.com/questions/47067465/…
  • @LuisAlbertoDelgadodelaFlo 这是一个好问题,我建议您将其作为新问题而不是评论发布,以便其他人可以更轻松地找到它并从答案中受益!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-28
  • 2016-04-06
相关资源
最近更新 更多