【问题标题】:Disable keydown during animation在动画期间禁用 keydown
【发布时间】:2020-05-10 21:38:15
【问题描述】:

我正在使用以下代码使用户能够使用向上和向下箭头键显示或隐藏照片描述 (#photoinfo) 和菜单 (.slidetable)。如果这两个 div 中的一个已经打开,则在打开另一个之前按相反的箭头会关闭该 div。

$(document).unbind('keypress');
$(document).keydown(function(event) {
    switch (event.keyCode) {
    case 38:
        if ($('#photoinfo').is(".open")) {
            closeInfo();
        }
        else if ($('.slidetable').is(".open")) {
            closeSlide2();
            openInfo();
        }
        else {
            openInfo();
        }
        break;
    case 40:
        if ($('.slidetable').is(".open")) {
            closeSlide();
        }
        else if ($('#photoinfo').is(".open")) {
            closeInfo();
            openSlide();
        }
        else {
            openSlide();
        }
        break;
    }
    return false;
});​

它似乎有效,唯一的问题是如果同时按下两个箭头,或者一个接一个,两个 div 打开,相互重叠。我正在寻找一种在第一个动画启动后基本上取消绑定keydown 函数的方法,并在它完成后重新绑定keydown 函数。我是 jQuery 新手,所以也许这不是最好的方法。在动画期间防止其他功能触发的最简单方法是什么?

【问题讨论】:

    标签: jquery binding callback keydown jquery-events


    【解决方案1】:

    您可以在触发动画之前将布尔值 (isAnimating) 设置为 true,并在动画完成后将其设置为 false。在 keydown 的顶部只需说

    if(isAnimating)
    {
      event.preventDefault();
      return false;
    }
    

    我不记得在动画结束时调用函数的语法,但它在 jQuery 的文档中

    【讨论】:

    • $(this).animate({options}, 持续时间, 回调);
    • 很遗憾我不记得了
    【解决方案2】:

    对不起,我有点困惑。你的答案的实现会是这样吗,还是我很遥远?

    $(document).unbind('keypress'); 
    $(document).keydown(function(event) {
                if(isAnimating)
                {
                  event.preventDefault();
                  return false;
                }
    
                switch (event.keyCode) {
    
                    case 38: var isAnimating = true; 
    
                            if ($('#photoinfo').is(".open")) {
                                closeInfo();
    
                            }
    
                            else if ($('.slidetable').is(".open")) {
                                closeSlide2();
                                openInfo();
    
                            }
    
                            else {
                                openInfo();
    
    
                            } break;
    
    
                    case 40: var isAnimating = true;
                            if ($('.slidetable').is(".open")) {
                                  closeSlide();
    
                            }
    
                            else if ($('#photoinfo').is(".open")) {
                                closeInfo();
                                openSlide();
    
                            }
    
                            else {
                                openSlide();
    
                            } break;    
    
                }
                var isAnimating = false;                                
                return false;
    }); 
    

    【讨论】:

    • 一般但 isAnimating 应该是全局的。当这些动画完成时,您必须在动画函数 openSlide/closeSlide 内将其重置为 false。这个想法是在制作动画时,没有其他东西可以制作动画,一旦当前动画完成,它就允许其他动画开始。有点像锁。
    • 我正在尝试一切,却一无所获。你是说我会放 if(isAnimating) { event.preventDefault();返回假; } 在 $(document).ready 函数中以使其全局化?当我自己执行此步骤时,页面已经锁定并且不会让任何点击或按键功能起作用。我该怎么办?
    猜你喜欢
    • 1970-01-01
    • 2015-08-04
    • 1970-01-01
    • 2018-03-19
    • 1970-01-01
    • 2012-08-31
    • 1970-01-01
    • 1970-01-01
    • 2011-05-21
    相关资源
    最近更新 更多