复选框仅适用于第一页 - 数据表、导轨

Posted

技术标签:

【中文标题】复选框仅适用于第一页 - 数据表、导轨【英文标题】:Checkboxes only work on first page - Datatables, rails 【发布时间】:2016-07-13 01:00:08 【问题描述】:

Senario:所以基本上我使用的是 DataTables,并且在它的第一列上有复选框。我的数据表有多个页面(分页)。

问题:当我在一个页面(可能是任何页面)上选中几个框时,并且还在其他页面上选中了几个框。

只有当我在当前页面时才会保存结果

我对数据表/javascript 很陌生,无法真正弄清楚如何解决这个问题。

$('#formDataTable').DataTable(
         responsive: true,
         autoWidth: true,
         "bFilter": true,
         "bRetrieve": true,
         "bInfo": true,
         "sPageFirst": false,
         "sPageLast": false,
);

我已阅读这些 SO 页面。 Checkboxes will only work on current pagination page in jQuery datatables 该问题的链接目前已失效-> Pagination with selected check boxes. Checkboxes will only work on current pagination page. jQuery datatables

【问题讨论】:

【参考方案1】:

原因

出于性能原因,jQuery DataTables 从 DOM 中删除不可见的行,这就是为什么当您提交表单时只有可见的复选框被提交。

解决方案

您可能需要在提交表单时将那些已检查且不存在于 DOM 中的 <input type="checkbox"> 转换为 <input type="hidden">

例如,提交带有所有复选框值的表单:

var table = $('#example').DataTable();

$("form").on('submit', function(e)
   var $form = $(this);

   // Iterate over all checkboxes in the table
   table.$('input[type="checkbox"]').each(function()
      // If checkbox doesn't exist in DOM
      if(!$.contains(document, this))
         // If checkbox is checked
         if(this.checked)
            // Create a hidden element 
            $form.append(
               $('<input>')
                  .attr('type', 'hidden')
                  .attr('name', this.name)
                  .val(this.value)
            );
         
       
   );          
);

如果您通过 Ajax 提交表单,那就更简单了。

例如,通过 Ajax 提交带有所有复选框值的表单:

var table = $('#example').DataTable();

$("#btn-submit").on('click', function(e)
   e.preventDefault();

   $.ajax(
      url: "/path/to/your/script.php",
      data: table.$('input[type="checkbox"]').serialize();
   ).done(function(data)
      console.log("Response", data);
   );
);

演示

请参阅我们的文章jQuery DataTables: How to submit all pages form data 进行演示。

【讨论】:

谢谢!现在一切似乎都正常了 :) 我将查看 gyrocode.com/articles 中有关复选框的信息。【参考方案2】:

如果您使用的是 Rails,那么使用 Form Helpers 怎么样?

如果您要创建新记录,一个简单的例子是:

<%= form_for(:table_name, :action => 'create') do |f| %>

<table summary="Form data table">
  <tr>
    <th><%= f.label(:responsive) %></th>
    <td><%= f.check_box(:responsive) %></td>
  </tr>
  <tr>
    <th><%= f.label(:auto_width) %></th>
    <td><%= f.check_box(:auto_width) %></td>
  </tr>
</table>

<%= submit_tag("Create Page") %>

<% end %>

即使您有多个页面,如果您将所有表单助手保存在 form_for 方法中,所有内容都应该保存到您的数据库中。

【讨论】:

Datatables 是一个 jquery 插件,根据当前选择的页面创建和销毁行。 html 在这里几乎无关紧要 - Datatables 将对其进行大量修改。 嗯……我明白了……我对这种 Datatables 方法不是很熟悉。你不认为传统的表单助手会成功吗? :)【参考方案3】:

在尝试了很多方法后,我终于找到了解决这个问题的甜蜜而简单的方法!!!! 这里 #contect_form 是表单 ID ...您必须将数据表放在表单中,因为在页面加载时您可以初始化数据表行

     var table;
                $(document).ready(function () 
                    table = $('#table_id').DataTable(
                        scrollY: "412px",
                        scrollX: true,
                        AutoWidth: false,
                        scrollCollapse: false,
                        paging: true,

                    );
                    $('#contact_form').on('submit', function (e) 
                        var form = this;

                        // Encode a set of form elements from all pages as an array of names and values
                        var params = table.$('input,select,textarea').serializeArray();

                        // Iterate over all form elements
                        $.each(params, function () 
                            // If element doesn't exist in DOM
                            if (!$.contains(document, form[this.name])) 
                                // Create a hidden element
                                $(form).append(
                                   $('<input>')
                                      .attr('type', 'hidden')
                                      .attr('name', this.name)
                                      .val(this.value)
                                );
                            
                        );
                    );


                );

【讨论】:

以上是关于复选框仅适用于第一页 - 数据表、导轨的主要内容,如果未能解决你的问题,请参考以下文章

可点击的行仅适用于数据表的第一页

数据表工具提示在第二页中不起作用。仅适用于第一页

为啥单击事件处理程序仅适用于第一页

显示/隐藏幻灯片的标题仅适用于第一张幻灯片

我的 select2 jquery 仅适用于第一种形式

Vuetify 的自动对焦仅适用于第一个模态打开