js问题,为什么我下面的代码只能让方框移动一次?

<!DOCTYPE html>
<html lang="en">
<head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Document</title>
      <style>
            #box{width: 200px;height: 200px;background-color: red;position: absolute;}
      </style>
      <script>
            window.onload = function(){
                  var Div = document.getElementById("box");
                  Div.onmousedown = function(ev){
                        var e = ev || window.event;
                         offsetX = e.clientX - Div.offsetLeft;
                         offsetY = e.clientY - Div.offsetTop;
                        
                  }
                  document.onmousemove = function(ev){
                        var e = ev || window.event;
                        Div.style.left = e.clientX - offsetX + "px";
                        Div.style.top = e.clientY - offsetY + "px";
                  }
                  
                        Div.onmouseup = function(e){
                        document.onmousemove = null;
                  }
            }
      </script>
</head>
<body>
      <div id="box"></div>
</body>
</html>

我知道把

document.onmousemove = function(ev){

                        var e = ev || window.event;

                        Div.style.left = e.clientX - offsetX + "px";

                        Div.style.top = e.clientY - offsetY + "px";

                  }

这段代码放到Div.onmousedown = function(ev)里面就对了,

但是为什么我这样写是错的?

你给box元素添加了鼠标‘按下’和‘松开’两个事件,给document添加了鼠标移动事件。

document的鼠标滑动事件是用来操纵box元素位置。

box元素的按钮‘松开’事件是用来清除document的鼠标滑事件。

当你这样写的时候,当鼠标按钮‘松开’事件触发,就清除了document的鼠标滑事件,box元素就无法移动。

但是当你把document.onmousemove = function(ev)放在 Div.onmousedown = function(ev)函数里面就可以重复移动,是因为当你触发鼠标‘按下’事件后,会给document.onmousemove重新赋方法,然后在鼠标滑动时box元素会动,当鼠标松开后,清除document.onmousemove。当你再次触发鼠标‘按下’事件后,又会给document.onmousemove重新赋方法,所以可以重复移动。

document.onmousemove = null;  因为这句话 

因为你在onmouseup的时候把绑定事件移除了,所以必须重新绑定事件!