JavaScript – 检测元素是否在视口(viewport)中停留 n 秒

标签 javascript jquery settimeout viewport scrolltop

每当某个 css 类的内容 block 可见 5 秒(用户正在阅读内容的标志)时,我需要推送一个数据层事件。

我用过这样的东西:

$(window).on(‘scroll resize’, function() {
  $(‘.myClass’).each(function(element) {
    If (isInViewport(element)) {
      setTimeout(function() {
        if (isInViewport(element)) {
          ... // Push the data layer event.
        }
      }, 5000);
    }
  });
});

function isInViewport(element) {
  ... // Returns true if element is visible.
};

只是凭内存写的,所以它可能不是 100% 正确,但要点是我尝试:

  1. 在滚动/调整大小时测试每个 myClass 元素的可见性
  2. 如果一个元素可见,请等待 5 秒并再次检查同一元素。

问题是,当 setTimeout 运行 isInViewport 时,元素是未定义的。也许 jQuery 的 .each 和 setTimeout 不匹配?

最佳答案

我设法使用路口观察器做到了这一点。我的要求是检查该元素是否至少在一秒钟内占 50%,如果是,则触发一个事件。

let timer;

const config = {
    root: null,
    threshold: 0.5 // This was the element being 50% in view (my requirements)
};

const observer = new IntersectionObserver((entries) => {
    entries.forEach((entry) => {

        if (entry.isIntersecting) {
            timer = setTimeout(() => {
               //... push to data layer
            }, 1000);
        } else {
            clearTimeout(timer);
        }
    });
}, config);

observer.observe(YourElement);

关于JavaScript – 检测元素是否在视口(viewport)中停留 n 秒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51643290/

相关文章:

angular - 如何获取在其外部 "SetTimeout"内部生成的值

javascript - 如何通过javascript代码添加整个表格?

javascript - JQuery 点击功能不适用于父元素中的按钮,它有自己的点击功能

javascript - 如何使用 Dropzonejs 限制视频的持续时间?

asynchronous - Rust编译wasm(webassembly)时,怎么休眠10毫秒?

javascript - 为什么在 Javascript 中使用 setTimeout 一次显示所有内容?

javascript - 在 JS 中发现特定的手机型号

javascript - 嵌套在 Parse.com afterSave 内的返回

JavaScript - 复选框的作用类似于单选按钮

javascript - Jquery 淡出速度不适用