当前位置:首页 > JavaScript

js实现上拉加载

2026-01-30 12:18:56JavaScript

实现上拉加载的基本思路

监听滚动事件,判断是否滚动到页面底部。当滚动到底部时触发加载更多数据的操作。

监听滚动事件

window.addEventListener('scroll', function() {
    // 判断是否滚动到底部
});

判断滚动到底部的条件

需要比较三个值:

  • 滚动条距离顶部的距离(scrollTop)
  • 可视区域高度(clientHeight)
  • 页面总高度(scrollHeight)
const scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
const clientHeight = document.documentElement.clientHeight;
const scrollHeight = document.documentElement.scrollHeight;

if (scrollTop + clientHeight >= scrollHeight - 10) {
    // 触发加载更多
}

加载数据的实现

let isLoading = false;
let currentPage = 1;

function loadMore() {
    if (isLoading) return;

    isLoading = true;
    // 显示加载中提示
    showLoadingIndicator();

    fetch(`/api/data?page=${currentPage}`)
        .then(response => response.json())
        .then(data => {
            // 处理新数据
            renderData(data);
            currentPage++;
            isLoading = false;
            // 隐藏加载中提示
            hideLoadingIndicator();
        })
        .catch(error => {
            isLoading = false;
            // 隐藏加载中提示
            hideLoadingIndicator();
        });
}

优化性能

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

function throttle(fn, delay) {
    let timer = null;
    return function() {
        if (timer) return;
        timer = setTimeout(() => {
            fn.apply(this, arguments);
            timer = null;
        }, delay);
    };
}

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

完整示例代码

let isLoading = false;
let currentPage = 1;

function checkScroll() {
    const scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
    const clientHeight = document.documentElement.clientHeight;
    const scrollHeight = document.documentElement.scrollHeight;

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

function loadMore() {
    isLoading = true;
    showLoadingIndicator();

    fetch(`/api/data?page=${currentPage}`)
        .then(response => response.json())
        .then(data => {
            renderData(data);
            currentPage++;
            isLoading = false;
            hideLoadingIndicator();
        })
        .catch(error => {
            isLoading = false;
            hideLoadingIndicator();
        });
}

function throttle(fn, delay) {
    let timer = null;
    return function() {
        if (timer) return;
        timer = setTimeout(() => {
            fn.apply(this, arguments);
            timer = null;
        }, delay);
    };
}

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

注意事项

  • 确保在加载完成前不会重复触发加载
  • 处理网络请求失败的情况
  • 当没有更多数据时需要显示提示或禁用加载
  • 移动端需要考虑touch事件和滚动性能优化

js实现上拉加载

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

相关文章

vue实现js休眠

vue实现js休眠

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

js实现图片上传

js实现图片上传

图片上传的基本实现 使用HTML的<input type="file">元素配合JavaScript的File API可以实现图片上传功能。HTML部分需要创建一个文件选择输入框和一个用于…

jquery加载

jquery加载

jQuery 加载方法 使用 CDN 加载 jQuery 推荐通过公共 CDN(如 Google、Microsoft 或 jQuery 官方)加载,速度快且可能已被浏览器缓存。 <scr…

js实现点击显示和隐藏

js实现点击显示和隐藏

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

js实现dh

js实现dh

JavaScript 实现 DH(Diffie-Hellman)密钥交换 Diffie-Hellman(DH)密钥交换是一种安全协议,允许双方在不安全的通信信道上建立一个共享密钥。以下是如何在 Jav…

js实现视口

js实现视口

js实现视口检测的方法 使用JavaScript检测元素是否进入视口(viewport)可以通过Intersection Observer API或手动计算元素位置实现。以下是两种常见方法: In…