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

时间:2015-10-11 19:55:58

标签: javascript jquery ajax datatables

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

我将ajax.reload()放在setInterval函数中。

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

所以...... 在此网址查看文档:{​​{3}}

如果我将“false”作为第二个参数传递它保持当前的分页位置,并且在重新加载时不重置分页。宾果!

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

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

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

我发布了一个链接到我在页面上使用的简单数据表js。 http://datatables.net/reference/api/ajax.reload()

        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);

3 个答案:

答案 0 :(得分:1)

当我为我的表实现时,jacopo.galli的解决方案非常笨重,但可能是因为我的代码很乱。添加blur()的想法很棒。

我稍微重写了他的代码:

$(window).scroll(function(){
    $(".paginate_button > a").blur();
});

页面滚动后,分页栏上的按钮将“未聚焦”。 所以你的最终代码应如下所示:

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);

  $(window).scroll(function(){
    $(".paginate_button > a").blur();
  });

  setInterval(function(){
    datatable.ajax.reload(null, false);
  }, 5000);

答案 1 :(得分:1)

我的解决方案:

"fnDrawCallback": function(data) {
    $(".paginate_button > a").on("focus", function() {
        $(this).blur();
    });
}

答案 2 :(得分:0)

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

问题在于对DataTables分页链接的“关注”。

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

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

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

在DataTables选项中,我添加了这个:

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

然后,在setInterval

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

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