javascript - 带 Promise 的 jQuery 动画回调仍然触发得太早

标签 javascript jquery animation callback

如果单击菜单中的 Logo ,我会向后滚动主页。我在 $(window).scroll() 上也有一个听众它以负边距将对象动画移出屏幕。

我的问题是该事件由动画触发(animate scrollTop)。

这不应该发生,因为我有一个 bool 变量,它必须为 true 才能执行此操作,我仅在滚动动画之后使用 .promise() 的组合将其设置为 true和.done() .

这是我的 JavaScript:

var firstscroll=true;

$(function(){


    var captionWidth= $(".caption").children().size() * 35;
    $(".caption").width(captionWidth);

    $(window).scroll(function() {
      if(firstscroll){
        $(".hidden-menu").removeClass("hidden-menu", {duration:500});
        $('.header').animate({
            marginTop: $('.header').height() * -1
         }, 500);
         $('html, body').animate({
            scrollTop: 0
         }, 500);
         firstscroll = false;
      }
    });

    $(".menu-logo, .logo-container").click(function(){
        $('.header').animate({
            marginTop: 0
         }, 500);
         $('html, body').animate({
            scrollTop: 0
            }, 500).promise().done(resetFirstScroll());
    });
});

var resetFirstScroll = function() {
  firstscroll=true;
}

解决方案是为该函数指定 setTimeout 50 毫秒,但我宁愿在动画完成后正确执行。

使用标准回调会给出相同的输出:

    $(".menu-logo, .logo-container").click(function(){
        $('.header').animate({
            marginTop: 0
         }, 500);
         $('html, body').animate({
            scrollTop: 0
            }, 500, function() {
                resetFirstScroll();
            });
    });
});

var resetFirstScroll = function() {
  firstscroll=true;
}

最佳答案

对于那些想要“hacky”解决方案的人:

var firstscroll=true;

$(function(){


    var captionWidth= $(".caption").children().size() * 35;
    $(".caption").width(captionWidth);

    $(window).scroll(function() {
      if(firstscroll){
        $(".hidden-menu").removeClass("hidden-menu", {duration:500});
        $('.header').animate({
            marginTop: $('.header').height() * -1
         }, 500);
         $('html, body').animate({
            scrollTop: 0
         }, 500);
         firstscroll = false;
      }
    });

    $(".menu-logo, .logo-container").click(function(){
        $('.header').animate({
            marginTop: 0
         }, 500);
         $('html, body').animate({
            scrollTop: 0
            }, 500, function() {
            setTimeout( resetFirstScroll, 50 );
            });
    });
});

var resetFirstScroll = function() {
  firstscroll=true;
}

关于javascript - 带 Promise 的 jQuery 动画回调仍然触发得太早,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21903418/

相关文章:

jquery - 当输入接收焦点时,使用 jQuery 显示固定的 "ToolTip"

swift - 如何将带有 anchor 的 View 定位到刚刚完成动画的 View ?

android - android 动画总是在 UI 线程中吗?

javascript - 正则表达式 [任意数字]

html - CSS 动画导致一些与高度和填充相关的问题

javascript - jQuery 放大弹出提交按钮

javascript - 下拉菜单键盘响应问题

javascript - 火狐扩展 : Access the DOM Before It's Loaded

javascript - 单击 Backbone 路由器中的链接时如何传递事件(以访问数据属性)

javascript - jQuery if 语句触发两次