当前位置:首页 > JavaScript

js实现下拉加载

2026-01-31 02:49:33JavaScript

实现下拉加载的基本原理

监听滚动事件,判断是否滚动到页面底部。当滚动到底部时触发数据加载。核心逻辑包括计算滚动位置、判断触底条件和异步加载数据。

监听滚动事件

在JavaScript中,可以通过window.addEventListener监听scroll事件。确保在组件挂载时添加事件监听,并在卸载时移除以避免内存泄漏。

js实现下拉加载

window.addEventListener('scroll', handleScroll);

判断滚动到底部

计算当前滚动位置与文档总高度的关系,判断是否到达底部。通常使用以下公式:

scrollTop + clientHeight >= scrollHeight - threshold

其中threshold是一个阈值,用于提前触发加载。

js实现下拉加载

function handleScroll() {
  const scrollTop = document.documentElement.scrollTop;
  const clientHeight = document.documentElement.clientHeight;
  const scrollHeight = document.documentElement.scrollHeight;
  const threshold = 100; // 提前100px触发加载

  if (scrollTop + clientHeight >= scrollHeight - threshold) {
    loadMoreData();
  }
}

加载数据

实现异步加载数据的函数,通常是一个API请求。确保在加载过程中禁用重复请求,并在加载完成后更新状态。

let isLoading = false;

async function loadMoreData() {
  if (isLoading) return;

  isLoading = true;
  try {
    const newData = await fetchData(); // 替换为实际API调用
    appendDataToDOM(newData); // 更新DOM
  } catch (error) {
    console.error('加载失败:', error);
  } finally {
    isLoading = false;
  }
}

优化性能

使用节流函数减少scroll事件的触发频率,避免性能问题。以下是一个简单的节流实现:

function throttle(func, delay) {
  let lastCall = 0;
  return function(...args) {
    const now = new Date().getTime();
    if (now - lastCall < delay) return;
    lastCall = now;
    func.apply(this, args);
  };
}

window.addEventListener('scroll', throttle(handleScroll, 200));

完整示例代码

let isLoading = false;
let currentPage = 1;

window.addEventListener('scroll', throttle(handleScroll, 200));

function handleScroll() {
  const scrollTop = document.documentElement.scrollTop;
  const clientHeight = document.documentElement.clientHeight;
  const scrollHeight = document.documentElement.scrollHeight;
  const threshold = 100;

  if (scrollTop + clientHeight >= scrollHeight - threshold) {
    loadMoreData();
  }
}

async function loadMoreData() {
  if (isLoading) return;

  isLoading = true;
  try {
    const newData = await fetch(`/api/data?page=${currentPage}`);
    const data = await newData.json();
    appendDataToDOM(data);
    currentPage++;
  } catch (error) {
    console.error('加载失败:', error);
  } finally {
    isLoading = false;
  }
}

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

function throttle(func, delay) {
  let lastCall = 0;
  return function(...args) {
    const now = new Date().getTime();
    if (now - lastCall < delay) return;
    lastCall = now;
    func.apply(this, args);
  };
}

注意事项

  • 确保在数据加载完成前禁用重复请求。
  • 使用节流函数优化性能,避免频繁触发滚动事件。
  • 在单页应用(SPA)中,组件卸载时需要移除事件监听。
  • 考虑添加加载指示器,提升用户体验。

标签: 加载js
分享给朋友:

相关文章

js 实现继承

js 实现继承

原型链继承 通过让子类的原型对象指向父类的实例来实现继承。子类实例可以访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Pa…

vue实现加载

vue实现加载

Vue 实现加载功能的方法 使用 v-if 或 v-show 控制加载状态 在模板中通过 v-if 或 v-show 控制加载动画的显示与隐藏。v-if 会完全移除 DOM 元素,而 v-show 仅…

加载jquery

加载jquery

加载 jQuery 的方法 通过 CDN 加载 推荐使用官方或公共 CDN(内容分发网络)加载 jQuery,速度快且稳定。将以下代码添加到 HTML 文件的 <head> 或 <b…

vue加载动画实现

vue加载动画实现

Vue 加载动画实现方法 使用 CSS 动画或过渡 在 Vue 组件中可以直接通过 CSS 实现加载动画效果。定义一个简单的旋转动画: .loading-spinner { width: 40p…

js实现祖玛

js实现祖玛

实现祖玛游戏的核心思路 祖玛游戏的核心玩法是发射彩色珠子,形成三个或以上相同颜色的珠子即可消除。以下是使用JavaScript实现的基本框架。 游戏初始化 创建画布并初始化游戏状态: const…

js实现游标

js实现游标

使用JavaScript实现游标 在JavaScript中,可以通过操作DOM元素的cursor样式属性来实现自定义游标效果。以下是几种常见的实现方法: 修改默认鼠标指针样式 通过CSS的curso…