我试图找出一种简洁的方法来聚合mousemove事件,以便我确保我的代码被调用,但每250-300毫秒只能调用一次.
我曾考虑使用类似下面的内容,但想知道是否有更好的模式,或者jQuery提供的东西会做同样的事情:
var mousemove_timeout = null; $('body').mousemove(function() { if (mousemove_timeout == null) { mousemove_timeout = window.setTimeout(myFunction,250); } }); function myFunction() { /* * Run my code... */ mousemove_timeout = null; }
编辑:下面接受的答案将完全适用于这种情况,但是,我发现答案中提供的mousestop()功能实际上消除了我对聚合的需求,所以如果你正在阅读这个问题并寻找答案,请参阅如果mousestop插件是你真正需要的!
解决方法
您的代码很好,除非您在将其设置为null之前应该是
clear the timeout,否则它可能会泄漏:
window.clearTimeout(mousemove_timeout); mousemove_timeout = null;
作为替代方案,您可以将mousemove / mousestop与window.setInterval结合使用
var timer = null; var isIntervalSet = false; $('body').mousemove(function() { if (isIntervalSet) { return; } timer = window.setInterval(function() { /* * Run my code... */ },250); isIntervalSet = true; }).mousestop(function() { isIntervalSet = false; window.clearTimeout(timer); timer = null; });