如何在表行和映射点之间的循环中切换类
How do I toggle a class within a loop between a table row and map points?
表中有10行,其中包含地图上每个标记的地址。我试图添加一个点击事件到地图上的每个标签到它对应的表行。而不是单独编写每个点击事件,我试图通过一个for循环。最好的方法是什么?下面的for循环只适用于最后一次迭代,但并不适用于所有迭代。
for (var i=0; i < 10; i++) {
var maptag = "#maptag";
var maprow = "#maprow";
$(maptag + +i).click(function() {
console.log('in the hole!');
$(maprow + +i).toggleClass('highlight');
return false;
});
你可能需要一个闭包
for (var i = 0; i < 10; i++) {
var maptag = "#maptag";
var maprow = "#maprow";
(function(x) { // IIFE
$(maptag + +x).click(function() {
console.log('in the hole!');
$(maprow + +x).toggleClass('highlight');
return false;
})
}(i))
}
你的问题是范围。当你创建click
事件时,i
是循环中的当前值。然而,当click
甚至被触发时,i
被设置为它在循环结束时的状态(即,您的最后一个)。
你需要做的是把它包装在一个函数中来影响作用域。像这样:
for (var i=0; i < 10; i++) {
var maptag = "#maptag";
var maprow = "#maprow";
$(maptag + i).click((function (i) { return function() {
console.log('in the hole!');
$(maprow + i).toggleClass('highlight');
})(i));
}
这看起来有点奇怪,但你所做的是将实际触发另一个函数的函数包装起来,这个函数是自我调用的:
(function (i) {
// will trigger immediately
}(i);
您在那里传递i
,但随后返回的函数内部使用i
,这实际上是一个不同的变量。当循环改变时,内部的i
不会改变,所以当click
实际被触发时,它的值将是您所期望的。
注:我以前从未见过variableName + +i
。不确定这是一个打字错误,还是一些我不知道的特殊语法,但如果是,在这里似乎没有必要。您的return false
也是不必要的,因为没有它,它将隐式返回null
,这也是一个假值(除非您显式检查false
某处与===
)。
相关文章:
- 定时循环,使用Javascript在2个循环之间间隔x秒
- Javascript”;对于循环“;i-5和i=-5之间的差异
- 在不同数据选项之间循环迭代对象
- jquery .each 循环来执行每个数组项,它们之间有延迟
- 第一个元素和最后一个元素之间的连续循环
- 在帖子的网格循环之间插入Javascript(Adsense)
- foreach循环每次迭代之间的延迟
- 我如何向这个脚本添加一个点击按钮循环URL函数(按给定顺序在URL之间切换),或者这可能吗
- 在javascript for循环的迭代之间应用延迟
- 如何在数组中循环,等待每个项目之间的时间
- JavaScript中的嵌入循环和嵌套循环之间有区别吗
- 循环字符串以查找字符集之间的文本
- JavaScript 中 for 循环和 for-in 循环之间的区别
- [0]和getElementsByClassName上所有循环之间的中间地带
- Chrome浏览器事件循环与节点事件循环之间是否存在显著差异
- 这两个 for 循环之间的区别
- 如何添加在animate.css中编码的css动画循环之间的间隔
- 如何使jQuery的每个循环之间的延迟.每个函数
- 为什么复杂循环和多循环之间会有如此巨大的性能差异?
- 谁能解释一下这两个循环之间的区别