Как определить первую, предыдущую, следующую, последнюю нажатую кнопку в полном типе подкачки в Datatable

Вы можете перейти на ОБНОВЛЕНИЕ 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 что-то вроде

<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, то на этот раз она отправит страницу как 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"
} );

Ответ 1

Должна быть возможность прочитать переменную page непосредственно перед отправкой ajax и добавить ее в запрос.

Добавьте это после кода:

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

preXhr Ajax - запускается перед выполнением запроса Ajax.

Обновление: Кажется, что события onclick запускаются после создания ajax-вызова. Чтобы обойти эту проблему, onmousedown JA ontouchstart события может быть использован вместо. Они должны быть запущены до события onclick по умолчанию

Замените все события click jQuery на mousedown и touchstart:

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

Обновление 2:

Более элегантное решение для запуска клика перед ajax-вызовом и прикрепления правильного значения page - добавить слушателя к фактическому элементу ссылки, а не к родительской кнопке.

Добавьте 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

DataTables отправляют start и length в теле запроса, я думаю, что это проще использовать, не нужно сравнивать, что это за page, и сортировать код. например, pageLength равен 50 и next или нажата page 2 после чего DataTables отправит start: 50, length: 50 тела start: 50, length: 50 и ваш запрос будет похож

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

но если вы хотите использовать эту page, в функции beforeSend() вы можете попытаться прервать 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

Через некоторое время я нашел обходной путь для такой ситуации. Может быть, это не лучший способ, но он делает свою работу.

$(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;
            } );

});