Проблема с смещением заголовков фиксированного заголовка DataTables.net при прокруткеJquery

Программирование на jquery
Ответить
Anonymous
 Проблема с смещением заголовков фиксированного заголовка DataTables.net при прокрутке

Сообщение Anonymous »

Я работал с ChatGPT 4o над созданием комплексного доказательства концепции DataTables.net, основанного на потребностях моего клиента, которое включает в себя следующие плагины и функции DataTables.net:
  • FixedHeader
  • Группировка строк
  • Дочерние строки
  • Нижний колонтитул
  • Множественный выбор и выбор всех
В приведенном примере кода/jsfiddle каждый из них выделен разными цветами для облегчения идентификации. .
Все работает отлично. Есть только одна проблема с фиксированными заголовками. При прокрутке вниз и вверх фиксированные заголовки идеально выравниваются. Однако когда вы прокручиваете вверх и достигаете верхней части страницы/представления, фиксированные заголовки смещаются влево и не совпадают со столбцами ниже. (см. столбец «Позиция»)
Вы можете увидеть проблему в этом jsfiddle: https://jsfiddle.net/v5fs3do6/
До (работает )
Изображение

После (заголовки смещены)
Изображение

Я потратил часы, пытаясь решите эту проблему с помощью chatgpt, но пример кажется слишком сложным для его решения. Мы попытались откатить некоторые плагины, чтобы посмотреть, где и когда возникла проблема, но это тоже не удалось.
К сожалению, требования требуют наличия всех этих функций и плагинов.
К сожалению, требования требуют наличия всех этих функций и плагинов.
К сожалению, требования требуют наличия всех этих функций и плагинов.
p>
Я надеюсь, что глаза человека-эксперта в дизайне/кодировании интерфейса помогут мне решить эту проблему.
У jsfiddle есть рабочий пример, демонстрирующий всю функциональность и проблему, но вот и код.
Любая помощь будет принята с благодарностью и спасет меня от безумия.
Спасибо! р>






DataTable with Grouping, Expanded Child Rows




table.dataTable thead th {
background-color: #f4f4f4;
}

.group-header {
font-weight: bold;
background-color: #d8d8d8;
}

.child-row td {
padding: 10px 0;
border-top: none;
text-align: left;
}

.blueTable th {
background-color: #007bff !important;
color: white !important;
}

.groupRow {
background-color: #0056b3 !important;
color: white !important;
}

.childDataRow {
background-color: #80c1ff !important;
color: black !important;
}

.groupFooterRow {
background-color: #cce5ff !important;
font-weight: bold;
color: black !important;
}





Select Grouping Column:

None
Office
Position






Name
Position
Age
Start date
Salary
Department
Project
Experience (Years)
Location
Office
Hobby
Favorite Animal






Tiger Nixon



System Architect
61
2011/04/25
$320,800
IT
Project A
10
Scotland
Edinburgh
Fishing
Tiger




Garrett Winters



Accountant
63
2011/07/25
$170,750
Finance
Project B
8
Japan
Tokyo
Gardening
Cat




Ashton Cox



Junior Technical Author
66
2009/01/12
$86,000
Documentation
Project C
5
USA
San Francisco
Painting
Dog




Ryan Dixon



System Architect
61
2011/04/25
$320,800
IT
Project D
15
Japan
Tokyo
Fishing
Tiger




Brielle Williamson



Integration Specialist
61
2012/12/02
$372,000
Development
Project E
9
New Zealand
Wellington
Photography
Dolphin




Herrod Chandler



Sales Assistant
59
2012/08/06
$137,500
Sales
Project F
12
UK
London
Hiking
Eagle




Rhona Davidson



Senior Javascript Developer
55
2010/10/14
$327,900
Development
Project G
7
Canada
Toronto
Reading
Panda




Colleen Hurst



Javascript Developer
39
2009/09/15
$205,500
Development
Project H
6
Australia
Sydney
Cooking
Elephant




Sonya Frost



Software Engineer
23
2008/12/13
$103,600
IT
Project I
4
USA
San Diego
Knitting
Fox




Jena Gaines



Office Manager
30
2008/12/19
$90,560
Administration
Project J
2
USA
New York
Traveling
Whale




Quinn Flynn



Support Lead
22
2013/03/03
$342,000
Support
Project K
1
Canada
Vancouver
Swimming
Shark




Charde Marshall



Regional Director
36
2008/10/16
$470,600
Management
Project L
11
Singapore
Singapore
Writing
Wolf




Haley Kennedy



Senior Marketing Designer
43
2012/12/18
$313,500
Marketing
Project M
8
UK
Manchester
Cycling
Bear




Tatyana Fitzpatrick



Regional Director
19
2010/03/17
$385,750
Management
Project N
3
India
Mumbai
Dancing
Peacock










$(document).ready(function () {
var groupColumn = 10;
var initialColumnWidths = [];

function storeOriginalClasses() {
$('#example tbody tr').each(function () {
$(this).data('original-classes', $(this).attr('class'));
$(this).find('td').each(function () {
$(this).data('original-classes', $(this).attr('class'));
});
});
}

function reapplyOriginalClasses() {
$('#example tbody tr').each(function () {
var originalClasses = $(this).data('original-classes');
if (originalClasses) {
$(this).attr('class', originalClasses);
}
$(this).find('td').each(function () {
var originalTdClasses = $(this).data('original-classes');
if (originalTdClasses) {
$(this).attr('class', originalTdClasses);
}
});
});

$('.groupRow').each(function () {
var originalClasses = $(this).data('original-classes');
if (originalClasses) {
$(this).attr('class', originalClasses);
}
});
}

function addChildRows() {
$('.child-row').remove();

var colspan = $('#example thead tr th:visible').length - 1;

table.rows().every(function (rowIdx, tableLoop, rowLoop) {
var tr = $(this.node());
var hobby = tr.find('.hobby').val();
var favoriteAnimal = tr.find('.favorite-animal').val();

var childRowHtml = `


Hobby: ${hobby} | Favorite Animal: ${favoriteAnimal}

`;

tr.after(childRowHtml);
});
}

function addGroupFooter() {
$('.groupFooterRow').remove();

var groupData = {};
table.rows({ page: 'current' }).every(function () {
var data = this.data();
var groupKey = data[groupColumn];
if (!groupData[groupKey]) {
groupData[groupKey] = {
totalSalary: 0,
totalYears: 0,
rows: []
};
}
groupData[groupKey].rows.push(this.node());
groupData[groupKey].totalSalary += parseFloat(data[5].toString().replace(/[\$,]/g, ''));
groupData[groupKey].totalYears += parseFloat(data[8]) || 0;
});

$.each(groupData, function (groupKey, groupInfo) {
var lastRow = $(groupInfo.rows[groupInfo.rows.length - 1]);
var lastChildRow = lastRow.next('.childDataRow').length ? lastRow.next('.childDataRow') : lastRow;

var totalVisibleColumns = $('#example thead tr th:visible').length;
var colspanBeforeSalary = 5;
var colspanBetween = 2;
var colspanAfterYears = totalVisibleColumns - 9;

var formattedSalary = groupInfo.totalSalary.toFixed(2).replace(/\B(?=(\d{3})+(?!\d))/g, ',');
var formattedYears = groupInfo.totalYears.toFixed(2);

var groupFooterHtml = `


Group Total Salary: $${formattedSalary}

Group Total Years: ${formattedYears}


`;

lastChildRow.after(groupFooterHtml);
});
}

// Capture initial column widths when the table is first drawn
function captureInitialColumnWidths() {
initialColumnWidths = [];
$('#example thead th').each(function () {
initialColumnWidths.push($(this).width());
});
}

// Apply the captured column widths
function applyColumnWidths() {
$('#example thead th').each(function (index) {
$(this).css('width', initialColumnWidths[index] + 'px');
});

$('#example tbody tr:first td').each(function (index) {
$(this).css('width', initialColumnWidths[index] + 'px');
});
}

storeOriginalClasses();

var table = $('#example').DataTable({
responsive: false,
fixedHeader: true,
scrollX: true,
order: [[1, 'asc']],
lengthChange: true,
lengthMenu: [10, 25, 50, 100],
paging: true,
rowGroup: {
dataSrc: groupColumn,
startRender: function (rows, group) {
var colspan = $('#example thead tr th:visible').length;
return $('')
.addClass('groupRow bg-primary-light text-white')
.append(`Group: ${group}`);
}
},
columnDefs: [
{
targets: 0,
orderable: false,
searchable: false,
className: 'select-checkbox',
render: function () {
return '';
}
},
{
targets: [10, 11, 12],
visible: false,
searchable: true
},
{
targets: 2, // The "Position" column
width: '100px', // Set width to 100px
createdCell: function (td, cellData, rowData, row, col) {
$(td).css('white-space', 'normal'); // Enable word wrapping
$(td).css('word-wrap', 'break-word'); // Ensure long words break
}
}
],
autoWidth: false
});

// Add child rows and group footers initially
addChildRows();
addGroupFooter();

// Capture initial column widths after the table is drawn
table.on('draw', function () {
if (initialColumnWidths.length === 0) {
captureInitialColumnWidths();
}
addChildRows();
addGroupFooter();
reapplyOriginalClasses();
adjustTable();
});

// Apply fixed column widths during scrolling to avoid shifting
$('#example_wrapper .dataTables_scrollBody').on('scroll', function () {
applyColumnWidths();
});

// Adjust on column order change
table.on('order', function () {
adjustTable();
});

// Handle Select All checkbox
$('#select-all').on('click', function () {
var rows = table.rows({ 'search': 'applied' }).nodes();
$('input[type="checkbox"]', rows).prop('checked', this.checked);
});

// Handle grouping change based on dropdown
$('#group-by-column').on('change', function () {
var selectedColumn = $(this).val();
if (selectedColumn === "none") {
groupColumn = null;
} else if (selectedColumn === "position") {
groupColumn = 2;
} else if (selectedColumn === "office") {
groupColumn = 10;
}

table.rowGroup().dataSrc(groupColumn).draw();
adjustTable();
});

// Function to adjust columns and fixed header alignment
function adjustTable() {
table.columns.adjust();
if (table.fixedHeader) {
table.fixedHeader.adjust();
}
}

// Fix header alignment on window resize
$(window).on('resize', function () {
adjustTable();
});

// Recalculate column width on table draw events, like search or paging
table.on('responsive-resize', function () {
adjustTable();
});

// Call the adjustment function on initial load to ensure correct alignment
adjustTable();
});





Подробнее здесь: https://stackoverflow.com/questions/790 ... -on-scroll
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Jquery»