【问题标题】:How to listen for click event inside same event Javascript如何在同一事件Javascript中侦听点击事件
【发布时间】:2019-05-03 19:35:11
【问题描述】:

我想要的是让 div 元素四处移动,直到再次单击它,然后它应该停在当前位置。是否有特定的方法来监听事件中的同一事件?移动 div 不是问题。我只是不知道如何让它停止。谁能向我解释为什么我所拥有的东西不起作用?

var clickTracker = false;

$("#div3").click(function() {
     if(clickTracker === false){
        var width = $(window).width();
        var height = $(window).height();
        for(var i = 0; i < 1000; i++){
            const randomLeft = Math.floor(Math.random() * (width - 200))-1;
            const randomHeight = Math.floor(Math.random() * (height - 200))-1;
            $("#div3").animate({left: '+='+randomLeft}, 500).animate({top: '+='+randomHeight}, 500);                            
            $("#div3").click(function() {
                clickTracker = true;
                break;
            });         
        }
    }
    else{
        clickTracker = false;
    }
});

【问题讨论】:

  • 你没有试图在任何地方停止动画。
  • 但是不应该跳出循环停止动画吗?我认为问题出在这个块上,它永远不会打破循环,因此动画永远不会结束。 $("#div3").click(function() { clickTracker = true; break; });

标签: javascript events event-handling click jquery-animate


【解决方案1】:

var clickTracker = false;

$("#div3").click(function() {
  if (clickTracker === false) {
    clickTracker = true;
    var width = $(window).width();
    var height = $(window).height();

    for (var i = 0; i < 10; i++) {
      const randomLeft = Math.floor(Math.random() * ((width - currentPos.left) - 200)) - 1;
      const randomHeight = Math.floor(Math.random() * ((height - currentPos.top) - 200)) - 1;

      console.log("putting stuff in animation queue");
      $("#div3").animate({
        left: '+=' + randomLeft
      }, 5000).animate({
        top: '+=' + randomHeight
      }, 5000);
    }
  } else {
    clickTracker = false;
    $("#div3").stop(true);
  }
});
#div3 {
  width: 100px;
  height: 100px;
  background: black;
  position: absolute;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="div3"></div>

我理解为什么您首先想到的是在 for-loop 中调用 click 函数,但如果您在第二次点击后查看控制台,您会发现您使用了错误的 break方式 - 通过调用一个新函数,您正在更改范围,并且 break 语句试图打破该函数(您不能这样做,您必须为此使用 return)而不是循环。为同一个事件设置两个处理程序也不是一个好主意。这就是容易混淆计算机的东西。 :)

还可能值得指出的是,for loop 可能无法按照您认为的方式工作。它实际上在做什么(如果您查看 sn-p 的控制台,您可以看到这一点)正在为 div 填充动画队列。该循环运行十次(为了我的理智,我将其更改为十次),生成一个随机数,然后将其放入 div 的位置列表中,所有这些都在几毫秒内完成。你可以把它想象成:$("#div3").animate().animate().animate() ... etc 但这里要注意的重要一点是,在for loop 结束之前,你永远不会点击那个 div。

阅读stop()here

【讨论】:

  • 知道了,感谢您的帮助!
猜你喜欢
  • 2022-11-21
  • 1970-01-01
  • 1970-01-01
  • 2013-11-08
  • 1970-01-01
  • 2017-01-23
  • 1970-01-01
相关资源
最近更新 更多