【问题标题】:jQuery animate finished functionjQuery动画完成功能
【发布时间】:2015-10-09 08:50:12
【问题描述】:

我正在尝试制作全屏部分滚动页面。我已经能够阻止默认用户滚动。现在,要替换它,我使用以下代码:

var isAutoScrolling = false;
$(window).off('scroll.fullscreen');
$(window).on('scroll.fullscreen', function () {
    if (isAutoScrolling === false) {
        isAutoScrolling = true;
        $('html, body').animate({
            scrollTop: $(nextDiv).offset().top
        }, '400', 'linear', function () {
            console.log('animated');
            isAutoScrolling = false;
        });
    }
});

不幸的是,console.log 每次滚动都会写入 'animated' 2 次。这怎么可能?上面的代码至少应该在 2 个 console.logs 之间中断 400 毫秒,对吧?有人发现这个错误吗?

【问题讨论】:

  • 缺少)on()
  • 你能分享一个演示来重现这种行为吗?
  • @A.Wolff 有趣。你有我的赞成票。 :)

标签: jquery scroll jquery-animate


【解决方案1】:

问题来自 you are 两个元素 html、body 上的绑定事件。一些 然后浏览器会触发它两次(其他一些只有其中之一 元素可滚动,所以只触发一次)。

您可以使用promise接口和相关方法跨浏览器对其进行规范化。

$(window).on('scroll.fullscreen', function () {
    if (isAutoScrolling === false) {
        isAutoScrolling = true;
        $('html, body').animate({
            scrollTop: $(nextDiv).offset().top
        }, '400', 'linear').promise().done(function () {
            console.log('animated');
            isAutoScrolling = false;
        });
    }
});

也就是说,我想你可以使用 :animated 伪选择器,而不是使用标志:

$(window).on('scroll.fullscreen', function () {
     $('html, body').filter(':not(:animated)').animate({
         scrollTop: $(nextDiv).offset().top
     }, '400', 'linear').promise().done(function () {
         console.log('animated');
     });
 });

(见下面@Ionică Bizău 的评论)

【讨论】:

  • 从性能的角度来看,每次滚动都不是很糟糕时调用$('html, body').filter(':not(:animated)') 吗?
  • @IonicăBizău 我会说你,这会非常消耗,所以一个标志确实似乎是更好的方法
  • 像魅力一样工作!谢谢。
猜你喜欢
  • 1970-01-01
  • 2013-08-18
  • 2012-12-29
  • 2010-12-18
  • 2018-08-17
  • 2017-07-21
  • 1970-01-01
  • 2016-04-14
  • 2018-08-03
相关资源
最近更新 更多