我正在尝试编写一个脚本来测量单页网站的浏览深度。
这个想法如下:一个单页的网站被分成几个部分。查看任何部分超过 15 秒时,将触发 Yandex.Metrica 目标。
部分示例。
<section id=""></section>
<section id=""></section>
<section id=""></section>
特定部分的定义。
// Получаем нужный элемент
var element = document.querySelector('target');
var Visible = function (target) {
// Все позиции элемента
var targetPosition = {
top: window.pageYOffset + target.getBoundingClientRect().top,
bottom: window.pageYOffset + target.getBoundingClientRect().bottom
},
// Получаем позиции окна
windowPosition = {
top: window.pageYOffset,
bottom: window.pageYOffset + document.documentElement.clientHeight
};
if (targetPosition.bottom > windowPosition.top && // Если позиция нижней части элемента больше позиции верхней чайти окна, то элемент виден сверху
targetPosition.top < windowPosition.bottom) { // Если позиция верхней части элемента меньше позиции нижней чайти окна, то элемент виден снизу
// Если элемент полностью видно, то запускаем следующий код
console.clear();
console.log('Вы видите элемент!');
} else {
// Если элемент не видно, то запускаем этот код
console.clear();
};
};
// Запускаем функцию при прокрутке страницы
window.addEventListener('scroll', function() {
Visible (element);
});
我无法解决两个任务,否则脚本不能被认为是有效的:
1.) 多个部分。我不明白如何实现一种方便的方法来枚举所需的部分以及如果用户在某个部分停止时激活计时器的机制。
2.) 最大的问题是一个用户可以同时看到 2 或 3 个部分。示例:用户在 100% 时看到第 1 部分,在 20% 时看到第 2 部分。或者,用户在 20% 时看到第 2 部分,在 100% 时看到第 3 部分,在 20% 时看到第 4 部分。我不明白如何为用户视野中最多的部分激活计时器,并且当滚动到另一个部分时,重新启动计时器。示例:在用户的视野中,第 1 部分为 100%,第 2 部分为 20%。对于第 1 部分,计时器计数为 14 秒,但随后用户滚动页面,结果发现第 2 部分在 20% 时可见,第 3 部分在 100% 时可见,第 4 部分在 20% 时可见,这意味着您需要更新计时器并开始第 3 节的新报告。
这两个问题是相互关联的,如果我可以借助某些拐杖自己解决第一个问题,那么我几天都无法将它们连接在一起。解决这个问题的任何想法?

但是,如果我们计算用户总共看到了哪个元素的表面的百分比呢?
例如,在 1 秒内查看该元素 100% 的元素区域,计数器增加 1,如果只有 20% 的元素可见,则为 0.2
该块的绘制取决于它可见的百分比,这是为了清晰和调试..
您还可以添加一个阈值来确定,例如 20% ...
PS:有一堆超时的解决方案可以调试总比没有好,我建议避免这种方法到最后..
它可以通过设置一个变量
viewTimeouts来存储每个元素的超时时间来通过超时来实现。好吧,我们设置了边界条件。我还做了一个方法
VisibleElements,将遍历所有元素并比较位置。在启动时运行它也是值得的,以便在页面加载后立即进行分析,而不仅仅是在滚动之后。更正了该方法
Visible,以便在以最小百分比查看元素时返回 true。https://jsfiddle.net/skywave/6vacfyL0/75/
使用IntersectionObserver的变体。实施方案如下:
css;id可见高度;id演示中会显示来自前导部分的消息。