jQuery事件绑定问题

cpjpxq1n  于 2022-12-18  发布在  jQuery
关注(0)|答案(2)|浏览(135)
$("#canvas").mousedown(function(e) {
  for(i=0; i<allPoints[0].length; i++) {
   var pointX = controlPoint[i].x;
   var pointY = controlPoint[i].y;
   var mouseX = e.pageX - this.offsetLeft;
   var mouseY = e.pageY - this.offsetTop;
   if(pointX + 5 > mouseX && pointX - 5 < mouseX && pointY + 5 > mouseY && pointY - 5 < mouseY) {
    var testest = i;
    $(this).bind('mousemove', function(e) {
    //'i' is undefined here
    //'testest' is defined
     controlPoint[testest].x = e.pageX - this.offsetLeft;
     controlPoint[testest].y = e.pageY - this.offsetTop;
    });
   }
  }
 }).mouseup(function(e){
  $(this).unbind('mousemove');
 });

由于某种原因,当我尝试使用mousemove函数中for循环的变量'i'时,它是未定义的。如果我将它赋给另一个变量,那么由于某种原因,它将工作,但我不想这样做,因为它似乎是不必要的。任何帮助都将非常感谢。

ru9i0ody

ru9i0ody1#

我不能确定,但我相信它是,因为你的i变量是 global。总是用var关键字声明一个不应该是global的变量。例如,

for(var i=0; i<allPoints[0].length; i++) {

我认为你的应用程序在其他地方修改了变量i,这就是为什么把它赋给另一个变量似乎可以解决你的问题的原因。这里真实的的解决方案是使用一个带有var关键字的 local 变量。

czq61nw1

czq61nw12#

i未定义的事实非常奇怪。发生这种情况的唯一方式是在代码的其他地方将其设置为undefined。如果全局变量i从未在其他地方使用过,则i的值将始终等于'mousemove'回调函数中的allPoints[0].length,因为您正在创建一个围绕i变量的闭包。在mousedown回调结束时,将其设置为allPoints[0].length。另外,请注意,testest将被提升到mousedown回调的顶部,因此mousemove回调中的testest值将始终是mousemove回调中设置的最后一个值。

相关问题