2

我的代码有问题,该title属性仅显示16而不是显示从1through的所有值15。为什么会这样,任何人都可以建议我做错了什么???

我的代码

 x=1;
 while(x <= 15)
 {
     $("td#id"+x).mouseover(function(x){
     $(this).attr('title', x)           
   });
   x++;
}
4

2 回答 2

9

这是非常常见的“在回调中使用循环变量”问题。

当您使用 jQuery 时,最简单的修复是data处理程序的参数:

 var x=1;
 while (x <= 15) {
     $("td#id"+x).mouseover({ x: x }, function(ev) {
         this.title = ev.data.x;        
     });
     x++;
 }

也就是说,你为什么只在一个mouseover函数中设置它?标题应该直接添加到元素中,只需一次:

for (var x = 1; x <= 15; ++x) {
    document.getElementById('id' + x).title = x;
}

mouseover处理程序中执行此操作实际上不会破坏任何内容,但这意味着您已经注册了一个事件处理程序,每次您从一个单元格移动到另一个单元格时都会一遍又一遍地调用(并更新 DOM)。

于 2012-06-01T18:13:22.307 回答
1

您作为事件处理程序提供给 jquery 的函数保留了一个指向定义它的外部块及其(活动)变量的指针。这就是闭包的工作原理。

所以当它被执行时,x 是 15。

我知道大多数 javascript 开发人员不知道它是如何工作的,但这是一件非常有趣的事情:http: //jibbering.com/faq/notes/closures/

编辑:我不会在这里添加我打算添加的通常修复,因为 Alnitak 在我面前指出,回调实际上在这种情况下完全没用;)

于 2012-06-01T18:13:17.930 回答