当前位置:首页 > JavaScript

js实现下拉加载

2026-04-04 18:44:42JavaScript

实现下拉加载的基本原理

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

监听滚动事件

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

判断滚动到底部

需要计算三个关键值:

  • 窗口可视高度 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. 添加防抖处理避免频繁触发

    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'));

js实现下拉加载


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实现验证码

使用Canvas生成图形验证码 在HTML中创建一个Canvas元素用于绘制验证码。通过JavaScript随机生成数字或字母组合,并添加干扰线、噪点等干扰元素增强安全性。 <canvas i…

js实现图片放大缩小

js实现图片放大缩小

实现图片放大缩小的基础方法 使用CSS的transform: scale()属性可以快速实现图片的放大缩小效果。通过JavaScript动态修改该属性值: const img = document.…

js实现百叶窗

js实现百叶窗

使用CSS和JavaScript实现百叶窗效果 通过CSS动画和JavaScript事件监听可以实现百叶窗效果。核心思路是将内容区域分割为多个条状元素,通过控制它们的展开/折叠状态来模拟百叶窗。 &…

js实现密码

js实现密码

密码强度验证 使用正则表达式验证密码强度是一种常见方法。以下代码检查密码是否包含大小写字母、数字和特殊字符,且长度至少为8位: function checkPasswordStrength(pass…

js实现上传图片

js实现上传图片

使用HTML5的File API实现图片上传 HTML5的File API允许通过JavaScript访问用户选择的文件。需要创建一个文件输入元素,并监听其change事件。 <input t…

js实现图片放大

js实现图片放大

使用 CSS transform 实现图片放大 通过 CSS 的 transform: scale() 属性实现图片放大效果。当鼠标悬停时,图片会平滑放大。 const img = document…