如何在同一事件Javascript中监听点击事件

时间:2018-12-02 06:32:18

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

我想要的是让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;
    }
});

1 个答案:

答案 0 :(得分: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函数,但是如果您第二次单击控制台后又查看了控制台,您会发现自己正在使用{{1 }}错误的方式-通过调用新函数,您正在更改作用域,并且该break语句试图脱离该函数(您不能这样做,您必须使用{{ 1}},而不是循环。为同一事件设置两个处理程序也不是一个好主意。那是一种容易使计算机混乱的事情。 :)

也许值得指出的是,break可能无法按照您的想法工作。它的实际操作(如果您查看代码段的控制台,您会看到这一点)正在为div填充动画队列。该循环运行十次(出于理智起见,我将其更改为十),生成一个随机数,然后将其放入div可以通过的位置列表中,所有这些操作都在几毫秒内完成。您可以这样想:return,但是这里要注意的重要一点是,您永远不要在for loop结束之前单击该div。

继续阅读$("#div3").animate().animate().animate() ... etc here