当前位置:首页 > JavaScript

js实现加载更多内容

2026-03-01 06:30:23JavaScript

实现滚动加载更多内容

使用Intersection Observer API监听元素进入视口,触发加载更多数据。这种方法性能较好,避免频繁计算滚动位置。

const observer = new IntersectionObserver((entries) => {
  entries.forEach(entry => {
    if (entry.isIntersecting) {
      loadMoreData();
    }
  });
});

observer.observe(document.querySelector('.load-more-trigger'));

async function loadMoreData() {
  const response = await fetch('/api/data?page=' + currentPage);
  const newData = await response.json();
  appendDataToDOM(newData);
  currentPage++;
}

实现点击加载更多按钮

创建按钮点击事件处理程序,每次点击时获取新数据并追加到页面。

js实现加载更多内容

document.getElementById('load-more-btn').addEventListener('click', async () => {
  const response = await fetch('/api/data?page=' + currentPage);
  const newData = await response.json();

  newData.forEach(item => {
    const element = document.createElement('div');
    element.textContent = item.content;
    document.getElementById('content-container').appendChild(element);
  });

  currentPage++;

  if (currentPage >= totalPages) {
    document.getElementById('load-more-btn').disabled = true;
  }
});

实现无限滚动加载

监听窗口滚动事件,当接近底部时加载更多内容。需要添加防抖优化性能。

js实现加载更多内容

let isLoading = false;

window.addEventListener('scroll', debounce(() => {
  const { scrollTop, scrollHeight, clientHeight } = document.documentElement;

  if (scrollTop + clientHeight >= scrollHeight - 100 && !isLoading) {
    isLoading = true;
    loadMoreData().finally(() => isLoading = false);
  }
}, 200));

function debounce(fn, delay) {
  let timer;
  return function() {
    clearTimeout(timer);
    timer = setTimeout(() => fn.apply(this, arguments), delay);
  };
}

实现分页加载

维护当前页码状态,每次请求时递增页码参数。

let currentPage = 1;
const pageSize = 10;

async function loadPaginatedData() {
  const response = await fetch(`/api/data?page=${currentPage}&size=${pageSize}`);
  const data = await response.json();

  if (data.length > 0) {
    renderData(data);
    currentPage++;
  } else {
    showNoMoreData();
  }
}

实现虚拟滚动优化

对于大量数据,使用虚拟滚动技术只渲染可见区域内容。

const container = document.getElementById('virtual-scroll');
const contentHeight = 100000; // 总内容高度
const visibleItems = 10;
const itemHeight = 50;

container.style.height = `${visibleItems * itemHeight}px`;
container.addEventListener('scroll', () => {
  const scrollTop = container.scrollTop;
  const startIndex = Math.floor(scrollTop / itemHeight);

  renderItems(startIndex, startIndex + visibleItems);
});

function renderItems(start, end) {
  // 只渲染start到end范围内的项目
}

注意事项

确保添加加载状态提示和错误处理 合理设置节流/防抖时间避免频繁请求 移动端需要考虑触摸事件兼容性 服务端应支持分页参数 加载完成后可以禁用按钮或移除观察者

标签: 加载更多
分享给朋友:

相关文章

vue实现滑动加载

vue实现滑动加载

滑动加载的实现思路 滑动加载通常通过监听滚动事件,判断是否滚动到页面底部来触发数据加载。Vue中可以通过结合v-for、@scroll事件和计算属性实现。 基础实现方法 监听滚动事件 在包含滚动区域…

vue实现 懒加载

vue实现 懒加载

懒加载的实现方式 在Vue中实现懒加载可以通过多种方式,常见的包括路由懒加载和组件懒加载。以下是具体实现方法: 路由懒加载 路由懒加载是通过动态导入组件的方式实现的,适用于Vue Router的路由…

vue实现无限加载

vue实现无限加载

Vue 实现无限加载的方法 无限加载(Infinite Scroll)是一种常见的用户体验优化方式,适用于数据量较大的列表或瀑布流场景。以下是几种在 Vue 中实现无限加载的常用方法。 监听滚动事件…

vue 实现更多展开

vue 实现更多展开

Vue 实现更多展开功能 在 Vue 中实现“更多展开”功能可以通过多种方式完成,以下是几种常见的实现方法: 使用 v-show 或 v-if 控制显示 通过 Vue 的指令 v-show 或 v-…

vue实现异步加载

vue实现异步加载

Vue 异步加载的实现方法 在 Vue 中实现异步加载可以通过多种方式完成,包括动态导入、路由懒加载和异步组件等。以下是几种常见的实现方法: 动态导入与异步组件 使用 Vue 的 defineAsy…

vue实现视频预加载

vue实现视频预加载

实现视频预加载的方法 在Vue中实现视频预加载可以通过多种方式完成,关键在于提前加载视频资源,确保播放时流畅无卡顿。 使用<video>标签的preload属性 <templat…