Это слушатель событий Scroll. Он стреляет каждый раз, когда обнаруживается даже небольшой свиток. который запускает слишком много извлечений данных. Функция нагрузки больше данных обобщена и запустит извлечение данных. и функция Updatevisiblorows используется для визуализации строк таблиц при прокрутке, который также является огнем много раз < /p>
_onScroll(scrollTop, limit) {
const tableWrapper = document.querySelector(".table-wrapper");
if (!tableWrapper) return;
const isScrollingDown = scrollTop > this.scrollTop;
this.scrollTop = scrollTop;
// const isBufferLoaded = this.buffer.size === this.totalRowsInTable;
// if (isBufferLoaded && isScrollingDown) {
// this._updateVisibleRows();
// return;
// }
if (isScrollingDown) {
this._loadMoreData("down", limit);
} else {
this._loadMoreData("up", limit);
}
this._updateVisibleRows();
}
async _loadMoreData(direction, count) {
if (this.isFetching) return;
this.isFetching = true;
let fetchOffset;
const limit = count;
this.linkedList = new CircularDoubleLinkedList(limit);
// if (this.buffer.size >= this.totalRowsInTable) {
// this.isFetching = false;
// return;
// }
if (direction === "down") {
fetchOffset = Math.floor(this.scrollTop / this.averageRowHeight);
} else if (direction === "up") {
fetchOffset = Math.max(
0,
Math.floor(this.scrollTop / this.averageRowHeight) - limit
);
}
// if (fetchOffset >= this.totalRowsInTable) {
// this.isFetching = false;
// return;
// }
try {
const startIndex = fetchOffset;
const endIndex = fetchOffset + limit;
for (let i = startIndex; i < endIndex; i++) {
if (this.buffer.has(i)) {
this.linkedList.updateNode(i % limit, this.buffer.get(i));
}
}
const missingIndices = [];
for (let i = startIndex; i < endIndex; i++) {
if (!this.buffer.has(i)) {
missingIndices.push(i);
}
}
if (missingIndices.length > 0) {
const methodName = `get${
this.pageName.charAt(0).toUpperCase() + this.pageName.slice(1)
}`;
if (typeof this.page.data[this.pageName][methodName] === "function") {
let response;
if (this.pageName === "expenses" || this.pageName === "timeEntries") {
const startDate = Dates.convertJS2SQL(
this.page.filters.startDate ||
localStorage.getItem(this.page.keys.startDate)
);
const endDate = Dates.convertJS2SQL(
this.page.filters.endDate ||
localStorage.getItem(this.page.keys.endDate)
);
// console.log("Using Date Range:", startDate, "to", endDate);
// console.log(
// "Selected Resources:",
// this.page.filters.selectedResources
// );
// console.log(
// "Selected Projects:",
// this.page.filters.selectedProjects
// );
response = await this.page.data[this.pageName][methodName](
startDate,
endDate,
this.page.filters.selectedResources || [],
this.page.filters.selectedProjects || [],
fetchOffset,
this.limit
);
} else {
response = await this.page.data[this.pageName][methodName](
fetchOffset,
this.limit
);
}
const data = Array.isArray(response)
? response
: response?.payload || [];
data.forEach((row, index) => {
const globalIndex = fetchOffset + index;
this.buffer.set(globalIndex, row);
this.linkedList.updateNode(globalIndex % limit, row);
});
}
}
} catch (err) {
console.error("Error loading more data:", err);
} finally {
this.isFetching = false;
}
}
Подробнее здесь: https://stackoverflow.com/questions/794 ... yone-knows
Столкнувшись с мерцанием в виртуальной прокрутке и других проблемах, кто -нибудь знает? [закрыто] ⇐ Php
Кемеровские программисты php общаются здесь
1738713847
Anonymous
Это слушатель событий Scroll. Он стреляет каждый раз, когда обнаруживается даже небольшой свиток. который запускает слишком много извлечений данных. Функция нагрузки больше данных обобщена и запустит извлечение данных. и функция Updatevisiblorows используется для визуализации строк таблиц при прокрутке, который также является огнем много раз < /p>
_onScroll(scrollTop, limit) {
const tableWrapper = document.querySelector(".table-wrapper");
if (!tableWrapper) return;
const isScrollingDown = scrollTop > this.scrollTop;
this.scrollTop = scrollTop;
// const isBufferLoaded = this.buffer.size === this.totalRowsInTable;
// if (isBufferLoaded && isScrollingDown) {
// this._updateVisibleRows();
// return;
// }
if (isScrollingDown) {
this._loadMoreData("down", limit);
} else {
this._loadMoreData("up", limit);
}
this._updateVisibleRows();
}
async _loadMoreData(direction, count) {
if (this.isFetching) return;
this.isFetching = true;
let fetchOffset;
const limit = count;
this.linkedList = new CircularDoubleLinkedList(limit);
// if (this.buffer.size >= this.totalRowsInTable) {
// this.isFetching = false;
// return;
// }
if (direction === "down") {
fetchOffset = Math.floor(this.scrollTop / this.averageRowHeight);
} else if (direction === "up") {
fetchOffset = Math.max(
0,
Math.floor(this.scrollTop / this.averageRowHeight) - limit
);
}
// if (fetchOffset >= this.totalRowsInTable) {
// this.isFetching = false;
// return;
// }
try {
const startIndex = fetchOffset;
const endIndex = fetchOffset + limit;
for (let i = startIndex; i < endIndex; i++) {
if (this.buffer.has(i)) {
this.linkedList.updateNode(i % limit, this.buffer.get(i));
}
}
const missingIndices = [];
for (let i = startIndex; i < endIndex; i++) {
if (!this.buffer.has(i)) {
missingIndices.push(i);
}
}
if (missingIndices.length > 0) {
const methodName = `get${
this.pageName.charAt(0).toUpperCase() + this.pageName.slice(1)
}`;
if (typeof this.page.data[this.pageName][methodName] === "function") {
let response;
if (this.pageName === "expenses" || this.pageName === "timeEntries") {
const startDate = Dates.convertJS2SQL(
this.page.filters.startDate ||
localStorage.getItem(this.page.keys.startDate)
);
const endDate = Dates.convertJS2SQL(
this.page.filters.endDate ||
localStorage.getItem(this.page.keys.endDate)
);
// console.log("Using Date Range:", startDate, "to", endDate);
// console.log(
// "Selected Resources:",
// this.page.filters.selectedResources
// );
// console.log(
// "Selected Projects:",
// this.page.filters.selectedProjects
// );
response = await this.page.data[this.pageName][methodName](
startDate,
endDate,
this.page.filters.selectedResources || [],
this.page.filters.selectedProjects || [],
fetchOffset,
this.limit
);
} else {
response = await this.page.data[this.pageName][methodName](
fetchOffset,
this.limit
);
}
const data = Array.isArray(response)
? response
: response?.payload || [];
data.forEach((row, index) => {
const globalIndex = fetchOffset + index;
this.buffer.set(globalIndex, row);
this.linkedList.updateNode(globalIndex % limit, row);
});
}
}
} catch (err) {
console.error("Error loading more data:", err);
} finally {
this.isFetching = false;
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79412851/facing-flickering-in-virtual-scrolling-and-other-issues-too-anyone-knows[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия