【发布时间】:2010-11-15 06:56:15
【问题描述】:
目标
我想将事件处理程序动态分配给整个站点页面上的某些 div。
我的方法
我正在使用 jQuery 将匿名函数绑定为选定 div 事件的处理程序。
问题
代码迭代了一个 div 名称和相关 url 的数组。 div 名称用于设置绑定目标,即将此事件处理程序附加到此 div 事件。
虽然事件处理程序已成功绑定到每个 div 事件,但由这些事件处理程序触发的操作只针对数组中的最后一项。
所以这个想法是,如果用户将鼠标悬停在给定的 div 上,它应该为该 div 运行滑出动画。但是,将鼠标悬停在 div1 (rangeTabAll) 上会触发 div4 (rangeTabThm) 的滑出动画。 div 2、3 等也是如此。顺序并不重要。更改数组元素,事件将始终以数组中的最后一个元素 div4 为目标。
我的代码 - (使用 jQuery)
var curTab, curDiv;
var inlineRangeNavUrls=[['rangeTabAll','range_all.html'],['rangeTabRem','range_remedial.html'],
['rangeTabGym','range_gym.html'],['rangeTabThm','range_thermal.html']];
for (var i=0;i<inlineRangeNavUrls.length;i++)
{
curTab=(inlineRangeNavUrls[i][0]).toString();
curDiv='#' + curTab;
if ($(curDiv).length)
{
$(curDiv).bind("mouseover", function(){showHideRangeSlidingTabs(curTab, true);} );
$(curDiv).bind("mouseout", function(){showHideRangeSlidingTabs(curTab, false);} );
}
}
我的理论
我要么没有看到明显的语法错误,要么没有看到引用传递问题。 最初我有以下语句来设置 curTab 的值:
curTab=inlineRangeNavUrls[i][0];
所以当问题发生时,我认为当我更改(通过 for 循环迭代)对 curTab 的引用时,我实际上 正在更改所有以前的匿名函数事件处理程序对新 curTab 的引用价值以及......这就是为什么事件处理程序总是以最后一个 div 为目标。
所以我真正需要做的是将 curTab value 传递给匿名函数事件处理程序,而不是 curTab object 引用。
所以我想:
curTab=(inlineRangeNavUrls[i][0]).toString();
可以解决问题,但不能。同样的交易。所以很明显我错过了一些关于这个问题的关键知识,而且可能是非常基本的知识。谢谢。
【问题讨论】:
-
JavaScript 总是按值传递和分配。您的问题根本不涉及通过;而是通过闭包捕获变量。
标签: javascript closures pass-by-reference anonymous-function pass-by-value