JavaScript滚动: How to execute function only once with least amount of CPU usage?

标签 javascript function scroll

我有一个由单个页面组成的简单网站。使用行为通过 Piwik 进行跟踪。由于页面的设计,用户通常会滚动浏览页面,而不是使用导航栏和单击链接,这使得链接跟踪成为一种非常无信息的方法,无法深入了解网站的使用情况。为了跟踪用户行为,我有一个使用“scroll”的 js 函数来确定用户在页面上的位置,然后向跟踪服务器发送请求:

setInterval(reportposition, 1000); 
 function reportposition () {
    $(function () {
             var $win = $(window);

             $win.scroll(function () {
                 if ($win.scrollTop() == 0) {
                     _paq.push(['trackEvent', 'Scroll', 'PageTop']);
}               else if (($(document).height() - $win.scrollTop()
                                < 7540) && ($(document).height() - $win.scrollTop() > 7500 )) {
                     _paq.push(['trackEvent', 'Scroll', 'About']);
}
                 else if ($win.height() + $win.scrollTop()
                                == $(document).height()) {
                     _paq.push(['trackEvent', 'Scroll', 'PageBottom']);
                 }
             });
         });
};

但是,每个满足其中一个条件的滚动都会执行数十次,从而向服务器发送数十个跟踪请求。我尝试使用 setInterval 降低函数运行的频率,但效果可以忽略不计。有什么方法可以让函数在满足一个条件时只触发一次,直到满足另一个条件为止?

使用滚动来检查用户的位置似乎对 CPU 周期要求相当高,因为有时简单的滚动可能会发生数百个事件。有没有办法以尽可能少的CPU占用来解决这个问题?

最佳答案

这里的解决方案是检查scrollTop是否等于用户滚动的当前div的scrollTop。

CPU方面,看https://techoctave.com/c7/posts/60-simple-long-polling-example-with-javascript-and-jquery 。这是一种解决方案;更理想的情况是,您应该考虑使用 Websockets(即,将 socket.io 与 node.js 一起使用)。

关于JavaScript滚动: How to execute function only once with least amount of CPU usage?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38447831/

相关文章:

javascript - window.location.href 不会重定向到不同的域

c# - 什么是 C# 等同于 preg_match_all?

css - 如何通过滚动使溢出的 SVG 内容可见?

javascript - 如何在 Angularjs 中的 div 内左右滚动

css - 在滚动上制作相对 div 剪辑静态 Logo - CSS

javascript - JSON 化 Blob 文件

javascript - Node bash 权限被拒绝

javascript - 如何使用PDF.JS显示整个PDF(不仅仅是一页)?

C : send different structures for one function argument

c# - 如何在 C# 中拥有包含子函数的函数