如何在iOS设备(Safari浏览器)中消抖或节流滚动事件

3
我正在尝试为移动设备和台式设备实现无限滚动下拉菜单。在“无限滚动”中,如果你有100个记录,当滚动容器到达末尾时,会加载20个新记录,并隐藏前20个记录(向后方向同样如此)。在移动设备的Android Chrome浏览器和桌面浏览器中,一切都运行得很完美,除了Safari Mobile浏览器(iPhone、iPad等)。
我遇到了以下问题:
- 添加lodash debounce/throttle函数到整个滚动处理程序函数,但没有帮助,甚至导致所有地方的滚动都出问题。 - 尝试使用iScroll,但遇到了与这里相同的问题,以及来自iscroll scrollTo()方法的其他错误。 - requestAnimationFrame() - 没有任何成功的结果。
这是我的示例项目: https://jsfiddle.net/q4nLverg/2/ 滚动处理程序函数代码:
function scrollHandler(e) {

    var top = $(this.$refs.dropdownContainer).scrollTop();
    var difference = $(this.$refs.dropdownMenu).height() - $(this.$refs.dropdownContainer).height()

    if (top >= difference - this.scrollLimit && difference > 0) {

        this.maxRowsLimitIndex = this.maxRowsLimitIndex + this.numberOfItemsToLoad;
        this.minRowsLimitIndex = this.minRowsLimitIndex + this.numberOfItemsToLoad

        if ( this.maxRowsLimitIndex >= this.options.length ) {

            this.maxRowsLimitIndex = this.options.length
            this.minRowsLimitIndex = this.options.length - this.numberOfVisibleItems
        }
        else {
            this.scrollTo( (difference - (this.numberOfItemsToLoad * 28)) )
        }
    }
    else if ( top <= this.scrollLimit )
    {
        this.maxRowsLimitIndex = this.maxRowsLimitIndex - this.numberOfItemsToLoad;
        this.minRowsLimitIndex = this.minRowsLimitIndex - this.numberOfItemsToLoad

        if ( this.maxRowsLimitIndex <= this.numberOfVisibleItems  ) {
            this.maxRowsLimitIndex = this.numberOfVisibleItems
            this.minRowsLimitIndex = 0
        }
        else {
            this.scrollTo( (this.numberOfItemsToLoad * 28)/2)
        }

    }
}

this.scrollTo - 只是更改容器的scrollTop以模拟自动向上或向下滚动,当新数据加载并从选择中删除旧数据时。

iOS设备(和其他任何设备)的预期结果:

当用户快速滚动到可滚动容器的末尾时,它不应该到达可滚动容器的末尾,而是必须继续滚动事件并相应地加载数据(就像在安卓设备中一样),以模拟无限滚动功能。

1个回答

3
如果所有行的高度相等,您可以尝试计算滚动区域的初始高度,并使用Intersection Observer确定哪些行是可见的。

如果我正确理解Intersection Observer的工作原理,它需要所有元素始终在DOM中呈现,但我有一些情况需要同时显示65k+行 - 因此我不会将它们呈现在DOM中,直到需要显示它们。 - Syler92
你需要的是虚拟滚动。你可以搜索一些包中如何实现它,例如这个:https://github.com/Akryum/vue-virtual-scroller。你应该避免在移动设备上绑定滚动监听器,因为它会加速滚动,这就是为什么我向你指出Intersection observers的原因。 - Daniel Valchev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接