【问题标题】:DataTables ajax.reload when keeping pagination it jumps to the bottom of the pageDataTables ajax.reload 在保持分页时跳转到页面底部
【发布时间】:2015-10-11 19:55:57
【问题描述】:

我正在使用带有 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);

【问题讨论】:

    标签: javascript jquery ajax datatables


    【解决方案1】:

    我的解决方案:

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

    【讨论】:

      【解决方案2】:

      当我为我的表实现时,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);
      

      【讨论】:

        【解决方案3】:

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

        问题在于 DataTables 分页链接上的“焦点”。

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

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

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

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

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

        【讨论】:

          猜你喜欢
          • 2017-08-11
          • 2022-11-23
          • 2017-02-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-03-12
          相关资源
          最近更新 更多