jQuery事件绑定的问题

时间:2010-11-28 20:21:16

标签: javascript jquery javascript-events

     $("#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'时,它是未定义的。如果我因为某种原因将其分配给另一个变量,但是我不想这样做因为它似乎没必要。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

我无法确定,但我相信,因为您的i变量是全球。始终使用global关键字声明不应为var的变量。例如,

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

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

答案 1 :(得分:0)

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