最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - DataTables ajax.reload when keeping pagination it jumps to the bottom of the page - Stack Overflow

programmeradmin4浏览0评论

I'm using jQuery DataTables with ajax sourced data. I have to keep the data up to date every 30 seconds without refreshing the page, and ajax.reload() is the function that I need.

I put ajax.reload() inside a setInterval function.

And all works right (if you stay on page 1). But when you surf the table on page 2 or 3, when setInterval is fired, it gets you back to the page 1.

So ... Looking to docs at this url: .reload()

if I pass "false" as second parameter it holds the current paging position, and paging is not reset on reload. BINGO!

It works! BUT ... I have a new problem that a tried to solve the all day and now I'm stuck. That's why I post this question.

It keeps paging but if you are not on page 1, every time that ajax.reload() is fired, the page scrolls (jump directly) to the bottom.

It's very unfriendly, unreadable, unusable. I don't know WHY the page scrolls to the end-bottom.

I post a link to my simple datatable js that I use on my page. 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_pany"},
                {"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/plug-ins/1.10.9/i18n/Italian.json"
            }
      };

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

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

I'm using jQuery DataTables with ajax sourced data. I have to keep the data up to date every 30 seconds without refreshing the page, and ajax.reload() is the function that I need.

I put ajax.reload() inside a setInterval function.

And all works right (if you stay on page 1). But when you surf the table on page 2 or 3, when setInterval is fired, it gets you back to the page 1.

So ... Looking to docs at this url: http://datatables/reference/api/ajax.reload()

if I pass "false" as second parameter it holds the current paging position, and paging is not reset on reload. BINGO!

It works! BUT ... I have a new problem that a tried to solve the all day and now I'm stuck. That's why I post this question.

It keeps paging but if you are not on page 1, every time that ajax.reload() is fired, the page scrolls (jump directly) to the bottom.

It's very unfriendly, unreadable, unusable. I don't know WHY the page scrolls to the end-bottom.

I post a link to my simple datatable js that I use on my page. 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_pany"},
                {"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/plug-ins/1.10.9/i18n/Italian.json"
            }
      };

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

      setInterval(function(){
        datatable.ajax.reload(null, false);
      }, 5000);
Share Improve this question edited Oct 12, 2015 at 4:58 Gyrocode. 59k16 gold badges156 silver badges192 bronze badges asked Oct 11, 2015 at 19:55 jacopo.gallijacopo.galli 1712 silver badges12 bronze badges
Add a ment  | 

3 Answers 3

Reset to default 2

My solution:

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

jacopo.galli's solution was very clunky when I implemented for my table, but it's probably because my code was a mess. The idea of adding blur() is great thou.

I rewrite his code a bit:

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

The buttons on the pagination bar will be "unfocused" once the page scrolls. So your final code should look like this:

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_pany"},
            {"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/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);

I've found a solution that works for me.

The problem was the "focus" on DataTables pagination links.

When user clicks on a link page, it sets a focus on that link and when ajax.reload() is fired the browser gets you where the focused element is. My table is the last element of the page so the page scrolls to the bottom.

I got it when I clicked on another area of the page after clicked on page 2 link. The "jumping" problem was gone.

So, I solved firing a blur() when DataTables has plete its initialization and when ajax.reload() has finished (thanks to the first parameter that allows you to define a function).

In DataTables options I added this:

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

and then, in setInterval:

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

Don't know if this is the "best solution" ... but it works and could helps someone.

发布评论

评论列表(0)

  1. 暂无评论