【问题标题】:Temporarily Stop One Function Execution with setTimeOut() when a Button is Clicked单击按钮时使用 setTimeOut() 临时停止一个函数执行
【发布时间】:2017-04-01 00:45:25
【问题描述】:

我有一个由滚动事件触发的动画,它使菜单滑出视图。还有一个按钮,单击该按钮可重新显示菜单。

因为菜单可以通过滚动来关闭,所以当用户点击按钮进入菜单时,如果他们在动画的这段时间内滚动,菜单会再次消失,而动画没有完成。

我在这里整理了一个简化版的动画http://codepen.io/emilychews/pen/evbzMQ

我需要在单击按钮后暂时阻止滚动功能工作,我假设最好使用单击功能上的 setTimeout() 方法来完成?我已经尝试了很多事情,但似乎无法解决它/让它发挥作用。

任何帮助都会很棒。为了快速参考,代码如下

JQUERY

jQuery(document).ready(function($){

    // slide menu to left on scroll
    function hideOnScroll() {
      $(window).scroll(function() {
        if ( $(document).scrollTop() > 1) {

          $('.menubox').css('left', '-25%');

      }

    }); 

  }

  hideOnScroll(); // call hideOnScroll function


  // click handler to bring menu back in
  $('.mybutton').on('click', function() {

      $('.menubox').css('left', '0%');

      var scrollPause = setTimeout(hideOnScroll, 2000)  // temporarily pause hideOnScroll function 

    });

}); //end of jQuery

CSS

body {
 margin: 0;
 padding: 0;
 height: 200vh;}

.menubox {
  top: 100;
  position: fixed;
  width: 20%;
  height: 100%;
  background: red;
  padding: 10px;
  color: white;
  transition: all 2s;
}

.mybutton {
  position: fixed;
  left: 40%;
  top: 50px;
  padding: 5px 10px; 
}

HTML

<div class="menubox">Menu Box</div>

<button class="mybutton">Click to bring back menu</button>

** 另外请注意,为了论坛,我已经简化了动画,实际的动画函数包含 Greensock 代码,但我不想包含这个,以免混淆问题。因此,我不能只使用 .addClass() 和 .removeClass() 或有一种解决方法来更改给定的 CSS 或 scrollTop() 值。在单击调用动画的持续时间内单击按钮时,我需要禁用 hideOnScroll() 函数 - 在示例中为 2 秒。因此,我认为实现这一点的唯一方法是使用 setTimeOut() 方法(我可能错了)。但我无法让它工作。

非常感谢

艾米丽

【问题讨论】:

  • 我遇到了你的问题..我实现了它并尝试自己解决它..我认为你没有尝试使用 css 中默认转换属性的 -webkit-transition 和 -moz-transition。 ..如果你使用它,那么它肯定会完成它的动画,而不管任何其他动作。
  • 嗨,Tirthraj,这不是我要解决的问题。我放了一个基本动画来说明我需要做什么。我想要发生的是当单击按钮以将菜单带回 hideOnScroll() 函数时设置为 false 2000 毫秒。我已经更新了 CSS,所以动画可以在旧版浏览器上显示,非常感谢。
  • 我在发布该评论后理解了您的问题.. 解决了一段时间.. 我仍在努力.. 很快就会分享解决方案..!

标签: javascript jquery function settimeout


【解决方案1】:

您可以简单地检查偏移是否完整。

function hideOnScroll() {
  $(window).scroll(function() {
    if ( $(document).scrollTop() > 1) {        
     if( $('.menubox').offset().left == 0 ){
        $('.menubox').css('left', '-25%');          
      }   
   });
 }

http://codepen.io/anon/pen/aJXGbr

【讨论】:

  • 您好,Weijian,我在上面注释中的代码之后确实说过,我无法找到改变 CSS 或动画值本身的解决方案。我需要一个解决方案,从点击功能中禁用/暂停实际的滚动功能。实际的动画要复杂得多,并使用 Greensock。我只需要了解如何在单击第二个功能时暂停/暂时禁用一个功能。
  • 我没有更改 CSS。我只检查 css 位置。
  • 这确实适用于 Greensock,因为 .offset() 使用页面上的实际坐标。我认为它仅适用于“左”和“右”属性等,因此不适用于变换(或特别是 transformX)。 Weijjan 我欠你一个巨大的道歉,并将你的答案标记为正确
【解决方案2】:

我对您的javascript 进行了一些更改。看看

var animating = false;
    $(document).ready(function(){
        function hideOnScroll() {
            $(window).scroll(function() {
                event.preventDefault();
                if ( $(document).scrollTop() > 1 && !animating){
                    console.log("Hiding")
                    animating = true;
                    $('.menubox').animate({'left': '-25%'},2000,function(){
                        animating = false;
                    });
                }
            });
        }

        hideOnScroll();

        $('.mybutton').click(function() {
            var pos = $(window).scrollTop();
            animating = true;
            $('.menubox').animate({'left':'0%'},2000,function(){
                console.log("Finished Opening");
                animating = false;
            });
            console.log("Animating Open");
            var siId = setInterval(function(){
                if(animating){
                    console.log("Preventing Window Scrolling.");
                    $(window).scrollTop(pos);
                }
                else{
                    console.log("Stopping setInterval");
                    animating = false;
                    clearInterval(siId);
                }
            },0);
        });

    });

这将使您的浏览器窗口停止滚动,直到您的菜单打开动画完成。

我还从样式中删除了transitionproperty。

在谷歌浏览器中测试。

如果我误解了您的问题,请告诉我。

【讨论】:

  • 不,这不是我需要的。我需要在 click 函数中声明,所以当单击按钮时,在此动画期间基本上禁用 hideOnScroll 函数,因此如果有人在菜单滑出屏幕时意外滚动,它不会在中途滑回它从屏幕上退出。我无法通过更改 CSS 或滚动顶部定位来解决此问题,它必须由 setTimeout() (或类似)控制,实际上在按钮后的菜单滑出动画期间禁用 hideOnScroll() 函数被点击。感谢您的尝试。
  • 我还编辑了问题底部的注释,这可能会更清楚。我可能需要在没有任何动画代码的情况下发布一个不同的问题,并且只在每个代码块中显示两个带有“代码在此处”的函数,以防止混淆。
  • 那么是否可以使用全局布尔变量来完成,该变量可以在 buttonClick 函数中设置为 true 或 false,并且可以在 hideOnScroll() 函数中检查其是否动画?
  • 这就是我的想法并一直在尝试。如果我可以将 hideOnScroll() 函数全局设置为 true,然后在 setTimeOut() 中的 click 函数中将其设置为 false,我无法弄清楚如何将函数调用设置为 true(我是 Javascript 新手)。我认为它会是这样的: var scrollCall = hideOnScroll();滚动调用=真;然后在点击函数中有 setTimeOut(scrollCall = false, 2000);但这不起作用
  • 好吧.. window javascript 中的对象是你的实际浏览器窗口。此外,javascript 在流程中是完全异步的。所以 hideOnScroll 函数有一个 $(window).scroll() 再次具有一个函数,你有一个 if 条件来检查 scrollTop 是否 > 1 .. 这很完美.. 只需在 if 条件中添加全局变量 animating == false ..
猜你喜欢
  • 1970-01-01
  • 2022-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-25
  • 1970-01-01
  • 1970-01-01
  • 2022-08-13
相关资源
最近更新 更多