我循环遍历一组16个ID并为每个ID分配eventListener
。我想向我的php文件发送一个数字(第一个id为1,第二个为2,等等),但似乎i
比我想要的更动态。每个ID都会发送17
。
klasses.forEach(function(klass){
var svgElement = svgDoc.getElementById(klass); //get the inner element by id
svgElement.addEventListener("mouseup",function(){
$.ajax({
type: "POST",
url: "buildService.php",
data: { "service" : i}
}).done(function(msg){
alert(lameArray[i]);
$("#modalSpan").html(msg);
$("#modmodal").modal();
});
});
i++;
});
如何将每个设置为特定数字?我也试过了:
var lameArray = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16];
...
data: { "service" : lameArray[i]}
答案 0 :(得分:10)
什么是i
?问题是i
是一个全局变量,或者是forEach
周期之外的变量,因此当触发mouseup
事件时,i的值>使用了 istant,而不是定义事件监听器时的那个。
请注意,因为您正在使用forEach
,所以回调函数实际上是使用第二个参数调用的,该参数是计数器。所以你可以使用:
klasses.forEach(function(klass, i) {
...
});
现在,i
是forEach
范围内的变量,可用于您的目的。 (forEach
也使用第三个参数调用回调函数,即集合本身 - 在您的情况下为klasses
。)
注意:既然您正在使用jQuery,那么您应该使用更“类似jQuery”的样式进行编码。所以改变你的代码是这样的:
$.each(klasses, function(i, klass) {
$("#" + klass).mouseup(function(){
$.ajax({
type: "POST",
url: "buildService.php",
data: {service: i + 1}
...
});
});
});
答案 1 :(得分:1)
试试这个:
klasses.forEach(function(klass){
(function(i) {
var svgElement = svgDoc.getElementById(klass); //get the inner element by id
svgElement.addEventListener("mouseup",function(){
$.ajax({
type: "POST",
url: "buildService.php",
data: { "service" : i}
}).done(function(msg){
alert(lameArray[i]);
$("#modalSpan").html(msg);
$("#modmodal").modal();
});
});
})(i);
i++;
});
答案 2 :(得分:1)
当您需要迭代器索引时,请不要使用forEach。并避免使用JQuery的.each。绝大部分时间都是完全不必要的,它会在每次迭代时触发回调函数,因此在IE中速度要慢得多。你可以用while编写一个完美的惰性/紧凑循环。
var outerI = klasses.length;
while(outerI--){
(function(i){
i+=1;//doesn't affect outerI and you wanted 1-length so we add one.
//I would personally just add 1 but it also adds clarity to the example
//crap inside your forEach loop but without the i++
})(outerI)
}
发生了什么:您告诉事件监听器从外部范围引用i。所以无论我在那场比赛中踢的是什么,都是你得到的。
解决方案:将i的值传递到函数的范围,使其成为局部变量。与parens的业务只是一种懒惰的方式来定义,评估和执行匿名功能似乎只是一步。该函数通过第一个parens进行评估(使其可以触发),因此第二个集合就像你放入函数定义的内部'i'参数中的arg。你通过将它传递给一个新的局部变量来锁定你想要的值。
关于while循环的注意事项:while(0)计算为false,停止循环。如果你考虑它,这很奇怪,因为长度为1比你想要的长1。随着while(i--)然而我被评估,然后我减少所以在块内你得到长度-1到0这是完美的数组符号。要在其他运算符命中之前递减i,你通常会做--i但它在懒惰/高效的while循环中很方便。