当前位置:首页 > JavaScript

js实现下拉加载

2026-04-04 18:44:42JavaScript

实现下拉加载的基本原理

下拉加载的核心是通过监听滚动事件,判断用户是否滚动到页面底部附近。当满足条件时触发数据加载。JavaScript结合DOM操作可以实现这一功能。

监听滚动事件

window.addEventListener('scroll', function() {
  // 滚动处理逻辑
});

判断滚动到底部

需要计算三个关键值:

js实现下拉加载

  • 窗口可视高度 window.innerHeight
  • 文档总高度 document.documentElement.scrollHeight
  • 已滚动高度 window.scrollY
const scrollPosition = window.innerHeight + window.scrollY;
const pageHeight = document.documentElement.scrollHeight;
const threshold = 100; // 提前100px触发加载

if (scrollPosition > pageHeight - threshold) {
  // 执行加载
}

数据加载函数

let isLoading = false;
let currentPage = 1;

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

  isLoading = true;
  try {
    const response = await fetch(`/api/items?page=${currentPage}`);
    const newItems = await response.json();

    // 将新数据添加到页面
    appendItems(newItems);
    currentPage++;
  } catch (error) {
    console.error('加载失败:', error);
  } finally {
    isLoading = false;
  }
}

完整实现示例

document.addEventListener('DOMContentLoaded', function() {
  const container = document.getElementById('items-container');
  let loading = false;
  let page = 1;

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

    if (scrollTop + clientHeight >= scrollHeight - 100 && !loading) {
      loadMore();
    }
  });

  async function loadMore() {
    loading = true;
    showLoader();

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

      if (data.length > 0) {
        data.forEach(item => {
          const itemElement = document.createElement('div');
          itemElement.className = 'item';
          itemElement.textContent = item.name;
          container.appendChild(itemElement);
        });
        page++;
      }
    } catch (error) {
      console.error('Error:', error);
    } finally {
      loading = false;
      hideLoader();
    }
  }

  function showLoader() {
    // 显示加载指示器
  }

  function hideLoader() {
    // 隐藏加载指示器
  }

  // 初始加载
  loadMore();
});

优化建议

  1. 添加防抖处理避免频繁触发

    js实现下拉加载

    let debounceTimer;
    window.addEventListener('scroll', function() {
    clearTimeout(debounceTimer);
    debounceTimer = setTimeout(() => {
     // 检查滚动位置
    }, 100);
    });
  2. 使用Intersection Observer API(现代浏览器推荐)

    
    const observer = new IntersectionObserver((entries) => {
    if (entries[0].isIntersecting) {
     loadMore();
    }
    });

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


3. 添加无更多数据提示
```javascript
let hasMore = true;

async function loadMore() {
  if (!hasMore || loading) return;
  // ...加载逻辑

  if (data.length === 0) {
    hasMore = false;
    showNoMoreData();
  }
}
  1. 移动端兼容处理 确保touch事件也能正常触发滚动检测,特别是在iOS设备上。

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

相关文章

js实现拖拽

js实现拖拽

实现拖拽的基本步骤 使用JavaScript实现拖拽功能需要监听鼠标事件,包括mousedown、mousemove和mouseup。以下是实现的基本逻辑: const draggableEleme…

js实现拖拽

js实现拖拽

实现拖拽的基本步骤 通过监听鼠标事件(mousedown、mousemove、mouseup)实现拖拽功能。以下是核心代码逻辑: const draggableElement = document.…

js 实现分页

js 实现分页

实现分页的基本逻辑 分页功能通常需要后端返回数据总量或总页数,前端根据当前页码和每页条数截取对应数据。以下是一个基于JavaScript的简单分页实现方案: 前端分页实现 假设已有从后端获取的完整数…

js实现交换

js实现交换

交换变量的方法 在JavaScript中,交换两个变量的值有多种方法。以下是常见的几种实现方式: 使用临时变量 通过引入一个临时变量来存储其中一个变量的值,实现交换: let a = 1; le…

js实现vue路由

js实现vue路由

Vue 路由的基本实现 在 Vue.js 中实现路由功能通常使用 Vue Router 库。Vue Router 是 Vue.js 官方的路由管理器,用于构建单页面应用(SPA)。 安装 Vue R…

js实现正交

js实现正交

正交的概念 正交在数学和计算机科学中通常指两个向量垂直或线性无关。在编程中,正交性常被用于设计模块化、低耦合的系统。 向量正交判断 判断两个向量是否正交可以通过点积是否为0来实现: fun…