2个数字相互减去一个NaN?

时间:2017-09-29 18:43:45

标签: javascript nan

我试图从彼此中减去2个整数,但我不断得到NaN。 任何人都可以解释我的代码有什么问题

var moveit = null;
p = function (e){

if ((e.target.id == "windowContainer") || (e.target.id == 
"windowContainer2") || (e.target.id == "windowContainer3")){
    console.log (e);
    window.moveit = e.target;
    window.onmousemove = p2;
    var r = window.moveit.getBoundingClientRect();
    var rl = r.left;
    var rt = r.top;

    window.onmouseup = function (e){
    if (window.moveit == null) return;
        window.moveit.onmousemove = window.moveit = null;
    }
}
}

p2 = function (e, rt, epageY){  
    if (window.moveit == null) return;
    var newY = rt - e.pageY;
    console.log(isNaN(newY));
}
document.getElementById('windowContainer').onmousedown = p;
document.getElementById('windowContainer2').onmousedown = p;
document.getElementById('windowContainer3').onmousedown = p;

2 个答案:

答案 0 :(得分:0)

onmousemove / down函数只将一个参数传递给它们的处理程序 - 一个Event对象。在这种情况下,ep2中唯一定义的参数。像这样自己调用函数来测试它是否正常工作:

p2({pageY: 100}, 50)

将记录false

答案 1 :(得分:0)

rt不是值,这会导致您的问题。您需要将其传递到onmousemove事件

var moveit = null;
p = function(e) {
  if (
    e.target.id == "windowContainer" ||
    e.target.id == "windowContainer2" ||
    e.target.id == "windowContainer3"
  ) {
    console.log(e);
    window.moveit = e.target;
    var r = window.moveit.getBoundingClientRect();
    var rl = r.left;
    var rt = r.top;
    window.addEventListener("mousemove", function(e) {
      p2(e, rt);
    });
    window.onmouseup = function(e) {
      if (window.moveit == null) return;
      window.moveit.onmousemove = window.moveit = null;
    };
  }
};

p2 = function(e, rt, epageY) {
  if (window.moveit == null) return;
  var newY = rt - e.pageY;
  console.log(newY);
};
document.getElementById("windowContainer").onmousedown = p;
document.getElementById('windowContainer2').onmousedown = p;
document.getElementById('windowContainer3').onmousedown = p;

这段代码可以正常运行。以下是我更改的内容列表:

  1. 我添加了addEventListener而不是.onmousemove,我认为这是更好的编码风格,但你可以按照自己的意愿行事(性能差异最小到没有)。

  2. 在mousemove事件中,我创建了一个匿名函数,以便您可以从上面计算的值传入rt。