javascript - 如何检测浏览器窗口是否为 "near"底部?

标签 javascript html reactjs

我正在为我的 React 应用程序使用无限滚动,并具有检测我何时恰好位于页面底部的功能:

const [isFetching, setIsFetching] = useState(false);

// Fire Upon Reaching the Bottom of the Page
  const handleScroll = () => {
    if (
      window.innerHeight +
        Math.max(
          window.pageYOffset,
          document.documentElement.scrollTop,
          document.body.scrollTop
        ) !==
      document.documentElement.offsetHeight
    )
      return;

    setIsFetching(true);
  };

  // Debounce the Scroll Event Function and Cancel it When Called
  const debounceHandleScroll = debounce(handleScroll, 100);

  useEffect(() => {
    window.addEventListener("scroll", debounceHandleScroll);
    return () => window.removeEventListener("scroll", debounceHandleScroll);
  }, [debounceHandleScroll]);

  debounceHandleScroll.cancel();

问题出在我在手机中加载我的页面时,似乎由于移动浏览器的选项卡或栏,它没有检测到页面底部,因此内容没有加载。

有什么方法可以检测到用户靠近底部并仅在此时触发该功能?

最佳答案

我认为 IntersectionObserver 可能就是您要找的东西。 您可以查看本教程以获取基本信息:https://dev.to/producthackers/intersection-observer-using-react-49ko

你也可以把它变成一个自定义的钩子(Hook),它接受一个 ref(在你的例子中,是页面底部的一个 n 元素):

import { useEffect, useState } from 'react';

const useIsVisible = ref => {
  const [isIntersecting, setIntersecting] = useState(false);

  const observer = new IntersectionObserver(([entry]) =>
    setIntersecting(entry.isIntersecting),
  );

  useEffect(() => {
    observer.observe(ref.current);

    return () => {
      observer.disconnect();
    };
  }, []);

  return isIntersecting;
};

export default useIsVisible;

也许以下包也可以帮助您,它使无限滚动变得非常容易:

https://www.npmjs.com/package/react-infinite-scroll-component

关于javascript - 如何检测浏览器窗口是否为 "near"底部?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70379478/

相关文章:

javascript - AngularJs、Phonegap、路由器和 uiRouter

javascript - 我需要使用正则表达式和 Javascript 匹配 url 路径的特定部分

reactjs - React 中的 refs 是什么?

reactjs - React useEffect 依赖项正在触发更新

reactjs - 如何将窗口作为有效 Prop 包含在 PropTypes 中?

javascript - 如何从 javascript 函数内的 .then 返回值?

javascript - 是否有任何干净的方法可以使用可变键初始化对象?

javascript - 仅加载部分段落文本的 div

html - 如何在CSS中并排对齐4个容器?

html - 响应式 div 背景,但不重复