代码之家  ›  专栏  ›  技术社区  ›  Saroj Shrestha

如何在数据表的完整pagingtype中检测单击的First、Previous、Next和Last按钮

  •  12
  • Saroj Shrestha  · 技术社区  · 6 年前

    您可以直接转到更新2

    我有一张很大的桌子,所以提取偏移量,限制不会起作用,因为它需要很长时间。因此,我想转到键搜索分页方法,这样每次单击我的查询都会有所不同,如下所述:

    /*First*/
    select top (1000) id, name from table_name order by id desc;
    /*returns data from 56679923-56678924*/
    
    /*Next*/
    select top (1000) id,name from table_name where id < @previous_lowest_id order by id desc;
    /*returns data from 56678923-56677924*/
    
    /*Previous*/
    SELECT * FROM 
         (select top (1000) id,name 
           from table_name 
           where id > @previous_highest_id 
           order by id asc
         ) as myAlias 
    ORDER BY id desc;
    /*returns data from 56679923-56678924*/
    
    /*Last*/
    SELECT * FROM 
        (select top (1000) id,name
          from table_name
          order by id asc
        ) as myAlias 
    ORDER BY id desc;
    

    所以,我需要根据单击的按钮运行不同的查询。因此,提出了检测不同点击率的必要性。如果有什么内置的方法,那就太好了。否则,任何其他黑客处理这种情况也受到欢迎。

    此外,我可以在每个LI上看到不同的ID,比如

    <li class="paginate_button page-item next" id="DataTable_next"> 
        <a href="#" aria-controls="coloradoDataTable" data-dt-idx="2" tabindex="0" class="page-link">Next</a>
    </li>
    

    所以,我也试过做以下的工作,但没有成功

    $('#DataTable_last>a').click(function() { alert('zz'); });
    

    我怎样才能摆脱这个问题呢?我正在使用可以从中引用的服务器端数据表 https://datatables.net/

    更新:

    现在,我可以检测到单击,但是我无法将此新数据发送到服务器。万一,如果我设置 var page = 'first'; . 此发送页面为“每个请求的第一个”。

    var page;
    var dataTable = $('#DataTable').DataTable( {
    
                    drawCallback: function(){
                        $('.paginate_button.first:not(.disabled)', this.api().table().container())          
                        .on('click', function(){
                            page = 'first';
                            console.log(page);
                        });
                        $('.paginate_button.previous:not(.disabled)', this.api().table().container())          
                        .on('click', function(){
                            page = 'previous';
                            console.log(page);
                        });
                        $('.paginate_button.next:not(.disabled)', this.api().table().container())          
                        .on('click', function(){
                            page = 'next';
                            console.log(page);
                        });
                        $('.paginate_button.last:not(.disabled)', this.api().table().container())          
                        .on('click', function(){
                            page = 'last';
                            console.log(page);
                        });       
                    },
        "ajax": {
                        "url":base_path +'/other_path',
                        "dataType":"json",
                        "type":"POST",
                        "data":{"_token":csrf_token,"page":page}
                    }
            ......
    });
    

    这些 console.log 单击每个按钮后显示正确的页面,但此时该值不与其他参数一起发送。

    更新:2

    目前,我的代码如下所示。它正在发送过去的页面状态。这意味着如果我第一次点击 next 它不会发送页面,但如果我现在单击 previous ,那么这次它将以 下一个 而不是页面 以前的 . 这看起来像是先发送Ajax请求,然后更新页面值。现在,我只需要解决这个问题,这意味着在发送Ajax之前需要首先更新页面值。

    var page;
    
    var dataTable = $('#masterDataTable').on('preXhr.dt', function (e, settings, data) {
        data.page = page;
    }).DataTable( {
    
        drawCallback: function(){
            $('.paginate_button.first:not(.disabled)', this.api().table().container())          
            .on('click', function(){
                page = 'first';
                console.log(page);
            });
            $('.paginate_button.previous:not(.disabled)', this.api().table().container())          
            .on('click', function(){
                page = 'previous';
                console.log(page);
            });
            $('.paginate_button.next:not(.disabled)', this.api().table().container())          
            .on('click', function(){
                page = 'next';
                console.log(page);
            });
            $('.paginate_button.last:not(.disabled)', this.api().table().container())          
            .on('click', function(){
                page = 'last';
                console.log(page);
            });       
        },
    
        "processing": true,
        "serverSide": true,
        "searching": false,
        "ajax": {
            "url":base_path +'/other_path',
            "dataType":"json",
            "type":"POST",
            "data":{"_token":csrf_token,"page":page}
        },
        "columns":[
        {"data":"name"},
        {"data":"address"},
        {"data":"city"},
        {"data":"action","searchable":false,"orderable":false}
        ],
        "aLengthMenu": [50, 100, 250, 500],
        "pageLength": 50,
    
        "ordering": false,
        "pagingType": "full"
    } );
    
    3 回复  |  直到 6 年前
        1
  •  0
  •   lofihelsinki    6 年前

    应该可以阅读 page 变量,在发送Ajax之前,将其添加到请求中。

    在编码后添加:

    $('#DataTable').on('preXhr.dt', function (e, settings, data) {
        data.page = page;
    })
    

    preXhr Ajax event - fired before an Ajax request is made.

    更新 : onclick 事件似乎在构造Ajax调用之后运行。为了解决这个问题, onmousedown 青年成就组织 ontouchstart 可以改用事件。它们应该在默认值之前运行 点击 事件

    将所有Click JQuery事件替换为MouseDown和TouchStart:

    $('.paginate_button.last:not(.disabled)', this.api().table().container())          
    .on('mousedown touchstart', function(){
        page = 'last';
        console.log(page);
    });
    

    更新2:

    一个更优雅的解决方案,让点击在Ajax调用之前运行,并在右侧附加 值是将侦听器添加到实际的链接元素,而不是父按钮。

    添加 a 对于选择器: .paginate_button.first:not(.disabled) a 这将使它起作用。

    $('.paginate_button.first:not(.disabled) a', this.api().table().container())          
            .on('click', function(){
                page = 'first';
                console.log(page);
            });
            $('.paginate_button.previous:not(.disabled) a', this.api().table().container())          
            .on('click', function(){
                page = 'previous';
                console.log(page);
            });
            $('.paginate_button.next:not(.disabled) a', this.api().table().container())          
            .on('click', function(){
                page = 'next';
                console.log(page);
            });
            $('.paginate_button.last:not(.disabled) a', this.api().table().container())          
            .on('click', function(){
                page = 'last';
                console.log(page);
            });
    
        2
  •  0
  •   cieunteung    6 年前

    数据发送 start length 在请求主体中,我认为更容易使用这个,不需要比较什么 page 和分拣机代码。例如 pageLength 是50和 next page 2 单击后,数据表将发送正文 start: 50, length: 50 你的问题是

    SELECT id, name
    FROM table_name
    ORDER BY id DESC
    LIMIT @length OFFSET @start /* LIMIT 50 OFFSET 50 */
    

    但是如果你想用的话 beforeSend() 函数如果按钮的Click事件尚未触发,则可以尝试中止Ajax请求。

    var page;
    var navClicked = false;
    // do not abort ajax for first ajax request or initialization.
    var firstLoad = true;
    $.ajaxSetup({
      beforeSend: function(jqXHR, settings) {
        // if button click event not yet fired abort ajax
        if (!firstLoad && navClicked == false) {
          jqXHR.abort();
        }
      },
      complete: function() {
        firstLoad = false;
        navClicked = false;
      }
    });
    

    然后替换 drawCallback: function(){...} 具有

    drawCallback: function() {
      $('.paginate_button').on('click', function(e) {
        page = this.textContent.toLowerCase(); // first, previous, next, last
        navClicked = true;
        // 'page' already defined click again this button and do ajax request
        this.click()
      })
    },
    
        3
  •  0
  •   Saroj Shrestha    6 年前

    过了一段时间,我找到了解决这种情况的方法。也许这不是最好的办法,但它确实做到了。

    $(function(){
    
                var page;
                var HighestID,LowestID;
    
                    document.addEventListener("click", function(e) {
                        if($(e.target).parent().hasClass('previous')){
                            page = 'previous';
                        }else if($(e.target).parent().hasClass('next')){
                            page = 'next';
                        }else if($(e.target).parent().hasClass('last')){
                            page = 'last';
                        }else{
                            page = 'first';
                        }
    
                    }, true);
    
    
                var dataTable = $('#Datatable').on('preXhr.dt', function (e, settings, data) {
                    data.page = page;
                    data.HighestID = HighestID;
                    data.LowestID = LowestID;
                }).DataTable( {
    
                    "processing": true,
                    "serverSide": true,
                    "searching": false,
                    "ajax": {
                        "url":base_path +'/admin/other_path',
                        "dataType":"json",
                        "type":"POST",
                        "data":{"_token":csrf_token}
                    },
                    "columns":[
                    {"data":"name_voter"},
                    {"data":"home_street_address_1"},
                    {"data":"home_address_city"},
                    {"data":"action","searchable":false,"orderable":false}
                    ],
                    "aLengthMenu": [50, 100, 250, 500],
                    "pageLength": 50,
    
                    "ordering": false,
                    "pagingType": "full"
                } );
    
                dataTable.on( 'xhr', function () {
                    var json = dataTable.ajax.json();
                    HighestID = json.HighestID;
                    LowestID = json.LowestID;
                } );
    
    });