【发布时间】:2018-08-01 22:51:55
【问题描述】:
每当某个 css 类的内容块可见 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% 正确,但要点是我尝试:
- 在滚动/调整大小时测试每个 myClass 元素的可见性
- 如果有一个可见,请等待 5 秒,然后再检查一次相同的元素。
问题是,当 setTimeout 运行 isInViewport 时,元素未定义。也许 jQuery 的 .each 和 setTimeout 不匹配?
【问题讨论】:
-
这实际上是一场糟糕的比赛。
scroll在每个车轮旋转时都会像机关枪一样开火……对于这些事件中的每一个,.each()循环开始遍历 X 个元素。然后... 5 秒后,element也在范围内,它会是正确的吗?一定不! --- 所以你必须以一种不会在滚动或每个循环中定义的方式传递元素。我认为在滚动处理程序中使用数组是一个线索......但我现在不能说更多。 -
第二次教导可能会有所帮助:我会将所有可见元素存储在一个数组中,当用户停止滚动时...然后,将超时设置为 5 秒以将新的可见元素与数组进行比较。两者之间的任何其他滚动都应清除超时......并等待滚动再次停止。 ;)
-
你可以试试Intersection Observer。它处于实验状态,但除 IE 之外的所有浏览器都支持。
标签: javascript jquery settimeout viewport scrolltop