DataTables ajax.reload在保持分页时会跳转到页面底部

jac*_*lli 6 javascript ajax jquery datatables

我正在使用带有ajax源数据的jQuery DataTables.我必须每30秒保持数据最新而不刷新页面,ajax.reload()这是我需要的功能.

我把ajax.reload()一个setInterval功能放进去.

一切正常(如果你留在第1页).但是当你在第2页或第3页上冲浪时setInterval,什么时候被触发,它会让你回到第1页.

所以......在这个网址上找文档:http://datatables.net/reference/api/ajax.reload()

如果我将"false"作为第二个参数传递它保持当前的分页位置,并且在重新加载时不重置分页.答对了!

有用!但是......我有一个新问题,试图整天解决,现在我被卡住了.这就是我发布这个问题的原因.

它保持分页,但如果你不在第1页,那么每次ajax.reload()触发时,页面都会滚动(直接跳转)到底部.

它非常不友好,不可读,无法使用.我不知道为什么页面滚动到最后底部.

我发布了一个链接到我在页面上使用的简单数据表js. 的jsfiddle

        var url = table.data('url');
        var filterType = table.data('filtertype');

        var options = {
            "ajax": {
                "url": url,
                "type": "GET",
                "data": function (d) {
                    d.contact_type = filterType
                    // this variable will set by server when page load. It should be "lead", "prospect", "client". Leave empty to get all.
                }
            },
            "columns": [
                {"data": "html_is_company"},
                {"data": "name"},
                {"data": "html_type_label"},
                {"data": "created"},
                {"data": "last_update"},
                {"data": "html_actions"},
                {"data": "tsu"},
                {"data": "business_name"}
            ],
            "bLengthChange": false,
            "pageLength": 20,
            "lengthMenu": [[10, 25, 50, 100, -1], [10, 25, 50, 100, "All"]],
            "columnDefs": [
                {
                    "targets": [ 7 ],
                    "visible": false,
                    "searchable": true,
                },
                {
                    "targets": [ 6, 7 ],
                    "searchable": false,
                    "visible": false
                },
                {
                    "targets": [0, 5],
                    "searchable": false,
                    "orderable": false
                },
                {
                    "targets": [ 4 ],
                    "render": function (data, type, row) {
                        return moment(data, IN_DATE_TIME_FORMAT, 'it').fromNow();//.format(DATE_TIME_FORMAT);////;
                    }
                },
                {
                // Sort column 4 (formatted date) by column 6 (hidden seconds)
                    "orderData":[ 6 ],
                    "targets": [ 4 ]
                }],
            "order": [[4, "desc"]],
            "search": "_INPUT_",
            "language": {
                "sSearchPlaceholder": "Cerca...",
                "paginate": {
                    "previous": '<i class="icon wb-chevron-left-mini"></i>',
                    "next": '<i class="icon wb-chevron-right-mini"></i>'
                },
                //"url": "//cdn.datatables.net/plug-ins/1.10.9/i18n/Italian.json"
            }
      };

      var datatable = table.DataTable(options);
      this.setDataTable(datatable);

      setInterval(function(){
        datatable.ajax.reload(null, false);
      }, 5000);
Run Code Online (Sandbox Code Playgroud)

jac*_*lli 0

我找到了一个适合我的解决方案。

问题在于数据表分页链接的“焦点”。

当用户单击链接页面时,它会将焦点设置在该链接上,并且当ajax.reload()触发时,浏览器会显示焦点元素所在的位置。我的表格是页面的最后一个元素,因此页面滚动到底部。

当我单击第 2 页链接后单击页面的另一个区域时,我得到了它。“跳跃”的问题消失了。

因此,我解决了blur()在 DataTables 完成初始化和ajax.reload()完成时触发 a 的问题(感谢允许您定义函数的第一个参数)。

在 DataTables 选项中我添加了以下内容:

"initComplete": function(settings, json) {
                $(".paginate_button > a").on("focus", function(){
                    $(this).blur();
                });
            },
Run Code Online (Sandbox Code Playgroud)

然后,在setInterval

setInterval(function(){
          datatable.ajax.reload(function(){
              $(".paginate_button > a").on("focus", function(){
                  $(this).blur();
              });
          }, false);
      }, 30000);
Run Code Online (Sandbox Code Playgroud)

不知道这是否是“最佳解决方案”......但它有效并且可以帮助某人。