【问题标题】:jquery datatables scroll to top when pages clicked from bottom当页面从底部单击时,jquery数据表滚动到顶部
【发布时间】:2014-02-06 16:59:55
【问题描述】:

我正在使用带有底部分页的 jQuery 数据表。当从底部单击页面时,我希望它滚动到顶部,因此用户不必为较长的页面手动执行此操作。我尝试使用 dataTables_scrollBody,但它不能正常工作

这是我的代码:

oTable = $('#tTable').dataTable({
    "fnDrawCallback": function(o) {
        $('dataTables_scrollBody').scrollTop(0);
     }
});

仅当您单击第一个/最后一个(我认为这是默认行为)时,页面才会滚动到顶部,而不是每次单击页面时。

【问题讨论】:

    标签: datatables


    【解决方案1】:

    更新。最初的答案是针对 1.9.x。在 dataTables 1.10.x 中要容易得多:

    table.on('page.dt', function() {
      $('html, body').animate({
        scrollTop: $(".dataTables_wrapper").offset().top
      }, 'slow');
    });
    

    演示 -> http://jsfiddle.net/wq853akd/

    另外,如果您使用的是引导版本的数据表,您可能会注意到在使用修复时,页面实际上在滚动到顶部后会向下滚动。这是因为它根据this datatables.net thread 关注单击的按钮。您可以通过在 animate 调用后简单地关注表头来解决此问题,如下所示:

    table.on('page.dt', function() {
      $('html, body').animate({
        scrollTop: $(".dataTables_wrapper").offset().top
      }, 'slow');
    
      $('thead tr th:first-child').focus().blur();
    });
    

    原答案

    您应该定位.dataTables_wrapper 并将事件附加到.paginate_button。这里有一个漂亮的小动画:

    function paginateScroll() {
        $('html, body').animate({
           scrollTop: $(".dataTables_wrapper").offset().top
        }, 100);
        console.log('pagination button clicked'); //remove after test
        $(".paginate_button").unbind('click', paginateScroll);
        $(".paginate_button").bind('click', paginateScroll);
    }
    paginateScroll();
    

    见小提琴 -> http://jsfiddle.net/EjbEJ/

    【讨论】:

    • 谢谢,这在大多数情况下都有效,但是当您单击 page1、page2 时,它会滚动,但是对于 page3,它不会滚动,它具有随机行为。页面滚动 2-3 次点击,然后停止。
    • @user2675939,哦,是的——你完全正确!!没想到。这是因为 dataTables 重新创建了一些按钮,并在每次分页时重置事件。示例:如果您只是前进,它会顺利进行,但后退事件会被重置,因为 dataTables 必须更改这些按钮的行为(活动等)。解决方案是每次触发事件本身时,将事件取消绑定/绑定到所有 paginate_buttons。请参阅上面的更新和更新的小提琴。这很有效。
    • 谢谢!很好的答案。但是,这会滚动到表格的顶部,如果您想滚动到页面的顶部(在我的情况下,粘性标题覆盖了表格的一部分),请使用 $("html, body").animate({ scrollTop: 0 }, "slow");
    • 考虑$(".paginate_button:not(.disabled)") 以避免在单击禁用的下一个/上一个按钮时滚动。
    • 我使用了上面的代码。当我单击分页按钮时,滚动到顶部,但加载数据后,返回页面底部。为什么?
    【解决方案2】:

    从 Datatables 1.10 开始有这个页面事件 https://datatables.net/reference/event/page

    所以可以使用

    $('#example_table').on( 'page.dt', function () {
        $('html, body').animate({
            scrollTop: 0
        }, 300);
    } );
    

    演示:https://jsfiddle.net/mcyhqrdx/

    【讨论】:

    • 你的回答是最好的。
    【解决方案3】:

    这对我有用。

    $(document).ready(function() {
        var oldStart = 0;
        $('#example').dataTable({
            "bJQueryUI": true,
            "sPaginationType": "full_numbers",
            "fnDrawCallback": function (o) {
                if ( o._iDisplayStart != oldStart ) {
                    var targetOffset = $('#example').offset().top;
                    $('html,body').animate({scrollTop: targetOffset}, 500);
                    oldStart = o._iDisplayStart;
                }
            }
        });
    } );
    

    【讨论】:

    • 完美。谢谢!
    【解决方案4】:

    我也在使用数据表,Allan 的解决方案 (found here) 非常适合我。

    $(document).ready(function() {
        var oldStart = 0;
        $('#example').dataTable({
            "bJQueryUI": true,
            "sPaginationType": "full_numbers",
            "fnDrawCallback": function (o) {
            if ( o._iDisplayStart != oldStart ) {
                var targetOffset = $('#example').offset().top;
                $('html,body').animate({scrollTop: targetOffset}, 500);
                oldStart = o._iDisplayStart;
            }
          }
        });
    } );
    

    【讨论】:

      【解决方案5】:

      感谢大卫康拉德。但是当我使用他的代码时,在我点击分页按钮后,页面滚动到顶部,然后在加载数据后,滚动到底部。

      我在 StackOverFlow 和 Datatables 论坛中合并了多个帖子。

      我定义了一个全局变量:

      var isScroll = false    
      

      当点击分页按钮isScroll设置为true时:

      $(document).on('click', '.paginate_button:not(.disabled)', function () {
          isScroll = true;
      });
      

      最后:

      $(document).ready(function () {
          $('#myDataTable').DataTable({
              ...
              "fnDrawCallback": function () {
                  if (isScroll) {
                      $('html, body').animate({
                          scrollTop: $(".dataTables_wrapper").offset().top
                      }, 500);
                      isScroll = false;
                  }
              },
              ...
          });
      });
      

      感谢@0110

      【讨论】:

        【解决方案6】:

        以上答案都不适合我。这是我的解决方案。

        $("#divContainingTheDataTable").click(function(event){
            if ($(event.target).hasClass("paginate_button")) {
                $('html, body').animate({
                     scrollTop: $("#divContainingTheDataTable").offset().top
                }, 200);
            }
        });
        

        我尝试以 .paginate_button 为目标,但它似乎从未触发过。我的方法是检查包含数据表的 div,如果单击分页按钮,页面会向上滚动到容器顶部。

        【讨论】:

          【解决方案7】:

          对于那些使用引导版本的数据表的人:

          您可能会注意到,当使用上面接受的答案中的修复时,页面在滚动到顶部后实际上会向下滚动到分页控件。这是因为它根据this datatables.net thread 关注点击的分页按钮。您可以通过简单地关注动画调用后的表头来解决此问题,如下所示:

          table.on('page.dt', function() {
              $('html, body').animate({
                  scrollTop: $(".dataTables_wrapper").offset().top
              }, 'slow');
          
              $('thead tr th:first-child').focus().blur();
          });
          

          注意:链接的blur()'ing 已完成,因此您的用户在th:first-child 上看不到任何焦点样式。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-05-14
            • 1970-01-01
            • 2012-09-25
            • 1970-01-01
            • 2021-05-04
            相关资源
            最近更新 更多