未删除事件监听器

问题描述 投票:1回答:1

此代码正在加载DOM内容时注册滚动事件侦听器。卸载组件时,我正在调用removeEventListener()方法,但是事件侦听器未删除,而是在其他组件中调用。我要去哪里错了?谢谢!

useEffect(() => {
  return () => {
    document.removeEventListener('scroll', listener, true);
    console.log('unmount');
  };
}, []);

useLayoutEffect(() => {
  document.addEventListener('DOMContentLoaded', (event) => {
    document.addEventListener('scroll', listener, true);
  });
});

const listener = () => {
  let elementTop = $('.foo').offset().top;
  let elementBottom = elementTop + $('.foo').outerHeight();
  let viewportTop = $(window).scrollTop();
  let viewportBottom = viewportTop + $(window).height();
  let boolean = elementBottom > viewportTop && elementTop < viewportBottom;
  boolean ? setMapAbsolute(true) : setMapAbsolute(false);
};
javascript jquery reactjs event-listener
1个回答
0
投票

检查DOMContentLoaded被触发了多少次,也为页面上的iframes调用了它。您可能正在为框架注册事件处理程序,但仅将其删除一次。

© www.soinside.com 2019 - 2024. All rights reserved.