【问题标题】:How do I make a JS function only run once per spam of calls如何让 JS 函数在每次垃圾邮件调用时只运行一次
【发布时间】:2019-02-04 17:10:38
【问题描述】:

我一直在尝试在 jQuery 中创建一个函数,让 div 在向下滚动时比页面的其余部分更快地向上移动,并让它在相反的方向上做同样的事情。

有效,但有 1.5 秒的冷却时间以避免来自$(window).scroll(function() 的垃圾邮件。因此,人们在加入网站时必须等待 1.5 秒才能正常工作,然后每次必须等待 1.5 秒上下滚动才能看到效果完美。

我将如何解决这个延迟?为了获得良好的用户体验,应该没有延迟。 (转换函数来自库,这里没有错。)

var $intervalReady = false;
setInterval(function(){if($intervalReady==false){
    $intervalReady = true;
}}, 1500);

$( document ).ready(function() {
    var $elementBeginPos = $('#headertext').position();
    $(window).scroll(function(){
      var top = $(this).scrollTop();
      if(top > 60 && $intervalReady==true){
        $('#headertext').transition({y:'30%'});
        $intervalReady = false;
      }
      else if(top < 60 && $intervalReady==true){
        $('#headertext').transition({y:'-30%'});
        $intervalReady = false;
      }
    });
});

【问题讨论】:

  • 如果您不反对使用第 3 方库,请查看lodash throttle
  • @apokryfos 谢谢你。你会认为 jQuery 或 JS 会支持这一点,但不是。不过,我仍然想看看是否有人有非图书馆的答案。
  • 好吧,非库答案与您正在做的事情类似,但在 1500 毫秒开始时会以某种方式限制函数的执行,因此您从 $intervalReady=true 开始,所以一开始您立即执行

标签: javascript jquery


【解决方案1】:

这是一个工作示例:https://jsfiddle.net/37khp0ft/ 根据您的需要进行调整。

一般来说,在定时器事件上更新状态,而不是在滚动事件上。

JS部分:

function updatePos(selector, multiplier)
{
   var scrollPos = $(document).scrollTop(); 
   $(selector).css({top: scrollPos * multiplier});
}
$(document).ready(function()
{
   setInterval(updatePos, 100,'#div', -1.1 );
});

【讨论】:

  • 这真的很有帮助,谢谢。我觉得你的方法真的很好很简单。每个人都应该使用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-03
  • 2013-08-01
  • 2015-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
相关资源
最近更新 更多