Вы сказали:
С нажатием на <button id="loadMoreBtn" class="btn btn-secondary">Загрузить ещё</button> появляются дубли один раз записей в таблице Которые находятся на первой странице
Обьяснить подробно почему это происходит и как исправить чтобы дублей не было и появлялись записи верно без дублей
Если что то не хватает каких то частей кода и не понятно что то задай вопросы
Часть структуры таблицы html
<tr class="odd"><td>Предложение №6000502665<br><i class="text-muted">автор:</i> <span class="badge bg-light-subtle border border-light-subtle text-light-emphasis rounded-pill">Workflow System</span></td><td>WF-BATCH@SAP3.EVRAZ.COM</td><td class="sorting_1">15.11.2025 12:06:36</td><td><span class="badge bg-secondary" style="background-color:#fb8b31 !important;">не прочитано</span></td><td><button type="button" class="btn btn-light" data-bs-toggle="modal" data-bs-target="#exampleModalScrollable" data-id="36051" data-stkp="all">открыть</button></td></tr>
<tr class="even"><td>Ну всё, началось 😏<br><i class="text-muted">автор:</i> <span class="badge bg-light-subtle border border-light-subtle text-light-emphasis rounded-pill">Ozon</span></td><td>news@news.ozon.ru</td><td class="sorting_1">15.11.2025 11:34:02</td><td><span class="badge bg-secondary" style="background-color:#fb8b31 !important;">не прочитано</span></td><td><button type="button" class="btn btn-light" data-bs-toggle="modal" data-bs-target="#exampleModalScrollable" data-id="36049" data-stkp="all">открыть</button></td></tr>
Часть кода для таблицы js
let table1;
let scrollTimeout; // Переменная для хранения идентификатора таймаута
function startScrollTimeout() {
const scrollBody = $(this);
const nearBottom = scrollBody.scrollTop() + scrollBody.innerHeight() >= scrollBody[0].scrollHeight - 25;
if (nearBottom && !scrollTimeout) {
// Запускаем таймер на 11 секунд
scrollTimeout = setTimeout(() => {
if ($('.modal:visible').length === 0) {
loadMoreData();
}
scrollTimeout = null; // Сброс таймера
}, 11000);
} else {
// Если пользователь прокрутил вверх, отменяем таймаут
clearTimeout(scrollTimeout);
}
}
$(document).ready(function(){
$("form").submit(function(e){
e.preventDefault();
console.log(e);
console.log(e + ' form');
});
//const savedLength = localStorage.getItem("table1_length") || 10;
table1 = $('#table1').DataTable({//var table1 =
ajax: {
method: 'POST',
url: window.location.href,//'ajax/inbox_data.php',
data: function(d) {
d.limit = limit;
d.offset = offset;
d.start = getUrlParameter('start') || '';
d.end = getUrlParameter('end') || '';
d.stkp = getUrlParameter('stkp') || 'all';
},
dataSrc: 'data'
},
//data: [],
columns: [
{ data: 'subject' },
{ data: 'email' },
{ data: 'date_create',
render: function(data, type, row) {
if (type === 'sort' || type === 'type') {
// Преобразуем DD.MM.YYYY HH:mm:ss в YYYYMMDDHHmmss для сортировки
let parts = data.split(/[\s.:]/); // разбиваем по пробелу, точке и двоеточию
if (parts.length >= 6) {
return parts[2] + parts[1] + parts[0] + parts[3] + parts[4] + parts[5]; // YYYYMMDDHHmmss
}
return data;
}
return data; // для отображения оставляем оригинал
}
},
{ data: 'status' },
{ data: 'action', searchable: false, orderable: false }
],
'pageLength': parseInt(savedLength),//parseInt(localStorage.getItem("table1_length") || 10),
'responsive': true,
//"paging" : false,
//"searching" : false,
//"ordering" : true,
scrollCollapse: true,
scrollY: '680px',
"order": [[2,'desc']],
//"columnDefs": [{"type":"date","targets"}],
//"columnDefs" : [{"targets":3, "type":"date-eu"}],
"columnDefs": [ {"targets": 4, "searchable": false, "orderable": false, "visible": true} ],
//"bInfo": true,
processing: true,
"language": {"url": "/ru/datatable/Russian.json" } // "url": "//cdn.datatables.net/plug-ins/9dcbecd42ad/i18n/Russian.json"}
});
function loadMoreData() {
if (loading || allLoaded) return;
loading = true;
//table1.processing(true);
$('#table1_processing').show();
$('#loadMoreBtn').prop('disabled', true).text('Загрузка...');
$.ajax({
url: window.location.href,//'ajax/inbox_data.php',
method: 'POST',
dataType: 'json',
data: {
limit: limit,
offset: offset,
start: getUrlParameter('start') || '',
end: getUrlParameter('end') || '',
stkp: getUrlParameter('stkp') || 'all'
},
success: function(response) {
if (response.data.length > 0) {
//const table = $('#table1').DataTable();
table1.rows.add(response.data).draw(false);
offset += limit;
} else {
allLoaded = true;
}
loading = false;
if (!response.hasMore || response.data.length < limit) {
$('#loadMoreBtn').hide();
} else {
$('#loadMoreBtn').prop('disabled', false).text('Загрузить ещё');
}
// после загрузки — прокрутка к таблице
/*const table1_wrapper = document.querySelector('#table1_wrapper');
if (table1_wrapper) {
table1_wrapper.scrollIntoView({ behavior: 'smooth', block: 'start' });
}*/
const scrollBody = document.querySelector('.dataTables_scrollBody');
if (scrollBody) {
scrollBody.scrollTo({ top: 0, behavior: 'smooth' });
}
//$('#table1_processing').hide();
},
error: function() {
alert("Ошибка при загрузке данных");
$('#table1_processing').hide();
},
complete: function() {
loading = false;
$('#table1_processing').hide();
}
});
}
// Первая загрузка
//loadMoreData();
// Кнопка загрузки
$('#loadMoreBtn').on('click', function () {
loadMoreData();
});
// let scrollTimeout = null;
setTimeout(() => {
// /*$('#table1_wrapper .dataTables_scrollBody').on('scroll', function() {
// let scrollBody = $(this);
// if (scrollBody.scrollTop() + scrollBody.innerHeight() >= scrollBody[0].scrollHeight - 25) {
// // Почти внизу — загружаем ещё
// loadMoreData();
// }
// });*/
$('#table1_wrapper .dataTables_scrollBody').on('scroll', function () {
// const scrollBody = $(this);
// const nearBottom = scrollBody.scrollTop() + scrollBody.innerHeight() >= scrollBody[0].scrollHeight - 25;
// if (nearBottom && !scrollTimeout) {
// // Запускаем таймер на 11 секунд
// scrollTimeout = setTimeout(() => {
// if ($('.modal:visible').length === 0) {
// loadMoreData();
// }
// scrollTimeout = null; // Сброс таймера
// }, 11000);
// } else {
// // Если пользователь прокрутил вверх, отменяем таймаут
// clearTimeout(scrollTimeout);
// }
// Запускаем или перезапускаем таймер
startScrollTimeout();
});
}, 1000); // можно обернуть в setTimeout или поставить после инициализации
$('#table1_wrapper').on('show.bs.modal', '.modal', function() {// $(document).on('show.bs.modal', '.modal', function() {
// Когда появляется модальное окно, очищаем таймаут
//console.log('Обнаружено модальное окно, отменяем таймер.');
clearTimeout(scrollTimeout);
});
$('#table1_wrapper').on('hidden.bs.modal', '.modal', function() {// $(document).on('hidden.bs.modal', '.modal', function() {
//console.log('Модальное окно закрыто, проверяем, нужно ли перезапускать таймер.');
startScrollTimeout(); // Повторно запускаем таймер, если прокрутка внизу
});
// Прокрутка при переключении страницы
$('#table1').on('page.dt', function () {
const table1_wrapper = document.querySelector('#table1_wrapper');
if (table1_wrapper) {
table1_wrapper.scrollIntoView({ top: 0, behavior: 'smooth' });
}
const scrollBody = document.querySelector('.dataTables_scrollBody');
if (scrollBody) {
scrollBody.scrollTo({ top: 0, behavior: 'smooth' });
}
});
//var table = $('#datesTable').DataTable();
// Сохраняем выбор при изменении количества строк
table1.on('length.dt', function (e, settings, len) {
localStorage.setItem("table1_length", len);
});