You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

jQuery Scroll事件检测页面底部实现无限滚动Chrome环境下失效问题咨询

问题原因排查
  • 底部触发条件过于严格:当前用==严格判断滚动偏移+视口高度等于文档高度,高DPI屏幕、平滑滚动特性下,scrollTop会返回浮点数值,很难刚好匹配到完全相等的情况,这是不同设备表现不一致的核心原因。调整窗口大小能触发是因为resize操作会强制浏览器重新计算布局,修正了之前缓存的高度值。
  • 缺少请求状态锁:滚动事件触发频率极高,当前逻辑没有限制请求并发,可能出现上一批内容还没插入DOM,start就已经提前累加,后续高度计算错位的问题。
  • 异步插入内容的高度计算延迟:showVideo插入的视频元素如果包含未加载的封面图、视频资源,插入DOM后不会立刻撑开高度,$(document).height()读取到的是资源加载前的旧高度,等资源加载完成高度更新后,之前的滚动判断已经失效。
  • iOS判断逻辑冗余且易出错:当前或条件的优先级问题可能导致iOS设备的判断逻辑没有正常生效。
修复方案

直接替换原有代码为以下版本即可:

let start = 0; // 请根据实际业务初始化start的初始值
const limit = 20;
let isLoading = false; // 请求锁,防止重复请求
const deviceAgent = navigator.userAgent.toLowerCase();
const isIOS = deviceAgent.match(/(iphone|ipod|ipad)/);
// 阈值统一设为200,不管什么设备都提前200px触发加载,避免刚好到底部才触发的体验问题
const LOAD_THRESHOLD = 200;

// 用on代替废弃的bind,给滚动事件加节流,300ms最多触发一次判断
$(window).on("scroll", throttle(function() {
    // 如果正在加载中,直接返回不重复判断
    if (isLoading) return;
    
    const scrollTop = $(window).scrollTop();
    const windowHeight = $(window).height();
    const docHeight = $(document).height();
    
    // 把严格等于改成大于等于,统一加上阈值,不用分设备写两套逻辑
    if (scrollTop + windowHeight + LOAD_THRESHOLD >= docHeight) {
        load($("#search").val(), start, limit);
        start += limit;
        console.log("End of page detected");
    }
}, 300));

// 节流函数,减少滚动事件触发频率,降低性能消耗
function throttle(func, delay) {
    let lastCall = 0;
    return function(...args) {
        const now = new Date().getTime();
        if (now - lastCall < delay) return;
        lastCall = now;
        func.apply(this, args);
    }
}

function load(search, start=0, limit=20) {
    isLoading = true; // 加锁,避免重复触发请求
    $("#loader_active").show();

    const form_data = new FormData();
    form_data.append('search', search);
    form_data.append('start', start);
    form_data.append('limit', limit);

    $.ajax({
        url: "http://website.com/ajax/videos.php",
        contentType: false,
        dataType: "json",
        processData: false,
        cache: false,
        data: form_data,
        type: 'POST',
        success: function (data) {
            $(data).each(function(index, value) {
                showVideo(value);
            });
            $("#loader_active").hide();
            isLoading = false; // 请求完成解锁
        },
        error: function() {
            // 请求失败也要解锁,避免卡死之后再也无法触发加载
            $("#loader_active").hide();
            isLoading = false;
        }
    })
}
额外优化建议

如果插入的视频卡片包含图片资源,建议给图片设置固定宽高比的占位容器,避免图片加载过程中高度变化导致的计算偏差,进一步提升触发准确率。

内容的提问来源于stack exchange,提问作者user12213762

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 17:24:05