当前位置:首页 > JavaScript

js实现上拉加载

2026-01-30 12:18:56JavaScript

实现上拉加载的基本思路

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

js实现上拉加载

监听滚动事件

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

判断滚动到底部的条件

需要比较三个值:

js实现上拉加载

  • 滚动条距离顶部的距离(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实现

使用js实现

使用JavaScript实现 JavaScript可以通过Math.random()函数生成随机数,结合其他方法可以实现多种随机数生成需求。 // 生成0到1之间的随机小数 const random…

js实现截图

js实现截图

使用HTML2Canvas库实现截图 HTML2Canvas是一个流行的JavaScript库,可以将网页元素或整个页面转换为Canvas图像。安装方式: npm install html2canv…

vue 实现滚动加载

vue 实现滚动加载

Vue 实现滚动加载的方法 滚动加载(Infinite Scroll)是常见的前端功能,通过监听滚动事件动态加载数据。以下是Vue中实现滚动加载的几种方案: 使用原生滚动事件监听 通过监听窗口或容器…

vue.js实现restful

vue.js实现restful

Vue.js 实现 RESTful API 调用 在 Vue.js 中实现 RESTful API 调用通常涉及以下几个关键步骤: 安装 Axios Axios 是一个流行的 HTTP 客户端,用于…

vue.js实现loading

vue.js实现loading

实现全局Loading组件 在Vue.js中可以通过自定义组件实现全局Loading效果。创建一个独立的Loading组件,通过Vue的插件机制全局注册。 创建Loading组件 <temp…

vue实现滚动加载更多

vue实现滚动加载更多

vue实现滚动加载更多的方法 使用IntersectionObserver API 在Vue中可以通过IntersectionObserver API监听元素是否进入可视区域,触发加载更多数据。 &…