当前位置:首页 > JavaScript

js实现下拉加载

2026-03-01 17:55:05JavaScript

实现下拉加载的基本思路

监听滚动事件,判断是否滚动到页面底部。当滚动到底部时触发数据加载,更新页面内容。

核心代码实现

// 监听滚动事件
window.addEventListener('scroll', function() {
  // 文档总高度
  const scrollHeight = document.documentElement.scrollHeight;
  // 可视区域高度
  const clientHeight = document.documentElement.clientHeight;
  // 滚动条距离顶部高度
  const scrollTop = document.documentElement.scrollTop || document.body.scrollTop;

  // 判断是否滚动到底部
  if (scrollTop + clientHeight >= scrollHeight - 50) {
    loadMoreData();
  }
});

// 加载更多数据
let isLoading = false;
let currentPage = 1;

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

  isLoading = true;
  // 显示加载动画
  showLoadingIndicator();

  try {
    // 获取数据
    const newData = await fetchData(currentPage + 1);
    // 渲染数据
    renderData(newData);
    currentPage++;
  } catch (error) {
    console.error('加载失败:', error);
  } finally {
    isLoading = false;
    // 隐藏加载动画
    hideLoadingIndicator();
  }
}

优化性能的方法

使用节流函数减少滚动事件触发频率

function throttle(func, delay) {
  let lastTime = 0;
  return function() {
    const now = Date.now();
    if (now - lastTime >= delay) {
      func.apply(this, arguments);
      lastTime = now;
    }
  };
}

// 使用节流函数优化滚动监听
window.addEventListener('scroll', throttle(function() {
  // 滚动判断逻辑
}, 200));

数据加载和渲染示例

// 模拟获取数据
async function fetchData(page) {
  const response = await fetch(`/api/data?page=${page}`);
  return response.json();
}

// 渲染数据到页面
function renderData(data) {
  const container = document.getElementById('content-container');
  data.forEach(item => {
    const element = document.createElement('div');
    element.className = 'item';
    element.textContent = item.content;
    container.appendChild(element);
  });
}

加载状态提示

function showLoadingIndicator() {
  const loader = document.createElement('div');
  loader.id = 'loading-indicator';
  loader.textContent = '加载中...';
  document.body.appendChild(loader);
}

function hideLoadingIndicator() {
  const loader = document.getElementById('loading-indicator');
  if (loader) {
    loader.remove();
  }
}

注意事项

  • 避免重复加载:使用isLoading标志位防止并发请求
  • 错误处理:添加try-catch捕获网络请求异常
  • 无更多数据提示:当服务器返回空数据时显示"没有更多内容"
  • 移动端适配:考虑移动设备的滚动特性
  • 内存管理:大量数据时考虑虚拟滚动技术

完整实现示例

<div id="content-container"></div>

<script>
  // 初始化变量
  let isLoading = false;
  let currentPage = 1;
  const container = document.getElementById('content-container');

  // 初始加载
  loadMoreData();

  // 滚动监听
  window.addEventListener('scroll', throttle(function() {
    const scrollHeight = document.documentElement.scrollHeight;
    const clientHeight = document.documentElement.clientHeight;
    const scrollTop = document.documentElement.scrollTop || document.body.scrollTop;

    if (scrollTop + clientHeight >= scrollHeight - 100) {
      loadMoreData();
    }
  }, 200));

  // 加载数据函数
  async function loadMoreData() {
    if (isLoading) return;

    isLoading = true;
    showLoadingIndicator();

    try {
      const response = await fetch(`https://api.example.com/items?page=${currentPage}`);
      const data = await response.json();

      if (data.length === 0) {
        showNoMoreData();
        return;
      }

      data.forEach(item => {
        const element = document.createElement('div');
        element.className = 'item';
        element.textContent = item.title;
        container.appendChild(element);
      });

      currentPage++;
    } catch (error) {
      console.error('加载失败:', error);
      showError();
    } finally {
      isLoading = false;
      hideLoadingIndicator();
    }
  }

  // 辅助函数
  function throttle(func, delay) {
    let lastTime = 0;
    return function() {
      const now = Date.now();
      if (now - lastTime >= delay) {
        func.apply(this, arguments);
        lastTime = now;
      }
    };
  }

  function showLoadingIndicator() {
    // 实现加载提示
  }

  function hideLoadingIndicator() {
    // 隐藏加载提示
  }

  function showNoMoreData() {
    // 显示没有更多数据
  }

  function showError() {
    // 显示错误信息
  }
</script>

js实现下拉加载

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

相关文章

vue实现js休眠

vue实现js休眠

Vue 中实现 JavaScript 休眠 在 Vue 中实现 JavaScript 休眠通常需要使用异步方式,以避免阻塞主线程。以下是几种常见方法: 使用 setTimeout 和 Pro…

js实现图片轮播

js实现图片轮播

实现基础图片轮播 使用HTML、CSS和JavaScript创建一个简单的图片轮播。HTML部分定义轮播容器和图片,CSS设置样式和动画效果,JavaScript处理轮播逻辑。 <div c…

js实现打印

js实现打印

使用window.print()方法实现打印 在JavaScript中,可以通过调用window.print()方法直接触发浏览器的打印功能。这会打开系统的打印对话框,用户可以选择打印机和设置打印选项…

js轮播图实现原理

js轮播图实现原理

轮播图的基本原理 轮播图通过动态切换显示的内容(图片、文本等)实现视觉上的滑动效果。核心原理是利用CSS和JavaScript控制元素的显示与隐藏,或通过变换位置实现滑动动画。 实现方法一:…

js实现点击显示和隐藏

js实现点击显示和隐藏

实现点击显示和隐藏的JavaScript方法 使用classList.toggle切换类名 通过添加/移除CSS类控制元素的显示与隐藏,需提前在CSS中定义隐藏样式(如display: none)。…

js类实现

js类实现

使用类实现 JavaScript 功能 在 JavaScript 中,类(Class)是一种语法糖,基于原型继承机制。通过 class 关键字可以更直观地定义对象模板。 基本类定义 class…